DKMS или Dynamic Kernel Module Support — это система, которая позволяет обновлять отдельные модули ядра без необходимости модификации всего ядра. Это бесплатное программное обеспечение под лицензией GPL v2, написанное командой Dell Linux Engineering Team. Первоначально DKMS был разработан для Dell Computer Corporation для распространения программных исправлений среди клиентов четко определенным образом.
DKMS имеет много преимуществ для сообществ поставщиков услуг Linux, например:
В этой статье будут обсуждаться различные термины, связанные с ядром, и, в частности, что такое DKMS.
Это основная часть ОС Linux. Это основной интерфейс между процессами, работающими в ОС, и ее оборудованием. Он управляет основными функциями, такими как управление памятью, управление процессами, управление ЦП, управление драйверами устройств, а также системные вызовы и управление безопасностью.
Ядро фактически скрыто от пользователя и работает в своей собственной области, называемой пространством ядра. Пользователь взаимодействует с ядром с помощью пользовательских приложений, таких как файловый браузер, веб-браузер и т. д. Эти взаимодействия используют специальную программную конструкцию, называемую системным вызовом.
Содержит весь исходный код ядра и драйверов устройств. Он состоит из множества каталогов и подкаталогов, таких как arch, block, crypto, include, init, lib, usr и т. д.
Модули ядра Linux в основном представляют собой фрагменты кода. Их можно добавлять и удалять из ядра в соответствии с требованиями. Они могут быть встроенными или загружаемыми. Модуль ядра расширяет функции ядра, не требуя перезагрузки системы. В отличие от микроядер, где добавление новых компонентов в ядро требует настройки и сборки нового ядра, мы можем загружать и выгружать компоненты или модули ОС во время выполнения. Этими модулями являются драйверы устройств, файловые системы и т. д.
После того, как модуль загружен, он подобен фрагменту кода ядра. Он имеет те же привилегии и обязанности, что и обычный код ядра.
Вот выдержка из определения DKMS, которую мы нашли здесь :
«DKMS — это инфраструктура, в которой исходный код драйвера устройства может находиться за пределами дерева исходного кода ядра, что упрощает пересборку модулей при обновлении ядра».
Остановимся на вышеизложенном. Система DKMS представляет собой дерево из базового дерева ядра на земле. Он содержит исходный код модуля и скомпилированные двоичные файлы модуля. В результате этой репликации модули не связаны с ядром.
Мы впервые столкнулись с концепцией DKMS, когда купили ноутбук HP и установили на него Ubuntu 18.04. Все работало нормально, кроме Wi-Fi. Ноутбук не смог найти какой-либо адаптер Wi-Fi. В настройках в меню Wi-Fi появилось сообщение “No WiFi Adapter Found”. Мы начали искать в форумах в Интернете и обнаружили, что многие люди сталкиваются с той же проблемой. Мы нашли много решений, предлагающих установить заголовочные файлы, драйверы и другие пакеты.
Мы просто слепо следовали этим руководствам, не зная, что они на самом деле хотели передать. В любом случае, эти руководства помогли, и каким-то образом заработал Wi-Fi. Но проблема заключалась в том, что всякий раз, когда обновляли свою систему Ubuntu, возникала одна и та же проблема, и мне приходилось повторять одни и те же шаги по перекомпиляции скачанных драйверов. Также приходится исправлять проблему с низким уровнем сигнала каждый раз после установки драйвера. Даже установили ОС Windows, и, к нашему удивлению, Wi-Fi действительно работал безупречно. Но все равно приходится использовать Ubuntu для работы. Поэтому решили жить с временным патчем, который получил ранее.
Недавнее решение, с которым только что столкнулись и которое меня не заботило в прошлом, использовало способ DKMS. Вместо использования команды make или make install DKMS выполняет три операции с исходным кодом: добавление, сборка и установка.
Для работы DKMS исходный код модуля должен присутствовать в системе, в которой мы собираем модуль, а путь расположения должен быть таким, как «/usr/src/<module>-<module-version>/», и помните, что это самое первое требование DKMS. Еще одним требованием является файл с именем «dkms.conf», который поможет вам собрать и установить модуль. Кстати говоря, DKMS уже должен быть установлен в системе. Когда все на месте, мы можем добавить модуль в дерево DKMS.
Давайте посмотрим на эти шаги, установив демонстрационный модуль «demo-v0.1.tar.gz» с помощью DKMS. Мы делаем этот образец только для того, чтобы понять, как работает DKMS. После извлечения файла нам нужно «cd» внутри него:
# cd demo-v0.1/
Теперь создайте файл dkms.conf, содержащий следующие строки:
MAKE="make -C src/ KERNELDIR=/lib/modules/${kernelver}/build" CLEAN="make -C ${kernel_source_dir} M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean" BUILT_MODULE_NAME=”demo” BUILT_MODULE_LOCATION=”src” PACKAGE_NAME=demo PACKAGE_VERSION=0.1 REMAKE_INITRD=”yes” AUTOINSTALL=yes
Теперь, когда наш файл dkms.conf готов, мы можем добавить наш демо-модуль как:
# dkms add -m demo -v 0.1
Прелесть DKMS в том, что мы можем указать версию ядра, для которой мы хотим выполнить сборку или модуль, как показано здесь:
# dkms build -m demo -v 0.1 -k 5.13.0-27
Если мы не укажем ядро, DKMS соберет модуль с текущей версией ядра.
Если все пойдет хорошо, теперь мы можем установить модуль, используя:
# dkms install -m demo -v 0.1
Если мы обновим наше ядро или изменим аппаратную архитектуру, модуль должен быть снова пересобран вручную. С помощью DKMS эта процедура становится избыточной, поскольку DKMS динамически создает эти модули ядра для каждого ядра, присутствующего в системе.
Такие инструменты, как DKMS, очень помогли администраторам, разработчикам драйверов и другим пользователям упростить задачу управления ядром. В то время как конечные пользователи не заботятся о том, как работает базовая система, пока их цели не будут достигнуты, DKMS позволяет разработчикам и администраторам сосредоточиться на своей работе.