NetBSDのMODULARカーネルコンフィグを試してみる

[NetBSD Advent Calendar 2021](https://qiita.com/advent-calendar/2021/netbsd) 12日目の記事です。今日はMODULARカーネルコンフィグを用いたカーネルビルドの話をしようと思います。

## MODULARカーネルコンフィグ

ロードされているカーネルモジュールに対し、依存関係を逆に辿ることで不要なモジュールを除去してゆく方法を試していました。ただ、やはりこの方法だと手順が煩雑であり、もうちょっとスマートな方法を適用したいものです。

やはり `GENERIC` カーネルコンフィグから不要な設定を削って行くのが良いのだろうかと思いながらカーネルソースを眺めていると、 `MODULAR` というカーネルコンフィグがあることに気が付きました。

```sh
# 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まわりのコンフィグも無効化されており、そのままカーネルをビルドすると起動時にルートパーティションが認識できず、起動できなくなります。

![nbsd1212_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/b90c12f6-ee91-8f85-32a4-30ce5dfc7387.png)

そこで以下のように、FFSとUFSの無効化部分をコメントアウトすることで問題を回避します。

```sh
# 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
```

カーネルのビルドが完了したら、既存のカーネルと置き換えます。

```sh
# make install
```

## MODULARでもbuiltinなデバイスが多い？

MODULARカーネルコンフィグでビルドしたカーネルでの起動ができました。

```sh
# 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)](https://man.netbsd.org/NetBSD-9.2/i386/modstat.8)で見てみると、 `builtin` のデバイスが多いですね…。

```sh
# 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` 以外のデバイスは見当たりません。

```sh
# 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` 関連のデバイスがモジュール化されています。

```sh
# 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勉強会](https://freebsdstudy.connpass.com/)で聞いた記憶がありますが、NetBSDでも同様の試みが進められているようです。