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.
Пацаны ваще ребята! Чотко!
Список используемых материалов:
Ваще нормас