Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017)
Материал из 0x1.tv
- Докладчик
- Евгений Сыромятников
Доклад являет собой отражение имеющегося у автора опыта разработки, адаптации (backporting) и пакетирования различных модулей ядра Linux для различных дистрибутивов Linux.
В рамках доклада планируется рассмотреть некоторые особенности разработки и адаптации out-of-tree модулей ядра Linux, а также некоторый инструментарий, облегчающий процесс пакетирования данных модулей.
Содержание
Видео
Презентация
Thesis
Out-of-tree modules
Linux — монолитное ядро операционной системы, поддерживающее загрузку модулей — кода, который может быть загружен и исполнен (и, зачастую, выгружен) в адресном пространстве ядра в процессе его работы.
Out-of-tree модули ядра Linux — модули Linux, собранные вне основного процесса сборки ядра. Это могут быть модули ядра, разрабатываемые независимо (например, под несовместимой лицензией или имеющие существенные причины, препятствующие их включению в состав кодовой базы Linux), или же различные варианты адаптации модуля, включённого в одну версию кодовой базы, для использования с ядром, собранным на основе другой версии кодовой базы ядра. Наиболее частым случаем второго варианта является backporting — адаптация модуля ядра из более новой версии кодовой базы к использованию в более старой версии. Другим, менее частым, случаем, является адаптация заброшенных и удалённых staging-драйверов к современным версиям Linux.
Разработка
В отличие от некоторых других проектов, Linux, начиная с версии 2.6, не пытается поддерживать стабильность внутренних API. К счастью, подавляющее большинство изменений API синтаксически несовместимо (изменение количества аргументов функций, переименование макросов, и т. п.). Это позволяет достаточно легко, без необходимости инспектировать все изменения в релевантном коде для всех целевых версий, обнаруживать эти изменения и вносить изменения, требуемые для обеспечения работоспособности модуля ядра в целевой версии.
В случае необходимости поддержки широкого диапазона версий Linux (что, например, актуально для модулей ядра, разрабатываемых независимо), ситуация становится несколько интереснее.
В заголовках присутствует макроопрделение LINUX_VERSION_CODE, содержащее версию ядра в некоем числовом формате, и макроопределение KERNEL_VERSION, позволяющее конструировать числовое представление для необходимой версии ядра. Соответственно, можно определять разные варианты реализации в зависимости от целевой версии ядра.
В случае же ядер, в которых присутствует код, портированный из более свежих версий mainline-ядра (например, ядра в таких дистрибутивах, как CentOS, SLES, или Ubuntu), приходится использовать иные методы. Можно, например, полагаться на различные системы конфигурации сборки или же прибегать к разнообразным приёмам, которые позволяют использовать одну и ту же кодовую базу для разных версий без необходимости конфигурации сборки.
Пакетирование
Правила для обеспечения установки out-of-tree modules в систему могут варьироваться в различных дистрибутивах.
Большинство дистрибутивов, особенно community-based, предполагают возможность использования пользователями самостоятельно собранных ядер и не пытаются предоставить бинарные пакеты всех доступных out-of-tree модулей ядра для всех доступных в репозитории вариантов ядер. Вместо этого (или в дополнение к ограниченному набору бинарных пакетов out-of-tree модулей) используется инфраструктура, обеспечивающая автоматизацию сборки out-of-tree модуля под используемые на данной вычислительной системе ядра. Среди вариантов инструментов, обеспечивающих подобную функциональность, можно упомянуть dkms и akmods.
dkms
dkms[1] — инструмент для управления out-of-tree модулями Linux, разработанный компанией Dell и представленный в 2004 году.
dkms отслеживает состояние всех зарегистрированных в рамках него модулей (зарегистрирован, собран, установлен, и. т. д.) и позволяет управлять ими (собирать, устанавливать, удалять).
Для описания необходимых операций по сборке out-of-tree модуля используется конфигурационный файл, являющий собой (как и весь остальной код dkms) скрипт на bash, и включающий в себя информацию о модулях, командах сборке и иную информацию (например, варианты ядра, для которых данный модуль предполагается возможным к использованию).
Помимо этого, dkms обладает следующими возможностями:
- Создание source или binary tarball. Source tarball может использоваться для сборки модуля на целевой системе, binary tarball может быть использован на целевой системе без необходимости сборки модуля.
- Поддержка создания source/binary пакетов в формате RPM и DEB.
- Поддержка создания Red Hat Driver Disk и SuSE Kernel Module Package.
Дистрибутивная интеграция (в тех дистрибутивах, которые её предоставляют)
включает в себя триггеры, выполняющие сборку и установку имеющихся в системе
out-of-tree модулей при установке новых ядер с помощью пакетного менеджера,
и удаление собранных модулей, которые больше не требуются.
akmods
akmods ([2]) — Fedora-specific инструмент автоматизации пересборки пакетов модулей, существующий с 2007 года. Представляет из себя несколько скриптов на bash, автоматизирующих пересборку для конкретных ядер из source RPM и последующую установку out-of-tree модулей.
С точки зрения пользователя функциональность akmods схожа с dkms, но akmods ориентирован на использование RPM и предполагает использование специальным образом написанных spec-файлов, в то время как dkms не привязан к конкретной системе пакетирования (хотя и включает в себя поддержку сборки DEB или RPM пакетов); создание инфраструктуры akmods обосновывается именно сложностью (для конечного пользователя) и перегруженностью dkms ([3])
Примечания и ссылки
- ↑ Matt Domsch, Gary Lerhaupt. Dynamic Kernel Module Support: From Theory to Practice Proceedings of the Linux Symposium, Volume One. July 21st—24th, 2004. Ottawa, Ontario, Canada. P. 187—202. [1]
Plays:35
Comments:0