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

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

(Новая страница: «;{{SpeakerInfo}}: {{Speaker|Евгений Сыромятников}} <blockquote> Доклад являет собой отражение имеющегося у…»)
 
== Thesis ==
=== Out-of-tree modules ===

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

Out-of-tree модули ядра Linux  модули Linux, собранные вне основного
процесса сборки ядра. Это могут быть модули ядра, разрабатываемые независимо
(например, под несовместимой лицензией или имеющие существенные причины,
препятствующие их включению в состав кодовой базы Linux), или же различные
варианты адаптации модуля, включённого в одну версию кодовой базы, для
использования с ядром, собранным на основе другой версии кодовой базы ядра.
Наиболее частым случаем второго варианта является backporting  адаптация
модуля ядра из более новой версии кодовой базы к использованию в более старой
версии. Другим, менее частым, случаем, является адаптация заброшенных и
удалённых staging-драйверов к современным версиям Linux.

=== Разработка ===

В отличие от некоторых других проектов, Linux, начиная с версии 2.6, не пытается
поддерживать стабильность внутренних API. К счастью, подавляющее
большинство изменений API синтаксически несовместимо (изменение количества
аргументов функций, переименование макросов, и т. п.). Это позволяет достаточно
легко, без необходимости инспектировать все изменения в релевантном коде
для всех целевых версий, обнаруживать эти изменения и вносить изменения,
требуемые для обеспечения работоспособности модуля ядра в целевой версии.

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

В заголовках присутствует макроопрделение <tt>LINUX_VERSION_CODE</tt>, содержащее
версию ядра в некоем числовом формате, и макроопределение <tt>KERNEL_VERSION</tt>,
позволяющее конструировать числовое представление для необходимой версии ядра.
Соответственно, можно определять разные варианты реализации в зависимости
от целевой версии ядра.

В случае же ядер, в которых присутствует код, портированный из более свежих
версий mainline-ядра (например, ядра в таких дистрибутивах, как CentOS, SLES,
или Ubuntu), приходится использовать иные методы. Можно, например, полагаться на
различные системы конфигурации сборки или же прибегать к разнообразным приёмам,
которые позволяют использовать одну и ту же кодовую базу для разных версий без
необходимости конфигурации сборки.

=== Пакетирование ===

Правила для обеспечения установки out-of-tree modules в систему могут
варьироваться в различных дистрибутивах.

Большинство дистрибутивов, особенно community-based, предполагают возможность
использования пользователями самостоятельно собранных ядер и не пытаются
предоставить бинарные пакеты всех доступных out-of-tree модулей ядра для всех
доступных в репозитории вариантов ядер. Вместо этого (или в дополнение к
ограниченному набору бинарных пакетов out-of-tree модулей) используется
инфраструктура, обеспечивающая автоматизацию сборки out-of-tree модуля под
используемые на данной вычислительной системе ядра. Среди вариантов
инструментов, обеспечивающих подобную функциональность, можно упомянуть
<tt>dkms</tt> и <tt>akmods</tt>.

==== dkms ====

<tt>dkms</tt><ref>Matt Domsch, Gary Lerhaupt. <i>Dynamic Kernel Module Support: From Theory to Practice</i>
Proceedings of the Linux Symposium, Volume One. July 21st—24th, 2004.
Ottawa, Ontario, Canada. P. 187—202. [https://www.kernel.org/doc/ols/2004/ols2004v1-pages-187-202.pdf]</ref>  инструмент для управления out-of-tree модулями Linux,
разработанный компанией Dell и представленный в 2004 году.

<tt>dkms</tt> отслеживает состояние всех зарегистрированных в рамках него модулей
(зарегистрирован, собран, установлен, и. т. д.) и позволяет управлять ими
(собирать, устанавливать, удалять).

Для описания необходимых операций по сборке out-of-tree модуля используется
конфигурационный файл, являющий собой (как и весь остальной код <tt>dkms</tt>)
скрипт на <tt>bash</tt>, и включающий в себя информацию о модулях, командах сборке
и иную информацию (например, варианты ядра, для которых данный
модуль предполагается возможным к использованию).

Помимо этого, <tt>dkms</tt> обладает следующими возможностями:

*  Создание source или binary tarball. Source tarball может использоваться для сборки модуля на целевой системе, binary tarball может быть 	использован на целевой системе без необходимости сборки модуля.
*  Поддержка создания source/binary пакетов в формате RPM и DEB.
*  Поддержка создания Red Hat Driver Disk и SuSE Kernel Module Package.


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

==== akmods ====

<tt>akmods</tt> ([https://rpmfusion.org/Packaging/KernelModules/Akmods])  Fedora-specific инструмент автоматизации пересборки
пакетов модулей, существующий с 2007 года. Представляет из себя несколько
скриптов на <tt>bash</tt>, автоматизирующих пересборку для конкретных ядер из
source RPM и последующую установку out-of-tree модулей.

С точки зрения пользователя функциональность <tt>akmods</tt> схожа с <tt>dkms</tt>, но
<tt>akmods</tt> ориентирован на использование RPM и предполагает использование
специальным образом написанных spec-файлов, в то время как <tt>dkms</tt> не привязан
к конкретной системе пакетирования (хотя и включает в себя поддержку сборки
DEB или RPM пакетов); создание инфраструктуры <tt>akmods</tt>
обосновывается именно сложностью (для конечного пользователя) и перегруженностью
<tt>dkms</tt> ([https://rpmfusion.org/Packaging/KernelModules/Kmods2#Why_not_simply_use_dkms])




{{LinksSection}}
<!-- <blockquote>[©]</blockquote> -->


<references/>

[[Категория:OSSDEVCONF-2017]]

Версия 19:03, 3 октября 2017

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

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

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


Видео

Презентация

Некоторые аспекты разработки и пакетирования 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]