Empaquetage d’un module tiers pour Debian avec DKMS

Vincent Bernat

DKMS est un sys­tème conçu pour per­mettre la mise à jour in­di­vi­duelle de mo­dules noyau sans chan­ger le noyau en en­tier. Il est éga­le­ment très fa­cile de re­cons­truire des mo­dules lorsque vous met­tez à jour le noyau.

Sur les sys­tèmes de type De­bian1, DKMS per­met l’ins­tal­la­tion de dif­fé­rents pi­lotes, de ZFS aux mo­dules VirtualBox ou NVIDIA. Ces mo­dules ex­ternes ne sont pas dis­tri­bués sous forme bi­naire : une fois ins­tal­lés, ils doivent être com­pi­lés pour votre noyau ac­tuel. Tout se fait au­to­ma­ti­quement :

# apt install zfs-dkms
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  binutils cpp cpp-6 dkms fakeroot gcc gcc-6 gcc-6-base libasan3 libatomic1 libc-dev-bin libc6-dev
  libcc1-0 libcilkrts5 libfakeroot libgcc-6-dev libgcc1 libgomp1 libisl15 libitm1 liblsan0 libmpc3
  libmpfr4 libmpx2 libnvpair1linux libquadmath0 libstdc++6 libtsan0 libubsan0 libuutil1linux libzfs2linux
  libzpool2linux linux-compiler-gcc-6-x86 linux-headers-4.9.0-6-amd64 linux-headers-4.9.0-6-common
  linux-headers-amd64 linux-kbuild-4.9 linux-libc-dev make manpages manpages-dev patch spl spl-dkms
  zfs-zed zfsutils-linux
[…]
3 upgraded, 44 newly installed, 0 to remove and 3 not upgraded.
Need to get 42.1 MB of archives.
After this operation, 187 MB of additional disk space will be used.
Do you want to continue? [Y/n]
[…]
# dkms status
spl, 0.6.5.9, 4.9.0-6-amd64, x86_64: installed
zfs, 0.6.5.9, 4.9.0-6-amd64, x86_64: installed
# modinfo zfs | head
filename:       /lib/modules/4.9.0-6-amd64/updates/dkms/zfs.ko
version:        0.6.5.9-5
license:        CDDL
author:         OpenZFS on Linux
description:    ZFS
srcversion:     42C4AB70887EA26A9970936
depends:        spl,znvpair,zcommon,zunicode,zavl
retpoline:      Y
vermagic:       4.9.0-6-amd64 SMP mod_unload modversions
parm:           zvol_inhibit_dev:Do not create zvol device nodes (uint)

Lors de l’ins­tal­la­tion d’un nou­veau noyau, la com­pi­la­tion du mo­dule est au­to­ma­ti­que­ment dé­clenchée.

Construction d’un paquet compatible DKMS#

Sup­po­sons que vous avez mis la main sur un ser­veur avec une carte ré­seau In­tel XXV710-DA2. Cette carte est gé­rée par le pi­lote i40e. Mal­heu­reu­se­ment, elle n’est prise en charge que de­puis Li­nux 4.10 et vous uti­li­sez un noyau 4.9 issu de De­bian Stretch. DKMS four­nit ici une so­lu­tion simple !

Té­lé­char­gez les sources du pi­lote chez In­tel, dé­com­pres­sez-les dans un ré­per­toire et ajou­tez un sous-ré­per­toire debian/ avec les fi­chiers suivants :

  • debian/​changelog:

    i40e-dkms (2.4.6-0) stretch; urgency=medium
    
      * Initial package.
    
     -- Vincent Bernat <bernat@debian.org>  Tue, 27 Feb 2018 17:20:58 +0100
    
  • debian/​control:

    Source: i40e-dkms
    Maintainer: Vincent Bernat <bernat@debian.org>
    Build-Depends: debhelper (>= 9), dkms
    
    Package: i40e-dkms
    Architecture: all
    Depends: ${misc:Depends}
    Description: DKMS source for the Intel i40e network driver
    
  • debian/rules:

    #!/usr/bin/make -f
    
    include /usr/share/dpkg/pkg-info.mk
    
    %:
            dh $@ --with dkms
    
    override_dh_install:
            dh_install src/* usr/src/i40e-$(DEB_VERSION_UPSTREAM)/
    
    override_dh_dkms:
            dh_dkms -V $(DEB_VERSION_UPSTREAM)
    
    override_dh_auto_configure:
    override_dh_auto_build:
    override_dh_auto_test:
    override_dh_auto_install:
    override_dh_auto_clean:
    
  • debian/​i40e-dkms.dkms:

    PACKAGE_NAME="i40e"
    PACKAGE_VERSION="#MODULE_VERSION#"
    BUILT_MODULE_NAME[0]="$PACKAGE_NAME"
    DEST_MODULE_LOCATION[0]="/updates/dkms"
    AUTOINSTALL="YES"
    REMAKE_INITRD="YES"
    
  • debian/compat:

    9
    

Le fi­chier debian/​changelog per­met es­sen­tiel­le­ment de spé­ci­fier la ver­sion du pa­quet. Celle du pi­lote est 2.4.6. Par consé­quent, nous uti­li­sons 2.4.6-0 comme ver­sion de pa­quet. Dans debian/​rules, nous co­pions les sources du pi­lote dans /usr/​src/​i40e-2.4.6 (la ver­sion est ex­traite de debian/​changelog).

Le contenu de debian/​i40e-dkms.​dkms est dé­crit en dé­tail dans la page de ma­nuel dkms(8). Le pi­lote i40e est as­sez stan­dard et dkms sait com­ment le com­pi­ler. Ce­pen­dant, si un mo­dule noyau ne suit pas les conven­tions ha­bi­tuelles, c’est le bon en­droit pour rem­pla­cer la com­mande de construction.

Une fois tous les fi­chiers en place, vous pou­vez trans­for­mer le ré­per­toire en un pa­quet De­bian à l’aide, par exemple, de la com­mande dpkg-buildpackage com­mand2. Vous ob­te­nez un pa­quet com­pa­tible DKMS : i40e-dkms_​2.4.6-0_​all.​deb. Pla­cez le dans votre dé­pôt in­terne et ins­tal­lez-le sur le ser­veur cible.

Éviter la phase de compilation#

Mise à jour (03.2024)

Les main­te­neurs de DKMS ont sup­primé la com­mande dkms mkbmdeb. Cela concerne les ver­sions à par­tir de la 2.8.8, y com­pris celles four­nies dans De­bian Book­worm et Ubuntu Noble. Voir le bug De­bian #1009179 pour plus d’in­for­mations.

Mise à jour (09.2026)

Pour la rem­pla­cer, vous pou­vez uti­li­ser dkms-mkbmdeb, un script avec les mêmes fonc­tion­na­li­tés. Échan­gez dkms mkbmdeb avec dkms-mkbmdeb dans l’exemple ci-des­sous. Merci à Gavin !

Si la pré­sence d’ou­tils de dé­ve­lop­pe­ment sur un ser­veur en pro­duc­tion vous rend ner­veux, il y a une so­lu­tion ! De­puis la ver­sion 2.2.0.3-53, grâce à Thijs Kin­khorst, dkms peut construire des pa­quets conte­nant uni­que­ment les mo­dules pré­com­pi­lés. Pour chaque ver­sion du noyau, un tel pa­quet peut être construit via votre sys­tème d’in­té­gration :

KERNEL_VERSION=4.9.0-6-amd64 # could be a Jenkins parameter
apt -qyy install \
      i40e-dkms \
      linux-image-${KERNEL_VERSION} \
      linux-headers-${KERNEL_VERSION}

DRIVER_VERSION=$(dkms status i40e | awk -F', ' '{print $2}')
dkms mkbmdeb i40e/${DRIVER_VERSION} -k ${KERNEL_VERSION}

cd /var/lib/dkms/i40e/${DRIVER_VERSION}/bmdeb/
dpkg -c i40e-modules-${KERNEL_VERSION}_*
dpkg -I i40e-modules-${KERNEL_VERSION}_*

Voici la sor­tie abré­gée des deux der­nières commandes :

# dpkg -c i40e-modules-${KERNEL_VERSION}_*
[…]
-rw-r--r-- root/root    551664 2018-03-01 19:16 ./lib/modules/4.9.0-6-amd64/updates/dkms/i40e.ko
[…]
# dpkg -I i40e-modules-${KERNEL_VERSION}_*
 new debian package, version 2.0.
[…]
 Package: i40e-modules-4.9.0-6-amd64
 Source: i40e-dkms-bin
 Version: 2.4.6
 Architecture: amd64
 Installed-Size: 555
 Depends: linux-image-4.9.0-6-amd64
 Provides: i40e-modules
 Section: misc
 Priority: optional
 Description: i40e binary drivers for linux-image-4.9.0-6-amd64
  This package contains i40e drivers for the 4.9.0-6-amd64 Linux kernel,
  built from i40e-dkms for the amd64 architecture.

Le pa­quet De­bian ainsi créé contient le pi­lote pré­com­pilé et ne dé­pend que du noyau as­so­cié. Vous pou­vez l’ins­tal­ler sans ti­rer des di­zaines de dé­pen­dances sup­plé­mentaires.