Страница 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-х лет :lol: , и собрав и инсталлровав тот же модуль, но только в версии 3.1 - можно продолжить :lol: :

Код: Выделить всё

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.