Тема интереснейшая.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
Код: Выделить всё
#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-х лет
Код: Выделить всё
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@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': Нет такого файла или каталога
Код: Выделить всё
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>
Код: Выделить всё
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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость