Debian sidでLinux Kernel(5.11)をbuildするメモ

Linux kernelの新機能を試したくてディストリビューションパッケージより新しいものを使いたいことがあります．
毎回注ぎ足しつぎ足しで設定しているので実際試すと足りないパッケージ等あると思いますが大雑把に最近のkernelのbuild手順をメモしておきます．

関連パッケージの導入

$ sudo apt install build-essential fakeroot gpg2
$ sudo apt build-dep linux

ソースの入手と署名の確認

$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.11.tar.xz https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.11.tar.sign
$ unxz ./linux-5.11.tar.xz
$ gpg --verify ./linux-5.11.tar.sign
gpg: assuming signed data in './linux-5.11.tar'
gpg: Signature made Mon 15 Feb 2021 06:11:32 PM JST
gpg: using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
gpg: Good signature from "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" [unknown]
gpg: aka "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>" [undefined]
gpg: aka "Greg Kroah-Hartman <gregkh@kernel.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E
$ tar tvf ./linux-5.11.tar | lv
$ tar xf ./linux-5.11.tar
$ cd linux-5.11

sourceは kernel.org からアーカイブを入手しました．余裕があったらgitリポジトリのほうが便利だと思います．

The Linux Kernel Archives

署名は以下から確認します．

The Linux Kernel Archives – Signatures

署名はxzではなくtarに対してのものなので一旦.xzから展開した.tarで確認します．
署名チェックがOKだったら展開します．

configの作成

$ cp /boot/config-`uname -r` ./.config
$ make oldconfig

kernelの .config ファイルを現在のKernelの .config を元に作成します．
make oldconfig で差分の変更を対話形式で聞いてくるので答えていきます．すべてデフォルトにする場合は olddefconfig を使います．

$ make xconfig

カスタマイズが必要な場合は make menuconfig, nconfig 等でカスタマイズします．
GUIの場合xconfig(QT base)/gconfig(GTK+ base)などが便利だと思います．

.config が更新されます．

$ make testconfig

設定後一応テストしておきます．

セキュアブートのためのDebian UEFI証明書をコピー(セキュアブートを使わない場合はスキップ)

$ tar xf ../linux_5.10.9-1.debian.tar.xz debian/certs/

既存のDebian kernel source( apt source linux で入手可能)からコピーしてきます．(他に正攻法がある気がする)

2021-04-28 追記)
Debian pkgのLinux source から貰ってこなくても .config の CONFIG_SYSTEM_TRUSTED_KEYS を ""にすることでエラーを回避できるようです．

BuildADebianKernelPackage – Debian Wiki

@@ -9373,7 +9375,7 @@
#
CONFIG_MODULE_SIG_KEY=""
CONFIG_SYSTEM_TRUSTED_KEYRING=y
-CONFIG_SYSTEM_TRUSTED_KEYS="debian/certs/debian-uefi-certs.pem"
+CONFIG_SYSTEM_TRUSTED_KEYS=""
# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y

Linux 5.12.0 でセキュアブート出来るのを確認しました．

build

$ time make -j`nproc` bindeb-pkg
:
dpkg-deb: building package 'linux-libc-dev' in '../linux-libc-dev_5.11.0-1_amd64.deb'.
dpkg-deb: building package 'linux-image-5.11.0' in '../linux-image-5.11.0_5.11.0-1_amd64.deb'.
dpkg-deb: building package 'linux-image-5.11.0-dbg' in '../linux-image-5.11.0-dbg_5.11.0-1_amd64.deb'.
dpkg-genbuildinfo --build=binary
dpkg-genchanges --build=binary >../linux-5.11.0_5.11.0-1_amd64.changes
dpkg-genchanges: info: binary-only upload (no source code included)
dpkg-source --after-build .
dpkg-buildpackage: info: binary-only upload (no source included)
$ ls -1s ../linux*.deb
7932 ../linux-headers-5.11.0_5.11.0-1_amd64.deb
728724 ../linux-image-5.11.0-dbg_5.11.0-1_amd64.deb
52136 ../linux-image-5.11.0_5.11.0-1_amd64.deb
1124 ../linux-libc-dev_5.11.0-1_amd64.deb

buildして成功するとパッケージが生成されます．

CPU i5-3320M/RAM 16GB/SATA SSDの環境で200分程かかりました．別の作業をしながらだとさらに時間が伸びます．

kernelパッケージを導入

$ sudo apt install ../linux-image-5.11.0_5.11.0-1_amd64.deb ../linux-libc-dev_5.11.0-1_amd64.deb ../linux-headers-5
.11.0_5.11.0-1_amd64.deb

出来上がったkernelパッケージを導入します．

古いkernelパッケージの削除

古い使わなくなったKernelパッケージはディスクを消費するので(特に /boot )削除しましょう

$ dpkg -l linux-image* | grep ^ii
ii linux-image-5.10.0-4-amd64 5.10.19-1 amd64 Linux 5.10 for 64-bit PCs (signed)
ii linux-image-5.11.7 5.11.7-2 amd64 Linux kernel, version 5.11.7
ii linux-image-5.11.8+ 5.11.8+-3 amd64 Linux kernel, version 5.11.8+
$ sudo apt purge linux-image-5.11.7

インストールされているパッケージを確認して古いものを削除します．

Machine Owner Keyで署名する(セキュアブートを使わない場合はスキップ)

前もってMOK(Machine Owner Key)の用意をして設定しておきます．MOKの作成についてはこちらを．

SecureBoot – Debian Wiki

$ sudo sbsign --key ~/MOK.priv --cert ~/MOK.pem /boot/vmlinuz-5.11.0 --output vmlinuz-5.11.0
$ sudo mv ./vmlinuz-5.11.0 /boot/vmlinuz-5.11.0

Kernelに署名します．
ここでは作成したMOKの鍵( ~/MOK.priv )と証明書( ~/MOK.pem )を使い， /boot/vmlinuz-5.11.0 に署名して差し替えています．

$ find /lib/modules/5.11.0/updates/dkms/ -type f -print0 | xargs -0 -n1 sudo ./scripts/sign-file sha256 ~/MOK.priv ~/MOK.der

DKIMで作られたモジュールにも署名します．

追記 20210830)

/etc/dkms/sign_helper.sh というファイルがありました．

/etc/dkms/sign_helper.sh

#!/bin/sh
/lib/modules/"$1"/build/scripts/sign-file sha512 /root/mok.priv /root/mok.der "$2"

MOKのファイルを /root/mok/priv, /root/mok.der, /root/mok.pem としておくと dkms 実行時に自動的に署名してくれるようです．kernel install時だけでなく dkms 更新時などにも自動実行してくれるので署名し忘れが無くなって助かります．

changelog を見ると dkms 2.8.3-3 から入ったようです．

/usr/share/doc/dkms/changelog.Debian.gz

dkms (2.8.3-3) unstable; urgency=medium

* dynamically generate breaks for shim-signed in Ubuntu and Derivates

-- Gianfranco Costamagna <locutusofborg@debian.org> Wed, 29 Jul 2020 10:30:50 +0200

再起動して反映

うまく行けば新しいKernelで起動できます．
うまく行かない場合は古いKernelで起動して設定し直しましょう．

patch

kernel.orgにはパッチが2種類あります．n.y.0からの累積パッチとすぐ前のバーションからのインクリメンタルパッチがあります．

$ sudo apt install patch

patch パッケージが必要なので導入しておきます．

累積patch

上ではKernel 5.11.0をbuildしました．Kernel 5.11.7を適用します．

$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/patch-5.11.8.xz

間が空いているので累積パッチを入手します．

$ cd linux-5.11
$ xzcat ../patch-5.11.8.xz | patch -p1

sourceディレクトリに移動してパッチを適用します．

あとは上の手順と同じです．

インクリメンタルpatch

次に 5.11.7 から 5.11.8 のように1つだけアップデートしたいときのインクリメンタルパッチの手順です．

$ wget https://cdn.kernel.org/pub/linux/kernel/v5.x/incr/patch-5.11.7-8.xz

インクリメンタルパッチを入手します．

$ cd linux-5.11
$ xzcat ../patch-5.11.7-8.xz | patch -p1

sourceディレクトリに移動してパッチを適用します．

あとは上の手順と同じです．

環境

$ sudo lshw -c system -sanitize | head
computer
description: Notebook
product: 23533KJ (LENOVO_MT_2353)
vendor: LENOVO
version: ThinkPad T430s
serial: [REMOVED]
width: 64 bits
capabilities: smbios-2.7 dmi-2.7 smp vsyscall32
configuration: administrator_password=disabled chassis=notebook family=ThinkPad T430s power-on_password=disabled sku=LENOVO_MT_2353 uuid=[REM
OVED]
*-pnp00:00
$ dpkg-query -W shim-signed-common shim-unsigned linux-*5.11.8* build-essential fakeroot
build-essential 12.9
fakeroot 1.25.3-1.1
linux-headers-5.11.8+ 5.11.8+-3
linux-image-5.11.8+ 5.11.8+-3
shim-signed-common 1.33+15+1533136590.3beb971-7
shim-unsigned 15+1533136590.3beb971-10
$ lsb_release -dr
Description: Debian GNU/Linux bullseye/sid
Release: unstable
$ uname -smr
Linux 5.11.8+ x86_64