20
О модулях расширения Python на примере работы с BTRFS Евгений Голышев Backend Meetup

Pythonic way of using BTRFS features

  • Upload
    it61

  • View
    138

  • Download
    0

Embed Size (px)

Citation preview

О модулях расширения Python

на примере работы с BTRFS

Евгений Голышев

Backend Meetup

Есть следующая проблема

● На сервере есть ряд заготовок● Пользователь выбирает ту, которую хочет положить в

основу своей прошивки● Мы создаем ее копию● Позволяем ему кастомизировать эту копию● Создаем на основе этой копии образ прошивки● Удаляем копию

BTRFS помогает нам снизить накладные

расходы на копирование

Модули расширения

Модули расширения необходимы для

● оптимизации производительности уже рабочего кода;● создания привязок к существующим библиотекам,

написанным на C/C++;● привлечения низкоуровневых возможностей

операционных систем для решения тех или иных задач.

Способы создания модулей расширения

● Python C API● ctypes● CFFI● Cython● ...

Способы создания модулей расширения

● Python C API● ctypes● CFFI● Cython● ...

Способы создания модулей расширения

● Python C API● ctypes● CFFI● Cython● ...

Способы создания модулей расширения

● Python C API● ctypes● CFFI● Cython● ...

Способы создания модулей расширения

● Python C API● ctypes● CFFI● Cython● ...

Шаги на пути к созданию модуля расширения для

работы с BTRFS

Первый шаг

Изучение эталонной реализации утилит, которые позволяют использовать различные возможности 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, лишенную каких бы то ни было ограничений.

Последний шаг

● Функциональность модуля должна предоставляться через создание экземпляра некоего класса.

● Желательно, чтобы объекты класса могли поддерживать протокол контекстного менеджера.

Заключение

Спасибо

Евгений Голышев [email protected]