автоматическая сборка модулей ядра (DKMS)

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

автоматическая сборка модулей ядра (DKMS)

Непрочитанное сообщение Olej » 23 сен 2015, 14:27

Вот публикация-обзор: Автоматическая сборка модулей ядра при помощи DKMS
7 сентября в 23:49
Тема интереснейшая.
Надеюсь, что будет какое-то продолжение обсуждения.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: автоматическая сборка модулей ядра

Непрочитанное сообщение Olej » 10 июн 2016, 12:34

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Автоматическая сборка модуля ядра ОС с помощью DKMS

Непрочитанное сообщение Olej » 07 окт 2016, 12:57

Автоматическая сборка модуля ядра ОС с помощью фреймворка DKMS в Linux
Оригинал: How to build a kernel module with DKMS on Linux
Автор: Dan Nanni
Дата публикации: 8 апреля 2016 г.
Перевод: А.Панин
Дата перевода: 24 июля 2016 г.
Там есть, кроме хорошего внятного описания, очень нужные и совсем не очевидные подробности:
Обратите внимание на то, при обновлении версии ядра ОС без установки соответствующего набора заголовочных файлов сборка модуля средствами DKMS попросту не будет инициирована, следовательно, драйвер устройства не будет пересобран из своих исходных кодов. Вместо него будет использоваться официальный драйвер из состава новой версии ядра ОС (если такой доступен).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: автоматическая сборка модулей ядра (DKMS)

Непрочитанное сообщение Olej » 12 ноя 2019, 23:42

Тогда (когда создавал тему) не было ни времени ни желания собрать практически 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
Вложения
hello_printk.c
(398 байт) 111 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: автоматическая сборка модулей ядра (DKMS)

Непрочитанное сообщение Olej » 12 ноя 2019, 23:44

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 

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: автоматическая сборка модулей ядра (DKMS)

Непрочитанное сообщение Olej » 12 ноя 2019, 23:51

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: автоматическая сборка модулей ядра (DKMS)

Непрочитанное сообщение Olej » 12 ноя 2019, 23:55

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: автоматическая сборка модулей ядра (DKMS)

Непрочитанное сообщение Olej » 12 ноя 2019, 23:58

Установка:

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

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.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: автоматическая сборка модулей ядра (DKMS)

Непрочитанное сообщение Olej » 13 ноя 2019, 00:03

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

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

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!
Теперь этот модуль будет пересобираться (обновляться) при обновлениях ядра!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: автоматическая сборка модулей ядра (DKMS)

Непрочитанное сообщение Olej » 08 авг 2022, 09:36

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.

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей