NetBSD Advent Calendar 2021 12日目の記事です。今日はMODULARカーネルコンフィグを用いたカーネルビルドの話をしようと思います。
MODULARカーネルコンフィグ
ロードされているカーネルモジュールに対し、依存関係を逆に辿ることで不要なモジュールを除去してゆく方法を試していました。ただ、やはりこの方法だと手順が煩雑であり、もうちょっとスマートな方法を適用したいものです。
やはり GENERIC
カーネルコンフィグから不要な設定を削って行くのが良いのだろうかと思いながらカーネルソースを眺めていると、 MODULAR
というカーネルコンフィグがあることに気が付きました。
# head
# $NetBSD: MODULAR,v 1.12 2019/06/17 03:31:57 christos Exp $
#
# Try to exclude all the drivers in GENERIC that have been modularized
# XXX: incomplete
include "arch/amd64/conf/GENERIC"
options MODULAR # new style module(7) framework
options MODULAR_DEFAULT_AUTOLOAD
-no acpicpu* at cpu?
コメントの"XXX: incomplete"という一文が気になりますが、どうやらモジュール化可能なドライバをGENERICから除去したカーネルコンフィグのようです。
MODULARカーネルコンフィグでのビルド
MODULARカーネルコンフィグではFFS、UFSまわりのコンフィグも無効化されており、そのままカーネルをビルドすると起動時にルートパーティションが認識できず、起動できなくなります。
そこで以下のように、FFSとUFSの無効化部分をコメントアウトすることで問題を回避します。
# cd /usr/src/sys/arch/amd64/conf/
# vi MODULAR
...
# diff -u MODULAR.ORIG MODULAR
--- MODULAR.ORIG 2021-12-23 19:11:44.319848344 +0900
+++ MODULAR 2021-12-23 19:16:38.825360488 +0900
@@ -54,8 +54,8 @@
-no file-system EFS # Silicon Graphics Extent File System
-no file-system EXT2FS # second extended file system (linux)
-no file-system FDESC # /dev/fd
--no file-system FFS # UFS
--no options UFS
+#-no file-system FFS # UFS
+#-no options UFS
-no options QUOTA # legacy UFS quotas
-no options QUOTA2 # new, in-filesystem UFS quotas
-no options UFS_EXTATTR # Extended attribute support for UFS1
@@ -163,3 +163,5 @@
# userland interface to drivers, including autoconf and properties retrieval
-no pseudo-device drvctl
+
+wm* at pci? dev ? function ? # Intel 82543/82544 gigabit
#
# config MODULAR
# cd ../compile/MODULAR/
# make depend
# make
カーネルのビルドが完了したら、既存のカーネルと置き換えます。
# make install
MODULARでもbuiltinなデバイスが多い?
MODULARカーネルコンフィグでビルドしたカーネルでの起動ができました。
# uname -a
NetBSD nbsd92test 9.2 NetBSD 9.2 (MODULAR) #1: Thu Dec 23 19:19:48 JST 2021 root@nbsd92dev:/usr/src/sys/arch/amd64/compile/MODULAR amd64
modstat(8)で見てみると、 builtin
のデバイスが多いですね…。
# modstat | head
NAME CLASS SOURCE FLAG REFS SIZE REQUIRES
aac driver builtin - 1 - pci
acpidalb driver builtin - 0 - sysmon_power
aibs driver builtin - 0 - sysmon_envsys
amdsmn driver builtin - 1 - pci
amdtemp driver builtin - 0 - sysmon_envsys
amdzentemp driver builtin - 0 - sysmon_envsys,amdsmn
amr driver builtin - 1 - pci
asus driver builtin - 0 - sysmon_envsys,sysmon_power
ataraid driver builtin - 1 - -
GENERICカーネルの場合は builtin
以外のデバイスは見当たりません。
# uname -a
NetBSD nbsd92dev 9.2 NetBSD 9.2 (GENERIC) #0: Wed May 12 13:15:55 UTC 2021 mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC amd64
# modstat | grep -v builtin
NAME CLASS SOURCE FLAG REFS SIZE REQUIRES
MODULARカーネルの場合は、 filesys
関連のデバイスがモジュール化されています。
# uname -a
NetBSD nbsd92test 9.2 NetBSD 9.2 (MODULAR) #1: Thu Dec 23 19:19:48 JST 2021 root@nbsd92dev:/usr/src/sys/arch/amd64/compile/MODULAR amd64
# modstat | grep -v builtin
NAME CLASS SOURCE FLAG REFS SIZE REQUIRES
bpf driver filesys a 0 13025 bpf_filter
bpf_filter misc filesys a 1 2568 -
crypto driver filesys a 0 14268 opencrypto
kernfs vfs filesys a 0 8170 -
nfs vfs filesys a 0 133513 -
procfs vfs filesys a 0 25765 ptrace_common
ptyfs vfs filesys a 0 7202 -
sysv_ipc exec filesys a 0 25217 -
tmpfs vfs filesys a 0 16180 -
MODULARカーネルコンフィグのコメントに記載されていた "XXX: incomplete" にもあるように、カーネルのモジュラー化の作業途中にあるコンフィグのようですね。
まとめ
MODULARカーネルコンフィグを試してみた話を紹介しました。FreeBSDでもGENERICカーネルを小さくしてカーネルモジュールに切り出しているという話をFreeBSD勉強会で聞いた記憶がありますが、NetBSDでも同様の試みが進められているようです。