Skip to content

DKMS HOWTO

Dynamic Kernel Module Support(DKMS) — это фреймворк, который используется для генерации тех модулей ядра Linux, которые в общем случае не включены в дерево исходного кода. DKMS позволяет драйверам устройств автоматически пересобираться, когда ядро уже установлено.

Интересная штуковина. В жизни каждого мужчины наступает момент, когда он должен сделать 3 вещи: Установить linux, собрать ядро, поставить модуль. Сегодня наступил такой день и в жизни этого мужчины.

Для начала подготовим сборочный цех. Нам понадобится свежий debian из stable ветки на который мы установим:

Примечание!
Лучше чтоб сборочным цехом была виртуалка, либо какой-то непродуктивный сервер, чтоб в последствии не обновлять весь скопившейся на нём хлам и не поддерживать зависимости.

# aptitude install build-essential make dkms linux-headers-$(uname -r)

В общем-то почти всё готово. Осталось выбрать для примера, что мы будем собирать. Я возьму модуль от разработки нашего соотечественника accel-pppd необходимый для работы IPoE.
Установим пакеты для работы с git, скачиваем исходники:

# aptitude install git
# cd /opt
# git clone git://git.code.sf.net/p/accel-ppp/code accel-ppp-code 

Cloning into 'accel-ppp-code'...
remote: Counting objects: 11871, done.
remote: Compressing objects: 100% (7096/7096), done.
remote: Total 11871 (delta 9061), reused 6228 (delta 4673)
Receiving objects: 100% (11871/11871), 3.83 MiB | 193.00 KiB/s, done.
Resolving deltas: 100% (9061/9061), done.
Checking connectivity... done.

Отлично! Теперь нам нужно создать директорию для работы dkms. Она должна соответствовать шаблону: название_модуля-версия_модуля

# mkdir /usr/src/ipoe-0.1

То есть наш модуль будет называться ipoe а его версия будет 0.1
Закинем ранее скачанные исходники модуля в рабочую директорию:

# cp /opt/accel-ppp-code/drivers/ipoe/* /usr/src/ipoe-0.1/
# ls /usr/src/ipoe-0.1/
CMakeLists.txt  ipoe.c  ipoe.h  Makefile

Создадим минимально-необходимый конфиг для работы dkms:

# cat << EOF > /usr/src/ipoe-0.1/dkms.conf
PACKAGE_NAME="ipoe"
PACKAGE_VERSION="0.1"
CLEAN="make clean"
MAKE[0]="make all KVERSION=$kernelver"
BUILT_MODULE_NAME[0]="ipoe"
DEST_MODULE_LOCATION[0]="/updates"
AUTOINSTALL="yes"
EOF

Ну вот, теперь пришло время создать в своей жизни нечто полезное:

# dkms build -m ipoe -v 0.1

Creating symlink /var/lib/dkms/ipoe/0.1/source ->
                 /usr/src/ipoe-0.1

DKMS: add completed.

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area....
make KERNELRELEASE=3.16.0-4-amd64 all KVERSION=3.16.0-4-amd64....
cleaning build area....

DKMS: build completed.

Кажется, у нас всё получилось. Теперь соберём deb-пакет, чтоб всё было совсем по-красоте.

# dkms mkdeb -m ipoe -v 0.1
Using /etc/dkms/template-dkms-mkdeb
copying template...
modifying debian/changelog...
modifying debian/compat...
modifying debian/control...
modifying debian/copyright...
modifying debian/dirs...
modifying debian/postinst...
modifying debian/prerm...
modifying debian/README.Debian...
modifying debian/rules...
copying legacy postinstall template...
Copying source tree...
Gathering binaries...Marking modules for 3.16.0-4-amd64 (x86_64) for archiving...

Creating tarball structure to specifically accomodate binaries.

Tarball location: /var/lib/dkms/ipoe/0.1/tarball//ipoe-0.1.dkms.tar.gz


DKMS: mktarball completed.

Copying DKMS tarball into DKMS tree...
Building binary package...dpkg-buildpackage: предупреждение: используется команда получения прав root, но уже есть права root
 dpkg-source --before-build ipoe-dkms-0.1
 fakeroot debian/rules clean
 debian/rules build
 fakeroot debian/rules binary
 dpkg-genchanges -b >../ipoe-dkms_0.1_amd64.changes
dpkg-genchanges: закачка только двоичных пакетов (без пакетов исходного кода)
 dpkg-source --after-build ipoe-dkms-0.1


DKMS: mkdeb completed.
Moving built files to /var/lib/dkms/ipoe/0.1/deb...
Cleaning up temporary files...

Ну и финальный штрих, чтоб убедиться что всё нормас, пробуем установить наш пакет:

# dpkg -i /var/lib/dkms/ipoe/0.1/deb/ipoe-dkms_0.1_all.deb 
Выбор ранее не выбранного пакета ipoe-dkms.
(Чтение базы данных … на данный момент установлено 54202 файла и каталога.)
Подготовка к распаковке …/0.1/deb/ipoe-dkms_0.1_all.deb …
Распаковывается ipoe-dkms (0.1) …
Настраивается пакет ipoe-dkms (0.1) …
Removing old ipoe-0.1 DKMS files...

-------- Uninstall Beginning --------
Module:  ipoe
Version: 0.1
Kernel:  3.16.0-4-amd64 (x86_64)
-------------------------------------

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

DKMS: uninstall completed.

------------------------------
Deleting module version: 0.1
completely from the DKMS tree.
------------------------------
Done.

Loading tarball for ipoe-0.1
Loading /var/lib/dkms/ipoe/0.1/3.16.0-4-amd64/x86_64...

DKMS: ldtarball completed.

Creating symlink /var/lib/dkms/ipoe/0.1/source ->
                 /usr/src/ipoe-0.1

DKMS: add completed.
First Installation: checking all kernels...
Building only for 3.16.0-4-amd64
Building for architecture amd64
Building initial module for 3.16.0-4-amd64
Done.

ipoe:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/3.16.0-4-amd64/updates/dkms/

depmod....

DKMS: install completed.

Пацаны ваще ребята! Чотко!

2

Список используемых материалов:

Published inIT

One Comment

Leave a Reply to a Cancel reply

Your email address will not be published. Required fields are marked *