Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017)

Материал из 0x1.tv

Докладчик
Евгений Сыромятников.jpg
Евгений Сыромятников

Доклад являет собой отражение имеющегося у автора опыта разработки, адаптации (backporting) и пакетирования различных модулей ядра Linux для различных дистрибутивов Linux.

В рамках доклада планируется рассмотреть некоторые особенности разработки и адаптации out-of-tree модулей ядра Linux, а также некоторый инструментарий, облегчающий процесс пакетирования данных модулей.

Видео

on youtube

Посмотрели доклад? Понравился? Напишите комментарий! Не согласны? Тем более напишите.

Презентация

Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017).pdf

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])

Примечания и ссылки

  1. 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]
Некоторые аспекты разработки и пакетирования out-of-tree модулей Linux (Евгений Сыромятников, OSSDEVCONF-2017)!.jpg

Plays:97   Comments:0