Страница 1 из 2
автоматическая сборка модулей ядра (DKMS)
Добавлено: 23 сен 2015, 14:27
Olej
Вот публикация-обзор:
Автоматическая сборка модулей ядра при помощи DKMS
7 сентября в 23:49
Тема интереснейшая.
Надеюсь, что будет какое-то продолжение обсуждения.
Re: автоматическая сборка модулей ядра
Добавлено: 10 июн 2016, 12:34
Olej
Olej писал(а):
Тема интереснейшая.
Надеюсь, что будет какое-то продолжение обсуждения.
Dynamic Kernel Module Support
Dynamic Kernel Module Support или DKMS — фреймворк, который используется для генерации тех модулей ядра Linux, которые в общем случае не включены в дерево исходного кода. DKMS позволяет драйверам устройств автоматически пересобираться, когда ядро уже собрано. DKMS может быть использован в двух направлениях: автоматическая рекомпиляция всех модулей в случае установки новой версии ядра, и установка новых версий модулей (драйверов) в существующую систему без необходимости ручной компиляции или предкомпилированных пакетов. Это, к примеру, делает возможным использование новых видеокарт на старых Linux-системах.
DKMS был написан группой линукс-разработчиков в компании Dell в 2003 году.
2. Building a kernel module using Dynamic Kernel Module Support (DKMS)
The dynamic kernel module support (DKMS) framework is basically a duplicate tree, outside of the kernel source, that holds the source and compiled binaries for a particular module. DKMS can be called on to build, install or uninstall modules. DKMS requires the module source code to be located on your system.
...
1. Install the kernel-devel package that matches your current kernel.
2. Install the dkms package from the EPEL repository (see Repositories).
...
Fedora:
Код: Выделить всё
[olej@dell ~]$ dnf list dkms
Последняя проверка окончания срока действия метаданных: 7 days, 19:55:42 назад, Thu Jun 2 16:43:33 2016.
Доступные пакеты
dkms.noarch 2.2.0.3-31.git.7c3e7c5.fc23 fedora
Код: Выделить всё
[olej@dell ~]$ sudo dnf install dkms
[sudo] пароль для olej:
Последняя проверка окончания срока действия метаданных: 1:14:40 назад, Fri Jun 10 11:24:59 2016.
Зависимости разрешены.
===========================================================================================================================================
Package Архитектура Версия Репозиторий Размер
===========================================================================================================================================
Установка:
dkms noarch 2.2.0.3-34.git.9e0394d.fc23 updates 82 k
Результат операции
===========================================================================================================================================
Установка 1 Пакет
Объем загрузки: 82 k
Объем изменений: 223 k
Продолжить? [д/Н]: y
Загрузка пакетов:
[MIRROR] dkms-2.2.0.3-34.git.9e0394d.fc23.noarch.rpm: Curl error (56): Failure when receiving data from the peer for http://fedora.ip-connect.vn.ua/linux/updates/23/x86_64/d/dkms-2.2.0.3-34.git.9e0394d.fc23.noarch.rpm [Recv failure: Соединение разорвано другой стороной]
dkms-2.2.0.3-34.git.9e0394d.fc23.noarch.rpm 576 B/s | 82 kB 02:25
-------------------------------------------------------------------------------------------------------------------------------------------
Общий размер 570 B/s | 82 kB 02:27
Проверка транзакции
Проверка транзакции успешно завершена.
Идет проверка транзакции
Тест транзакции проведен успешно
Выполнение транзакции
Установка : dkms-2.2.0.3-34.git.9e0394d.fc23.noarch 1/1
Проверка : dkms-2.2.0.3-34.git.9e0394d.fc23.noarch 1/1
Установлено:
dkms.noarch 2.2.0.3-34.git.9e0394d.fc23
Выполнено!
Mint:
Код: Выделить всё
olej@nvidia ~ $ apt search dkms
p backfire-dkms - kernel module for signal benchmarking (DKM
i A bbswitch-dkms - Interface for toggling the power on nVidia
p blcr-dkms - поддержка DKMS для BLCR-модуля ядра
p blktap-dkms - Xen API blktap kernel component DKMS packa
p broadcom-sta-dkms - dkms source for the Broadcom STA Wireless
p cmem-mod-dkms - cmem-mod driver in DKMS format.
p dahdi-dkms - DAHDI telephony interface (dkms kernel dri
p debugss-mod-dkms - debugss-mod driver in DKMS format.
i dkms - инфраструктура для поддержки динамически з
p flashcache-dkms - write-back block device cache for Linux (D
p fwts-efi-runtime-dkms - Firmware Test Suite UEFI Runtime Service k
p gdbproxy-mod-dkms - gdbproxy-mod driver in DKMS format.
p iscsitarget-dkms - iSCSI Enterprise Target kernel module sour
p langford-dkms - Kernel drivers for the Per Vices Noctar IQ
p lime-forensics-dkms - kernel module to memory dump (DKMS)
p lttng-modules-dkms - Linux Trace Toolkit (LTTng) kernel modules
p nat-rtsp-dkms - Connection tracking and NAT support for RT
p ndiswrapper-dkms - исходный код модуля ndiswrapper для ядра L
p open-vm-dkms - Open VMware Tools for virtual machines hos
p open-vm-dkms-lts-trusty - Open VMware Tools for virtual machines hos
p open-vm-tools-dkms - Open VMware Tools for virtual machines hos
p open-vm-tools-lts-trusty-dkms - Open VMware Tools for virtual machines hos
p openafs-modules-dkms - AFS distributed filesystem kernel module D
p openswan-modules-dkms - Internet Key Exchange daemon - DKMS source
p openvswitch-datapath-dkms - Open vSwitch datapath module source - DKMS
p oss4-dkms - Open Sound System - DKMS module sources
p r8168-dkms - dkms source for the r8168 network driver
p sl-modem-dkms - SmartLink software modem driver - module b
p temperature-mod-dkms - temperature-mod driver in DKMS format.
p tp-smapi-dkms - ThinkPad hardware/firmware access modules
p uio-module-drv-dkms - uio-module-drv driver in DKMS format.
p v4l2loopback-dkms - Source for the v4l2loopback driver (DKMS)
p virtualbox-dkms - Решение для x86-виртуализации - исходный к
i virtualbox-guest-dkms - x86 virtualization solution - guest additi
p webcamstudio-dkms - Source for the webcamstudio driver (DKMS)
p west-chamber-dkms - iptable extension for bypassing content fi
p xtables-addons-dkms - Extensions targets and matches for iptable
Код: Выделить всё
olej@nvidia ~ $ apt show dkms
Пакет: dkms
Состояние: установлен
Автоматически установлен: нет
Версия: 2.2.0.3-1.1ubuntu5.14.04.5
Приоритет: необязательный
Раздел: admin
Сопровождающий: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Архитектура: all
Размер в распакованном виде: 351 k
Зависимости: module-init-tools, gcc, make | build-essential | dpkg-dev,
coreutils (>= 7.4), patch
Рекомендует: fakeroot, menu | sudo
Предлагает: dpkg-dev, debhelper
Описание: инфраструктура для поддержки динамически загружаемых модулей ядра
DKMS — инфраструктура, позволяющая обновлять модули ядра без изменения всего
ядра. Также позволяет легко пересобирать модули при обновлении ядра.
Сайт: http://linux.dell.com/dkms
Автоматическая сборка модуля ядра ОС с помощью DKMS
Добавлено: 07 окт 2016, 12:57
Olej
Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS в Linux
Оригинал: How to build a kernel module with DKMS on Linux
Автор: Dan Nanni
Дата публикации: 8 апреля 2016 г.
Перевод: А.Панин
Дата перевода: 24 июля 2016 г.
Там есть, кроме хорошего внятного описания, очень нужные и совсем не очевидные подробности:
Обратите внимание на то, при обновлении версии ядра ОС без установки соответствующего набора заголовочных файлов сборка модуля средствами DKMS попросту не будет инициирована, следовательно, драйвер устройства не будет пересобран из своих исходных кодов. Вместо него будет использоваться официальный драйвер из состава новой версии ядра ОС (если такой доступен).
Re: автоматическая сборка модулей ядра (DKMS)
Добавлено: 12 ноя 2019, 23:42
Olej
Тогда (когда создавал тему) не было ни времени ни желания собрать практически DKMS модуль ... вместо (из) модуля ручной сборки.
Возьму для этого простейший модуль из моей книги:
Код: Выделить всё
#include <linux/module.h>
MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "Oleg Tsiliuric <olej@front.ru>" );
MODULE_DESCRIPTION( "DKMS module hello_printk" );
MODULE_VERSION( "2.1" );
static int __init hello_init( void ) {
printk( "Hello, world!\n" );
return 0;
}
static void __exit hello_exit( void ) {
printk( "Goodbye, world!\n" );
}
module_init( hello_init );
module_exit( hello_exit );
Из того, что было в книге, в код добавлены макросы (только для полноты) MODULE_DESCRIPTION + MODULE_VERSION
Re: автоматическая сборка модулей ядра (DKMS)
Добавлено: 12 ноя 2019, 23:44
Olej
Olej писал(а): ↑12 ноя 2019, 23:42
Возьму для этого простейший модуль из моей книги:
Ручная сборка (для проверки того, что модуль в другой системе и через 7 лет благополучно собирается):
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ make
make -C /lib/modules/4.19.0-6-amd64/build M=/home/olej/2019_WORK/HISTORY/11/12 modules
make[1]: вход в каталог «/usr/src/linux-headers-4.19.0-6-amd64»
CC [M] /home/olej/2019_WORK/HISTORY/11/12/hello_printk.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/olej/2019_WORK/HISTORY/11/12/hello_printk.mod.o
LD [M] /home/olej/2019_WORK/HISTORY/11/12/hello_printk.ko
make[1]: выход из каталога «/usr/src/linux-headers-4.19.0-6-amd64»
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ /sbin/modinfo hello_printk.ko
filename: /home/olej/2019_WORK/HISTORY/11/12/hello_printk.ko
version: 2.1
description: DKMS module hello_printk
author: Oleg Tsiliuric <olej@front.ru>
license: GPL
srcversion: 4749078333D4CD999D1BD59
depends:
retpoline: Y
name: hello_printk
vermagic: 4.19.0-6-amd64 SMP mod_unload modversions
Re: автоматическая сборка модулей ядра (DKMS)
Добавлено: 12 ноя 2019, 23:51
Olej
Olej писал(а): ↑12 ноя 2019, 23:44
Ручная сборка (для проверки того, что модуль в другой системе и через 7 лет благополучно собирается):
А теперь переделываю всё это же под сборку DKMS...
Код: Выделить всё
olej@ACER:/usr/src/hello_printk-2.1$ aptitude search dkms | grep ^i
i A dkms - инфраструктура для поддержки динамически загружаемых модулей ядра
Сам пакет установлен по умолчанию (это Debian 10).
Создаю каталог - имя пакета + версия:
Код: Выделить всё
olej@ACER:~$ sudo mkdir /usr/src/hello_printk-2.1/
[sudo] пароль для olej:
Копирую туда все *.c исходники и Makefile (в точности те, из которых делалась ручная сборка):
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ pwd
/home/olej/2019_WORK/HISTORY/11/12
olej@ACER:~/2019_WORK/HISTORY/11/12$ ls *.c
hello_printk.c
olej@ACER:~/2019_WORK/HISTORY/11/12$ sudo cp *.c /usr/src/hello_printk-2.1/
[sudo] пароль для olej:
olej@ACER:~/2019_WORK/HISTORY/11/12$ sudo cp Makefile /usr/src/hello_printk-2.1
[sudo] пароль для olej:
Создаём файл и заполняем:
Код: Выделить всё
olej@ACER:/usr/src/hello_printk-2.1$ sudo touch dkms.conf
root@ACER:/usr/src/hello_printk-2.1# cat dkms.conf
PACKAGE_NAME="hello_printk"
PACKAGE_VERSION="2.1"
BUILT_MODULE_NAME[0]="hello_printk"
DEST_MODULE_LOCATION[0]="/kernel/lib/hello_printk/"
AUTOINSTALL="yes"
Вот всё ... дальше DKMS сборка...
Код: Выделить всё
root@ACER:/usr/src/hello_printk-2.1# pwd
/usr/src/hello_printk-2.1
root@ACER:/usr/src/hello_printk-2.1# ls
dkms.conf hello_printk.c Makefile
Re: автоматическая сборка модулей ядра (DKMS)
Добавлено: 12 ноя 2019, 23:55
Olej
Olej писал(а): ↑12 ноя 2019, 23:51
Вот всё ... дальше сборка...
Код: Выделить всё
root@ACER:/usr/src/hello_printk-2.1# dkms add -m hello_printk -v 2.1
Creating symlink /var/lib/dkms/hello_printk/2.1/source ->
/usr/src/hello_printk-2.1
DKMS: add completed.
Код: Выделить всё
root@ACER:/usr/src/hello_printk-2.1# dkms build -m hello_printk -v 2.1
Kernel preparation unnecessary for this kernel. Skipping...
Building module:
cleaning build area...
make -j2 KERNELRELEASE=4.19.0-6-amd64 -C /lib/modules/4.19.0-6-amd64/build M=/var/lib/dkms/hello_printk/2.1/build....
cleaning build area...
DKMS: build completed.
Собрано всё это вот сюда (по ссылке в build выше можно отследить):
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ tree /var/lib/dkms/hello_printk/2.1
/var/lib/dkms/hello_printk/2.1
├── 4.19.0-6-amd64
│ └── x86_64
│ ├── log
│ │ └── make.log
│ └── module
│ └── hello_printk.ko
└── source -> /usr/src/hello_printk-2.1
5 directories, 2 files
root@ACER:/usr/src/hello_printk-2.1# ls /lib/modules/`uname -r`
build misc modules.alias.bin modules.builtin.bin modules.dep.bin modules.order modules.symbols source
kernel modules.alias modules.builtin modules.dep modules.devname modules.softdep modules.symbols.bin
Re: автоматическая сборка модулей ядра (DKMS)
Добавлено: 12 ноя 2019, 23:58
Olej
Установка:
Код: Выделить всё
root@ACER:/usr/src/hello_printk-2.1# dkms install -m hello_printk -v 2.1
hello_printk.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/4.19.0-6-amd64/updates/dkms/
depmod....
DKMS: install completed.
Установлено всё это сюда:
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ tree /lib/modules/`uname -r`/updates
/lib/modules/4.19.0-6-amd64/updates
└── dkms
└── hello_printk.ko
1 directory, 1 file
В других дистрибутивах это может быть каталог не updates, а extra.
Re: автоматическая сборка модулей ядра (DKMS)
Добавлено: 13 ноя 2019, 00:03
Olej
Проверяем что получилось...
(специально уходим в домашний каталог, чтобы не находиться на системных путях)
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ pwd
/home/olej/2019_WORK/HISTORY/11/12
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ /sbin/modinfo hello_printk
filename: /lib/modules/4.19.0-6-amd64/updates/dkms/hello_printk.ko
version: 2.1
description: DKMS module hello_printk
author: Oleg Tsiliuric <olej@front.ru>
license: GPL
srcversion: 4749078333D4CD999D1BD59
depends:
retpoline: Y
name: hello_printk
vermagic: 4.19.0-6-amd64 SMP mod_unload modversions
Обращаем внимание, что
в отличие от ручной сборки, ни путь к файлу модуля, ни расширение .ko
не указываем!:
Загрузка (опять же - не insmod, а modprobe):
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ sudo modprobe hello_printk
olej@ACER:~/2019_WORK/HISTORY/11/12$ lsmod | grep hello_printk
hello_printk 16384 0
И сообщение printk() загрузившегося модуля:
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ sudo dmesg | tail -n1
[32881.178021] Hello, world!
Теперь этот модуль будет пересобираться (обновляться) при обновлениях ядра!
Re: автоматическая сборка модулей ядра (DKMS)
Добавлено: 08 авг 2022, 09:36
Olej
Olej писал(а): ↑13 ноя 2019, 00:03
Теперь этот модуль будет пересобираться (обновляться) при обновлениях ядра!
И теперь, по прошествии 3-х лет
, и собрав и инсталлровав тот же модуль, но только в версии 3.1 - можно
продолжить :
Код: Выделить всё
olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/first_hello$ dkms status
hello_printk, 3.1, 5.4.0-122-generic, x86_64: installed
virtualbox, 6.1.34, 5.4.0-121-generic, x86_64: installed
virtualbox, 6.1.34, 5.4.0-122-generic, x86_64: installed
Так мы смотрим
что у нас установлено под контролем DKMS.