Тема интереснейшая.7 сентября в 23:49
Надеюсь, что будет какое-то продолжение обсуждения.
Модератор: Olej
Тема интереснейшая.7 сентября в 23:49
Dynamic Kernel Module SupportOlej писал(а): Тема интереснейшая.
Надеюсь, что будет какое-то продолжение обсуждения.
2. Building a kernel module using Dynamic Kernel Module Support (DKMS)Dynamic Kernel Module Support или DKMS — фреймворк, который используется для генерации тех модулей ядра Linux, которые в общем случае не включены в дерево исходного кода. DKMS позволяет драйверам устройств автоматически пересобираться, когда ядро уже собрано. DKMS может быть использован в двух направлениях: автоматическая рекомпиляция всех модулей в случае установки новой версии ядра, и установка новых версий модулей (драйверов) в существующую систему без необходимости ручной компиляции или предкомпилированных пакетов. Это, к примеру, делает возможным использование новых видеокарт на старых Linux-системах.
DKMS был написан группой линукс-разработчиков в компании Dell в 2003 году.
Fedora: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).
...
Код: Выделить всё
[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
Выполнено!
Код: Выделить всё
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
Там есть, кроме хорошего внятного описания, очень нужные и совсем не очевидные подробности:Оригинал: How to build a kernel module with DKMS on Linux
Автор: Dan Nanni
Дата публикации: 8 апреля 2016 г.
Перевод: А.Панин
Дата перевода: 24 июля 2016 г.
Обратите внимание на то, при обновлении версии ядра ОС без установки соответствующего набора заголовочных файлов сборка модуля средствами 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 );
Ручная сборка (для проверки того, что модуль в другой системе и через 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
А теперь переделываю всё это же под сборку DKMS...
Код: Выделить всё
olej@ACER:/usr/src/hello_printk-2.1$ aptitude search dkms | grep ^i
i A dkms - инфраструктура для поддержки динамически загружаемых модулей ядра
Код: Выделить всё
olej@ACER:~$ sudo mkdir /usr/src/hello_printk-2.1/
[sudo] пароль для olej:
Код: Выделить всё
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"
Код: Выделить всё
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
Код: Выделить всё
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.
Код: Выделить всё
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
Код: Выделить всё
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
Код: Выделить всё
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
Код: Выделить всё
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
Код: Выделить всё
olej@ACER:~/2019_WORK/HISTORY/11/12$ sudo dmesg | tail -n1
[32881.178021] Hello, world!
И теперь, по прошествии 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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей