Upload
it61
View
138
Download
0
Embed Size (px)
Citation preview
Есть следующая проблема
● На сервере есть ряд заготовок● Пользователь выбирает ту, которую хочет положить в
основу своей прошивки● Мы создаем ее копию● Позволяем ему кастомизировать эту копию● Создаем на основе этой копии образ прошивки● Удаляем копию
Модули расширения необходимы для
● оптимизации производительности уже рабочего кода;● создания привязок к существующим библиотекам,
написанным на C/C++;● привлечения низкоуровневых возможностей
операционных систем для решения тех или иных задач.
Первый шаг
Изучение эталонной реализации утилит, которые позволяют использовать различные возможности BTRFS. Утилиты развиваются в рамках проекта btrfs-progs.
Второй шаг (ложный)
Обернуть в модуль расширения функции cmd_subvol_snapshot и cmd_subvol_delete для создания и удаления снапшотов вместе с рядом вспомогательных функций.
Третий шаг (верный, но почему-то обреченный на провал)
● BTRFS поддерживает ioctl-команды; ● Python имеет все необходимые возможности
для выполнения ioctl-команд: модули fcntl и struct.
Для выполнения команды нужно заполнить и передать функции ioctl вспомогательную структуру btrfs_ioctl_vol_args_v2, которая занимает 4 KB. Но модуль fcntl накладывает искусственное ограничение в 1 KB на функцию ioctl.
94. /* ioctl(fd, op, [arg]) */95.96. static PyObject *97. fcntl_ioctl(PyObject *self, PyObject *args)98. {99. #define IOCTL_BUFSZ 1024
<Modules/fcntlmodule.c
Четвертый шаг (самый верный)
Для решения проблемы с ограничением функции ioctl из модуля fcntl, необходимо создать собственную привязку к функции ioctl, лишенную каких бы то ни было ограничений.
Последний шаг
● Функциональность модуля должна предоставляться через создание экземпляра некоего класса.
● Желательно, чтобы объекты класса могли поддерживать протокол контекстного менеджера.