Автоматическая сборка модулей ядра при помощи DKMS

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

В данной статье рассматривается автоматическое управление при помощи DKMS на примере модулей шины CAN.
DKMS предполагает, что пакет модуля или совокупности модулей ядра располагается в директории /usr/src/{package_name}-{package-version}
Кроме исходных текстов модуля/модулей, директория пакета содержит конфиг dkms.conf, а также Makefile, в соответствии с которым производится сборка.

Создадим для DKMS пакета модулей шины CAN директорию /usr/src/can-dkms-4.1.6–200
Модули шины CAN расположены в двух различных поддиректориях исходников ядра:

  • net/can
  • drivers/net/can


Скопируем эти поддиректории (сохраняя их структуру) из исходников ядра в директорию нашего пакета can-dkms-4.1.6–200
Создадим в директории пакета конфиг dkms.conf:

PACKAGE_NAME="can-dkms"
PACKAGE_VERSION="4.1.6-200"

MAKE[0]="make M=$dkms_tree/$PACKAGE_NAME/$PACKAGE_VERSION/build modules"
BUILT_MODULE_NAME[0]="can"
BUILT_MODULE_LOCATION[0]="net/can"
DEST_MODULE_LOCATION[0]="/updates/net/can"

BUILT_MODULE_NAME[1]="can-raw"
BUILT_MODULE_LOCATION[1]="net/can"
DEST_MODULE_LOCATION[1]="/updates/net/can"

BUILT_MODULE_NAME[2]="can-bcm"
BUILT_MODULE_LOCATION[2]="net/can"
DEST_MODULE_LOCATION[2]="/updates/net/can"

BUILT_MODULE_NAME[3]="can-gw"
BUILT_MODULE_LOCATION[3]="net/can"
DEST_MODULE_LOCATION[3]="/updates/net/can"

BUILT_MODULE_NAME[4]="vcan"
BUILT_MODULE_LOCATION[4]="drivers/net/can"
DEST_MODULE_LOCATION[4]="/updates/drivers/net/can"

BUILT_MODULE_NAME[5]="can-dev"
BUILT_MODULE_LOCATION[5]="drivers/net/can"
DEST_MODULE_LOCATION[5]="/updates/drivers/net/can"

BUILT_MODULE_NAME[6]="kvaser_usb"
BUILT_MODULE_LOCATION[6]="drivers/net/can/usb"
DEST_MODULE_LOCATION[6]="/updates/drivers/net/can/usb"

AUTOINSTALL="yes"

В конфиге указывается имя и версия пакета, команда сборки, список собираемых модулей, а также включается автосборка.

В директории пакета также необходимо создать Makefile:

# net/can
export CONFIG_CAN            := m
export CONFIG_CAN_RAW        := m
export CONFIG_CAN_BCM        := m
export CONFIG_CAN_GW         := m
export CONFIG_CAN_VCAN       := m

# drives/net/can
export CONFIG_CAN_DEV            := m
export CONFIG_CAN_KVASER_USB     := m

SRC_DIRS := net/can drivers/net/can

modules: $(SRC_DIRS)

$(SRC_DIRS):
        $(MAKE) -C /lib/modules/`uname -r`/build M="$(M)/$@" subdir-ccflags-y=-DCONFIG_CAN_CALC_BITTIMING

.PHONY: $(SRC_DIRS) modules

В Makefile задается структура поддиректорий модулей шины CAN, а также список собираемых модулей.

Таким образом, пакет DKMS для модулей шины CAN создан.
Далее необходимо зарегистрировать пакет в дереве DKMS:

sudo dkms add -m can-dkms -v 4.1.6-200

После чего создается ссылка /var/lib/dkms/can-dkms/4.1.6–200/source

Сборка и установка пакета производится командами:

sudo dkms build -m can-dkms -v 4.1.6-200
sudo dkms install -m can-dkms -v 4.1.6-200


В случае необходимости пакет можно удалить из дерева командой:

sudo dkms remove -m can-dkms/4.1.6-200 --all

При создании статьи были использованы материалы проекта aur.archlinux.org/packages/linux-can-dkms

© Habrahabr.ru