Что такое Linux dkms

Обновлено: 21.11.2024

В этом руководстве описывается, как добавлять модули ядра с помощью DKMS.

Обзор¶

Некоторые модули ядра включены по умолчанию в ОС Clear Linux*. Чтобы использовать дополнительные модули ядра, которые не являются частью исходного дерева Linux, вам может потребоваться собрать модули ядра вне дерева. Используйте это руководство, чтобы добавить модули ядра с помощью DKMS, или обратитесь к разделу Добавление модулей ядра вручную .

Описание¶

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

DKMS — это платформа, упрощающая сборку и установку модулей ядра. DKMS позволяет Clear Linux OS предоставлять перехватчики, которые автоматически перестраивают модули для новых версий ядра.

Доступность модуля ядра¶

Операционная система Clear Linux поставляется со многими доступными для использования модулями ядра основной ветки разработки. Использование существующего модуля значительно проще в обслуживании и сохраняет проверку подписи ядра ОС Clear Linux. Дополнительную информацию о методах обеспечения безопасности Clear Linux OS см. на странице безопасности ОС.

Прежде чем продолжить, проверьте, доступен ли искомый модуль ядра в ОС Clear Linux, или отправьте запрос на добавление модуля.

Проверьте, доступен ли модуль¶

Вы можете искать имена файлов модулей ядра, которые заканчиваются расширением .ko, с помощью команды поиска swupd, как показано в следующем примере. Дополнительную информацию см. в разделе swupd.

Отправить запрос на добавление модуля¶

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

Отправьте запрос на улучшение в проект Clear Linux OS Distribution Project на GitHub.

Установите DKMS¶

Комплект kernel-native-dkms содержит программу DKMS и заголовочные файлы ядра Linux, которые находятся в каталоге /usr/lib/modules/$(uname -r)/build/include/ и необходимы для компиляции модулей ядра.< /p>

Комплект kernel-native-dkms также:

Добавляет триггер обновления systemd ( /usr/lib/systemd/system/dkms-new-kernel.service ) для автоматического запуска DKMS для перестроения модулей после обновления ядра с помощью swupd update .

Отключает проверку подписи модуля ядра путем добавления параметра командной строки ядра (module.sig_unenforce) из файла /usr/share/kernel/cmdline.d/clr-ignore-mod-sig.conf.

Добавляет уведомление в сообщение дня (MOTD), указывающее, что проверка подписи модуля ядра отключена.

Мы рекомендуем всегда просматривать выходные данные обновления swupd, чтобы убедиться, что модули ядра успешно пересобраны для нового ядра. Это особенно важно для систем, в которых успешная загрузка зависит от модуля ядра.

Установите пакет kernel-native-dkms или kernel-lts-dkms.

Определить, какой вариант ядра работает в ОС Clear Linux. Только ядра native и lts могут создавать и загружать модули ядра вне дерева с помощью DKMS.

Убедитесь, что в имени ядра есть .native или .lts.

Установите пакет DKMS, соответствующий установленному ядру. Используйте kernel-native-dkms для собственного ядра или kernel-lts-dkms для ядра lts.

Обновите загрузчик Clear Linux OS и перезагрузите компьютер, чтобы убедиться, что вы можете запустить новое ядро.

Сборка, установка и загрузка модуля вне дерева¶

Выполните действия, описанные в этом разделе, если вы являетесь отдельным пользователем или тестировщиком и вам нужен внешний модуль ядра, который недоступен в ОС Clear Linux. Для более масштабируемого и настраиваемого подхода мы рекомендуем использовать микшер для предоставления пользовательского ядра и обновлений.

Предпосылки¶

Прежде чем начать, вы должны:

Отключите безопасную загрузку в UEFI/BIOS. Загрузка новых модулей вне дерева изменяет подписи, на которые безопасная загрузка опирается для доверия.

Получите пакет модуля ядра в виде исходного кода или предварительно скомпилированных двоичных файлов.

Получить исходный код модуля ядра¶

Обязательный файл dkms.conf внутри каталога исходного кода модуля ядра информирует DKMS о том, как должен быть скомпилирован модуль ядра.

Модули ядра могут быть упакованы следующим образом:

Исходный код без файла dkms.conf

Исходный код с готовым файлом dkms.conf

Исходный код с готовым файлом dkms.conf и предварительно скомпилированными двоичными файлами модуля

Только предварительно скомпилированные двоичные файлы модулей (без исходного кода)

Из перечисленных выше типов пакетов только предварительно скомпилированные двоичные файлы модулей ядра не будут работать, поскольку Clear Linux OS требует, чтобы модули ядра были собраны с использованием того же исходного дерева ядра, прежде чем их можно будет загрузить. Если вы можете получить исходный код только без файла dkms.conf необходимо вручную создать файл dkms.conf, описанный далее в этом документе.

Загрузите исходный код модуля ядра.

Просмотрите доступные варианты загрузки. Некоторые модули ядра предоставляют отдельные архивы, специально предназначенные для поддержки DKMS.

Просмотрите документацию README, так как в ней часто содержится необходимая информация для создания модуля с поддержкой DKMS.

Сборка модуля ядра с существующим файлом dkms.conf¶

Если специалист по сопровождению модуля ядра упаковал исходный архив с помощью команды dkms mktarball, весь архив можно передать команде dkms ldtarball, которая выполнит многие шаги за вас.

Архив содержит необходимый файл dkms.conf и может содержать каталог dkms_source_tree и каталог dkms_binaries_only.

Выполните команду dkms ldtarball для архива модуля ядра.

dkms ldtarball помещает исходный код модуля ядра в каталог /usr/src/ - / , при необходимости создает его и добавляет модуль в дерево DKMS.

Убедитесь, что модуль ядра обнаружен, проверив вывод команды dkms status.

Установите модуль ядра.

Сборка модуля ядра без существующего файла dkms.conf¶

Если исходный код модуля ядра не содержит файла dkms.conf или команда dkms ldtarball обнаруживает ошибки, необходимо создать файл вручную.

Просмотрите документацию README модуля ядра, чтобы узнать, что должно быть в файле dkms.conf, включая специальные переменные, которые могут потребоваться для успешной сборки.

Вот некоторые дополнительные ресурсы, которые можно использовать для справки:

Страница руководства DKMS (man dkms) показывает подробный синтаксис в разделе DKMS.CONF.

Вики-запись сообщества Ubuntu для пакета Kernel DKMS показывает пример, когда один пакет содержит несколько модулей.

Пример файла dkms.conf в репозитории GitHub* для проекта DKMS.

AUTOINSTALL=yes должен быть установлен в dkms.conf, чтобы модуль автоматически перекомпилировался с обновлениями Clear Linux OS.

В приведенных ниже инструкциях показан общий пример:

Создайте или измените файл dkms.conf внутри извлеченного каталога исходного кода.

В этом примере определяется модуль ядра с именем custom_module версии 1.0.

Скопируйте исходный код модуля ядра в каталог /usr/src/.

должен соответствовать записям в файле dkms.conf.

Добавьте модуль ядра в дерево DKMS, чтобы он отслеживался DKMS.

Создайте модуль ядра с помощью DKMS. Если при сборке возникают ошибки, вам может потребоваться отредактировать файл dkms.conf.

Установите модуль ядра с помощью DKMS.

Загрузить модуль ядра¶

По умолчанию DKMS устанавливает модули «в дереве» в /lib/modules, поэтому для их загрузки можно использовать команду modprobe.

Загрузите установленный модуль с помощью команды modprobe.

Убедитесь, что модуль ядра загружен.

Примеры¶

Необязательно: укажите параметры модуля и псевдонимы¶

Используйте команду modprobe для загрузки модуля и установки параметров.

modprobe может добавлять или удалять более одного модуля из-за взаимозависимости модулей. Вы можете указать, какие параметры использовать с отдельными модулями, используя файлы конфигурации в каталоге /etc/modprobe.d.

Все файлы в каталоге /etc/modprobe.d, которые заканчиваются расширением .conf, указывают параметры модуля, используемые при загрузке. Вы можете использовать файлы .conf для создания удобных псевдонимов для модулей или полностью переопределить обычное поведение загрузки для тех, у кого особые требования.

Узнайте больше о modprobe на странице руководства modprobe.d:

Необязательно: настройте модули ядра для загрузки при загрузке¶

Используйте каталог конфигурации /etc/modules-load.d, чтобы указать модули ядра для автоматической загрузки при загрузке.

Все файлы в каталоге /etc/modules-load.d, которые заканчиваются расширением .conf, содержат список имен модулей или псевдонимов (по одному в строке), которые нужно загрузить при загрузке.

Недавно я видел несколько упоминаний о DKMS, но не совсем понимаю, что он на самом деле делает в моей системе.

Что на самом деле делает DKMS и как его использовать?

1 Ответ 1

Пакет DKMS (Dynamic Kernel Module Support) (http://linux.dell.com/dkms/) обеспечивает поддержку установки дополнительных версий модулей ядра. Пакет компилируется и устанавливается в дерево ядра. Удаление восстанавливает предыдущие модули. По умолчанию установка осуществляется в текущее дерево ядра, но любое дерево ядра можно выбрать с помощью параметров командной строки. Кроме того, DKMS вызывается автоматически при установке новых пакетов образа ядра Ubuntu, поэтому модули, добавленные в DKMS, будут автоматически перенесены в обновления.

Обзор

Использование модуля с DKMS , один из них помещает файлы установки модуля (это может быть исходный код или двоичный файл) в /usr/src/- вместе с файлом конфигурации dkms.conf, который сообщает DKMS, как собрать/настроить модуль и как его зовут.В более сложных сценариях инструкции по условной сборке и исправления могут быть выполнены системой dkms, но, учитывая ваш случай, в этом может не быть необходимости.

Пошаговое руководство

Допустим, вы хотите чтобы установить модуль для вашего модного "Awesome Adaptor". Вам предоставляется tar-архив с исходным кодом awesome-20091211-v1.1.tgz .

С помощью DKMS мы сообщаем DKMS, как это сделать за вас, создавая файл dkms.conf с соответствующими записями. Например, после того как мы распаковали архив:

Внутри dkms.conf мы можем добавить строки:

  1. Команда для сборки модуля (запустите make в каталоге src/).
  2. Команда для очистки исходного дерева (запустите make clean в каталоге src/).
  3. Имя модуля без расширения .o или .ko. На самом деле это может быть массив модулей, если построено несколько модулей, см. man dkms.
  4. Где DKMS может найти встроенный модуль.
  5. Имя и версия DKMS должны быть связаны с модулями.
  6. Чтобы переделать образ initrd после установки модуля.

Вот оно! DKMS теперь добавил наш модуль в свой список модулей для сборки для будущих установок ядра. Чтобы убедиться, что он работает и установить модуль в наше текущее ядро, мы можем поручить dkms собрать и установить модуль:

DKMS или Dynamic Kernel Module Support — это система, позволяющая обновлять отдельные модули ядра без необходимости модификации всего ядра. Это бесплатное программное обеспечение под лицензией GPL v2, написанное командой Dell Linux Engineering Team. Первоначально DKMS был разработан для Dell Computer Corporation для распространения программных исправлений среди клиентов четко определенным образом.

DKMS имеет много преимуществ для сообществ поставщиков услуг Linux, например:

  1. С точки зрения разработчика драйверов, это помогает добавлять драйверы, которых еще нет в базовом ядре. Кроме того, разработчики драйверов, которые должны предоставлять обновленные драйверы устройств для тестирования и общего использования с большим количеством ядер, также получают выгоду. Еще одним преимуществом DKMS является то, что разработчики могут тестировать код своего драйвера на разных машинах. На самом деле это ускоряет процесс разработки драйверов.
  2. С точки зрения системного администратора DKMS упрощает процесс установки обновлений драйверов устройств в активное ядро ​​без внесения в него каких-либо изменений. Следовательно, им не нужно ждать прибытия нового ядра.
  3. Выбранные исправления ошибок или исправления могут быть развернуты между крупными обновлениями.
  4. Новое оборудование, которое требует модификации в одном модуле, может быть легко интегрировано. Опять же, этого можно добиться без полного тестирования новых ядер.

Что мы рассмотрим?

В этом руководстве обсуждаются различные термины, связанные с ядром, и, в частности, что такое DKMS.

Краткий обзор терминологии

Что такое ядро ​​Linux?

Это основная часть ОС Linux. Это основной интерфейс между процессами, работающими в ОС, и ее оборудованием. Он управляет основными функциями, такими как управление памятью, управление процессами, управление ЦП, управление драйверами устройств, а также системные вызовы и управление безопасностью.

Пространство ядра
Ядро фактически скрыто от пользователя и работает в своей собственной области, называемой пространством ядра. Пользователь взаимодействует с ядром с помощью пользовательских приложений, таких как файловый браузер, веб-браузер и т. д. Эти взаимодействия используют специальную программную конструкцию, называемую системным вызовом.

Дерево исходного кода ядра
Содержит весь исходный код ядра и драйверов устройств. Он состоит из множества каталогов и подкаталогов, таких как arch, block, crypto, include, init, lib, usr и т. д.

Модули ядра Linux
Модули ядра Linux в основном представляют собой фрагменты кода. Их можно добавлять и удалять из ядра в соответствии с требованиями. Они могут быть встроенными или загружаемыми. Модуль ядра расширяет функции ядра, не требуя перезагрузки системы. В отличие от микроядер, где добавление новых компонентов в ядро ​​требует настройки и сборки нового ядра, мы можем загружать и выгружать компоненты или модули ОС во время выполнения. Этими модулями являются драйверы устройств, файловые системы и т. д.

После того, как модуль загружен, он подобен фрагменту кода ядра. У него те же привилегии и обязанности, что и у обычного кода ядра.

Определение DKMS

"DKMS — это инфраструктура, в которой исходный код драйвера устройства может находиться вне дерева исходного кода ядра, что упрощает пересборку модулей при обновлении ядра".

Давайте остановимся на вышеизложенном. Система DKMS представляет собой дерево из базового дерева ядра на земле. Он содержит исходный код модуля и скомпилированные двоичные файлы модуля. В результате этой репликации модули не связаны с ядром. (Хотя модули не полностью разделены).

Я впервые столкнулся с концепцией DKMS, когда купил ноутбук HP и установил Ubuntu 18.04 на нем. Все работало нормально, кроме моего Wi-Fi. Мой ноутбук не смог найти какой-либо адаптер Wi-Fi. В Настройках в меню Wi-Fi появилось сообщение «Не найден WiFi-адаптер». Я начал искать форумы в Интернете и обнаружил, что многие люди сталкиваются с той же проблемой. Я нашел много решений, предлагающих установить заголовочные файлы, драйверы и другие пакеты.

Я просто слепо следовал этим руководствам, не зная, что они на самом деле хотели передать. В любом случае, эти руководства помогли мне, и у меня каким-то образом заработал Wi-Fi. Но проблема заключалась в том, что всякий раз, когда я обновлял свою систему Ubuntu, возникала одна и та же проблема, и мне приходилось повторять одни и те же шаги по перекомпиляции скачанных драйверов. Также мне приходится исправлять проблему с низким уровнем сигнала каждый раз после установки драйвера. Я даже установил ОС Windows, и, к моему удивлению, Wi-Fi действительно работал безупречно. Но мне все равно приходится использовать Ubuntu для работы. Поэтому я решил жить с временным патчем, который получил ранее.

DKMS приходит на помощь

Недавнее решение, с которым я только что столкнулся и которое меня не заботило в прошлом, использовало способ DKMS. Вместо использования команды make или make install DKMS выполняет три операции с исходным кодом: добавление, сборка и установка.

Использование DKMS

Для работы DKMS исходный код модуля должен присутствовать в системе, в которой мы собираем модуль, а путь расположения должен быть таким, как '/usr/src/ - /', и помните об этом. это самое первое требование DKMS. Еще одним требованием является файл с именем «dkms.conf», который поможет вам собрать и установить модуль. Кстати говоря, DKMS уже должен быть установлен в системе. Когда все готово, мы можем добавить модуль в дерево DKMS.

Давайте рассмотрим эти шаги, установив демонстрационный модуль 'demo-v0.1.tar.gz' с помощью DKMS. Мы делаем этот образец только для того, чтобы понять, как работает DKMS. После извлечения файла нам нужно cd внутри него:

Теперь создайте файл dkms.conf, содержащий следующие строки:

MAKE="make -C src/ KERNELDIR=/lib/modules/$/build"
CLEAN="make -C $ M=$/$/$/build clean"
BUILT_MODULE_NAME="demo"
BUILT_MODULE_LOCATION="src"
PACKAGE_NAME=demo
PACKAGE_VERSION=0.1
REMAKE_INITRD="yes"
AUTOINSTALL=yes
< /p>

Теперь, когда наш файл dkms.conf готов, мы можем добавить наш демонстрационный модуль следующим образом:

Если мы не укажем ядро, DKMS соберет модуль с текущей версией ядра.

Если все пойдет хорошо, теперь мы можем установить модуль, используя:

Если мы обновим наше ядро ​​или изменим аппаратную архитектуру, модуль необходимо будет снова собрать вручную. С помощью DKMS эта процедура становится ненужной, поскольку DKMS динамически создает эти модули ядра для каждого ядра, присутствующего в системе.

Заключение

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

Об авторе

Али Имран Нагори

Али Имран — технический писатель и энтузиаст Linux, который любит писать о системном администрировании Linux и связанных с ним технологиях. Вы можете связаться с ним в LinkedIn
.

Автоматическая установка модулей ядра Linux с помощью платформы DKMS — это удобный способ распространения драйверов, поддерживаемых вне официального ядра. Однако, хотя DKMS включен во многие популярные дистрибутивы Linux и поддерживает большинство модулей ядра, он не всегда может гарантировать правильную установку стороннего модуля.

В этой статье мы обсудим плюсы и минусы использования DKMS и объясним, в каких случаях это не лучшее решение для установки драйвера Linux. Эта статья будет полезна разработчикам драйверов, которые обсуждают, использовать ли DKMS для распространения своего программного обеспечения.

Команда разработчиков драйверов

Что такое DKMS?

Что такое DKMS? Dynamic Kernel Module Support (DKMS) — это платформа, разработанная Dell для автоматического распространения обновлений модулей ядра среди клиентов. Он упрощает разработку драйверов и администрирование системы, повышая общую стабильность системы.

Эта платформа позволяет разработчикам предоставлять пользователям драйверы, не включенные в официальный выпуск ядра. DKMS также значительно повышает качество исходного кода модуля, поскольку разработчики могут тестировать свои драйверы одновременно на нескольких машинах.

DKMS также имеет преимущества для системных администраторов, поскольку он автоматически устанавливает обновления драйверов устройств для существующей версии ядра без внесения каких-либо изменений в ядро. Таким образом, системным администраторам больше не нужно ждать выхода новой версии ядра.

Имейте в виду, что DKMS — не единственное решение для установки модулей ядра. Существуют также альтернативы DKMS, такие как:

  • AKMOD, решение для Fedora, основанное на инструментах, в том числе GNU Compiler Collection и auto-make.
  • module-assistant (часто сокращенно m-a), инструмент для ручной компиляции модулей ядра

DKMS и AKMOD похожи, так как оба они перестраивают модули для установки нового ядра, в то время как m-a требует выполнения вручную и может собирать модули только для работающего в данный момент ядра. Но это может быть неудобно, например, при установке графического драйвера.

Понимание жизненного цикла DKMS

Давайте подробнее рассмотрим, как работает DKMS. DKMS дублирует дерево модулей вне дерева ядра. Это дерево модулей включает исходный код модуля и его скомпилированные двоичные файлы. При выпуске новой версии ядра или драйвера Linux DKMS использует стандартизированный подход для сбора и сборки исходного кода.

В частности, DKMS — это универсальный инструмент, который может встраивать код драйвера в загружаемые двоичные файлы скомпилированных модулей, а затем устанавливать и удалять эти модули в любом ядре Linux.

Кроме того, платформа предоставляет специальные функции для управления и поддержки модулей в нескольких системах, показывая, какая версия модуля установлена ​​на какой версии ядра.

При рассмотрении вопроса об использовании DKMS необходимо понимать жизненный цикл его модуля. Вот алгоритм работы DKMS и его основные команды для выполнения модуля ядра и управления им.

Как видите, есть специальный набор команд для выполнения основных действий с драйверами Linux.

Вы можете увидеть текущий статус модулей, запустив:

Эта команда показывает имя, версию и состояние каждого модуля ядра. С помощью этой команды вы можете быстро узнать, был ли обновлен драйвер устройства.

Чтобы добавить модуль и его версию в существующее дерево DKMS, выполните следующее:

Если параметры -m или -v опущены, DKMS будет искать источники /usr/src/module-module-version, а также dkms.conf. или скопируйте переданный /path/to/module-src/ в /usr/src/module-module-version .

После того, как модуль размещен в дереве, вы можете собрать модуль с помощью команды сборки:

Эта команда позволяет разработчикам и системным администраторам скомпилировать ранее добавленный модуль для текущего ядра. Это также позволяет разработчикам проверять драйвер на наличие ошибок во время разработки. После этого ваш модуль будет скомпилирован, но не установлен.

Если вы хотите скопировать скомпилированные модули в дерево ядра, используйте команду установки:

Если есть два модуля с одинаковым именем, резервная копия ранее установленного модуля будет сохранена в каталоге /var/dkms/MODULE/original-module . Он будет сохранен как исходный модуль, поэтому его можно будет восстановить, если более новый модуль будет удален.

Существует две команды для удаления модуля из дерева DKMS: удалить и удалить .

Команда удалить удалит установленный модуль и, если возможно, заменит его резервной копией:

Чтобы удалить модуль из дерева ядра для переданной -k версии ядра и архитектуры, выполните:

Если вы хотите удалить модуль из всех установленных ядер, добавьте -all :

Разница между командами удаления и удаления заключается в том, что удаление удаляет только модуль из дерева ядра, оставляя модуль в состоянии построен, а удаление также проверяет, существуют ли другие экземпляры модуля для других ядер, и, если их нет, очищает дерево DKMS. После очистки дерева пользователь Linux должен снова добавить модуль, чтобы использовать его с DKMS.

Другие заслуживающие внимания команды — это match и auto-installer . Команда match полезна, когда вам нужно использовать один модуль для нескольких ядер. В этом случае match использует конфигурацию модуля, установленного в одном ядре, и применяет ее к другому.

Автоустановщик проверяет, содержит ли файл конфигурации параметр AUTOINSTALL, и, если он есть, DKMS перестроит и установит модуль для этого ядра при загрузке на новом ядре.

Чтобы использовать DKMS, вы должны предоставить файл dkms.conf, подобный этому:

Разработчики драйверов для Linux могут распространять свое программное обеспечение в следующих формах:

  • В качестве предварительно скомпилированного модуля ядра.
    В этом случае пользователям Linux не нужно беспокоиться о требованиях для сборки драйвера.Предварительно скомпилированные модули выпускаются вместе с ядром Linux и требуют поддержки различных разновидностей Linux и различных параметров конфигурации. Однако между выпуском нового ядра и выпуском необходимой версии модуля может пройти некоторое время.
  • В виде полномодульного исходного кода.
    Используя полномодульный исходный код, пользователь может самостоятельно создать драйвер. Но этот метод зависит от установленного компилятора, дополнительных инструментов сборки и соответствующих заголовочных файлов ядра.
  • Как модуль ядра с двоичными частями с закрытым исходным кодом и исходным кодом для уровня интерфейса ядра
    Этот тип модуля ядра часто используется в качестве обходного пути для нарушений лицензии или дистрибутивов, таких как Free/Net BSD (Berkeley Software Distribution) и некоторые дистрибутивы Linux, в которых допускается комбинированная двоичная прошивка вместе с частями интерфейса с открытым исходным кодом.

DKMS ожидает, что модули ядра будут поставляться с открытым исходным кодом, но иногда драйверы поставляются с двоичными частями с закрытым исходным кодом (например, видеодрайверы NVIDIA). В этом случае основная часть драйвера включает связанный двоичный объект с закрытым исходным кодом, также называемый двоичным двоичным двоичным объектом, и исходный код для уровня интерфейса ядра. Интерфейс ядра, скомпилированный как общий модуль, должен быть связан с частями с закрытым исходным кодом и должен быть скомпилирован специально для каждого ядра.

Для сборки модулей из исходного кода обычно требуется пакет kernel-headers, компилятор (например, коллекция компиляторов GNU) и компоновщик (обычно /usr/bin/ld из пакета binutils). Эти компоненты необходимы на случай, если будут внесены какие-либо изменения в закрытую часть или только в исходный код модуля. Если в двоичный интерфейс приложения ядра (ABI) вносятся какие-либо изменения, такие как изменения сигнатур функций, количества параметров или их типов, требуется правильный интерфейс ядра для поддержки кода интерфейса, связанного с частью большого двоичного объекта.< /p>

Преимущества и ограничения DKMS

Несмотря на то, что DKMS, несомненно, является полезным инструментом для распространения драйверов ядра Linux, у него есть ограничения, которые могут заставить разработчиков драйверов избегать его. Итак, давайте подробнее рассмотрим плюсы и минусы DKMS.

Плюсы использования DKMS:

  • Это удобная платформа для сборки, установки и удаления различных модулей ядра Linux.
  • Это гарантирует, что драйвер Linux будет правильно обновлен и установлен в нужном месте.
  • Он позволяет управлять установленными модулями и проверять их состояние.
  • Это позволяет добавить настраиваемый шаг, например добавить цифровую подпись драйвера клиента с помощью POST_BUILD и POST_INSTALL. Это гарантирует безопасность установки модуля.
  • Он поддерживает установку пакетов deb и rpm из коробки.
  • Он доступен для многих дистрибутивов Linux.
  • Пользователи Linux могут обновить свои драйверы сразу после исправления. Поэтому им не нужно ждать новой версии ядра от поставщика.
  • С этой структурой трудно забыть установить модуль для только что установленного ядра, поскольку все процессы автоматизированы.

Минусы использования DKMS:

  • Для резидентных модулей требуется дополнительная обработка.
  • Исходный код для NVIDIA-подобных модулей с частями больших двоичных объектов неудобно доставлять с помощью DKMS, поскольку для этого требуется исходный код для интерфейса ядра, скомпилированный для каждой версии ядра.
  • Существует риск того, что модуль не будет собран с помощью DKMS, если имена его функций изменились или изменились способы взаимодействия ядра с его компонентами.
  • DKMS не гарантирует правильную установку в случае изменения бинарного интерфейса приложения ядра, поскольку по-прежнему требуется поддержка интерфейса ядра и исходного кода модуля.

Распространение драйверов без DKMS

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

Для достижения этой цели мы решили распространять драйвер с предварительно скомпилированными модулями. Поскольку у нашего драйвера были двоичные части с закрытым исходным кодом, использование DKMS не гарантировало правильную установку.

Однако первой проблемой, с которой мы столкнулись, был широкий диапазон версий ядра Linux и поддерживаемых дистрибутивов. Поэтому нам пришлось выбирать, куда добавить наш драйвер.

Кроме того, мы столкнулись с некоторыми проблемами при внедрении собственной системы сборки и установки модулей:

  • Пользователи Linux могут использовать разные менеджеры пакетов, а названия общих инструментов сборки и пакетов заголовков ядра могут различаться в разных дистрибутивах. Так что есть риск, что наш драйвер не будет собран должным образом.
  • В некоторых версиях ядра нет доступных пакетов для заголовков ядра (например, в Fedora), так как они были изъяты из общего доступа.
  • Некоторые ядра Linux не поддерживают алгоритм цифровой подписи PKCS7, поэтому вместо этого нам пришлось использовать механизм подписи по умолчанию.
  • Существует неоднозначный и зависящий от дистрибутива подход к получению списка установленных ядер, который подтверждает наличие пакета заголовка ядра.
  • У нас были проблемы со сборкой модулей в некоторых конкретных дистрибутивах/конфигурациях. Эти проблемы также могут возникнуть при автоматической сборке с помощью DKMS или других подобных инструментов.

Ниже мы приводим несколько советов о том, как разработчики могут проверить установку своего модуля Linux в ядро ​​без использования DKMS.

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

Эти решения должны быть приняты, даже если вы решите использовать modprobe для добавления или удаления вашего модуля из ядра Linux.

Если вы планируете использовать insmod для вставки вашего модуля в ядро, вам следует позаботиться о защите от внесения в черный список. Однако в этом случае вам потребуется реализовать системный модуль init с нуля.

В случае быстрой загрузки или резидентного модуля разработчики драйверов могут выбрать сценарий уровня выполнения вместо определяемых пользователем сценариев автоматического запуска, которые обычно используются для программного обеспечения. При всем многообразии начальных загрузочных систем Linux (скрипты INIT Sys-V, upstart, systemd и др.) лучше всего реализовать собственный скрипт init.d и полагаться на установленные утилиты (такие как как update-rc.d или chkconfing) для обработки ссылок на уровне выполнения. Уровень выполнения — это понятие для операционных систем с инициализацией в стиле Sys-V, описывающее, какие процессы, демоны и драйверы следует загружать или запускать для каждого режима.

Однако не существует стандарта, определяющего расположение, структуру или даже полный список таких ссылок. Кроме того, упомянутые выше утилиты имеют разные версии пакетов в дистрибутивах с разным функционалом. Например, более ранняя версия update-rc.d в Mint 17 позволяет указывать приоритет загрузки, но та же утилита в Mint 18 не имеет этой опции, полагаясь только на зависимости загрузки модуля.

Заключение

Благодаря постоянному развитию сообщества Linux появляются замечательные инструменты, такие как DKMS. С помощью DKMS пользователи Linux могут автоматически создавать модули ядра и управлять ими, не дожидаясь доставки нового пакета драйверов. Кроме того, разработчики драйверов могут проверять установку своих модулей на этапе разработки. Также существует множество полезных инструментов для разработчиков драйверов для Linux, так что мы продолжим делиться своим опытом по этой теме. Разработка драйверов для Linux требует комплексного подхода, и наша команда разработчиков драйверов всегда к вашим услугам.

Читайте также: