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

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

Модератор: Olej

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

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

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

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

Аватара пользователя
Olej
Писатель
Сообщения: 20332
Зарегистрирован: 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
Писатель
Сообщения: 20332
Зарегистрирован: 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 байт) 104 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 20332
Зарегистрирован: 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
Писатель
Сообщения: 20332
Зарегистрирован: 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
Писатель
Сообщения: 20332
Зарегистрирован: 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
Писатель
Сообщения: 20332
Зарегистрирован: 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
Писатель
Сообщения: 20332
Зарегистрирован: 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
Писатель
Сообщения: 20332
Зарегистрирован: 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.

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

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

Непрочитанное сообщение Olej » 19 фев 2023, 07:38

Olej писал(а):
08 авг 2022, 09:36
Так мы смотрим что у нас установлено под контролем DKMS.
И теперь, самое время - почистить то, что мы насорили в системе, экспериментируя с DKMS...
- Деинсталлировать модуль из системы:

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

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples$ sudo dkms uninstall -m hello_printk -v 3.1

-------- Uninstall Beginning --------
Module:  hello_printk
Version: 3.1
Kernel:  5.4.0-122-generic (x86_64)
-------------------------------------

Status: Before uninstall, this module version was ACTIVE on this kernel.

hello_printk.ko:
 - Uninstallation
   - Deleting from: /lib/modules/5.4.0-122-generic/kernel/lib/hello_printk//
 - Original module
   - No original module was found for this module on this kernel.
   - Use the dkms install command to reinstall any previous module version.

depmod...

DKMS: uninstall completed.


olej@R420:~/2022/own.BOOKs/BHV.kernel/examples$ ls -l /lib/modules/`uname -r`/kernel/lib/hello_printk
ls: невозможно получить доступ к '/lib/modules/5.4.0-122-generic/kernel/lib/hello_printk': Нет такого файла или каталога
- Убрать модуль из-под контроля DKMS:

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

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples$ sudo dkms remove -m hello_printk -v 3.1
Error! Invalid number of parameters passed.
Usage: remove <module>/<module-version> --all
   or: remove <module>/<module-version> -k <kernel-version>

Не так!
:oops:
А вот так:

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

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples$ sudo dkms remove hello_printk/3.1 --all

-------- Uninstall Beginning --------
Module:  hello_printk
Version: 3.1
Kernel:  5.4.0-122-generic (x86_64)
-------------------------------------

Status: This module version was INACTIVE for this kernel.
depmod...

DKMS: uninstall completed.

------------------------------
Deleting module version: 3.1
completely from the DKMS tree.
------------------------------
Done.
И проверяем:

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

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples$ dkms status
virtualbox, 6.1.34, 5.4.0-121-generic, x86_64: installed
virtualbox, 6.1.34, 5.4.0-122-generic, x86_64: installed


Тема поднималась пользователем Olej 19 фев 2023, 07:38.

Ответить

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

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

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