NetBSD Advent Calendar 2021 11日目の記事です。今日は10日目の記事で紹介した、カーネルモジュールの依存関係可視化の結果を応用して、不要なカーネルモジュールの除去手順を紹介しようと思います。
compatモジュール
カーネルモジュールの依存関係を眺めていると、 compat_*
という名称のモジュールが存在していることが分かります。どうやらNetBSDのシステムコールについて、後方互換性を持たせるための機能のようです。
この compat_*
モジュールを例に、依存関係にあるモジュールの除去を試してみます。
カーネルモジュールの除去
カーネルモジュールの依存図を参照しながら modunload
コマンドでモジュールを除去してみます。
例として、 compat_netbsd32_16
と compat_16
を除去してみます。
# modstat | egrep 'NAME|compat_16|compat_netbsd32_16'
NAME CLASS SOURCE FLAG REFS SIZE REQUIRES
compat_16 exec builtin - 1 - compat_20
compat_netbsd32_16 exec builtin - 0 - compat_netbsd32_20,compat_16
依存図から compat_16
は compat_netbsd32_20
に必要とされている(依存している)ことが分かります。 modstat
コマンドの出力においても、 compat_netbsd32_16
のREQURESに compat_16
が表示されていることと、 compat_16
のREFSが 1
になっており、別のモジュールから参照されていることが分かります。
ここで、試しに compat_16
をアンロードしてみます。 compat_netbsd32_16
に必要とされていることから、アンロード処理はエラーとなります。
# modunload compat_16 ; echo $?
modunload: compat_16: Device busy
1
次に compat_netbsd32_16
→ compat_16
の順番でアンロードしてみます。
# modunload compat_netbsd32_16 ; echo $?
0
# modunload compat_16 ; echo $?
0
今度は無事にアンロードできました。ただし、 modstat
で確認してみるとカーネルに組み込まれた"builtin"なモジュールはメモリから解放されるのではなく、単に参照されなくなる( REFS
が -1
になる)だけのようです。そのため、本当に不要なモジュールを読み込ませたくない場合はカーネルコンフィグ側で設定することになりそうです。
# modstat | egrep 'NAME|compat_16|compat_netbsd32_16'
NAME CLASS SOURCE FLAG REFS SIZE REQUIRES
compat_16 exec builtin - -1 - compat_20
compat_netbsd32_16 exec builtin - -1 - compat_netbsd32_20,compat_16
まとめ
カーネルモジュールの依存図をもとに不要なモジュールの削除を試してみました。ただし、カーネルに組み込まれているモジュールについては単に参照されなくなるだけであり、モジュール自体を読み込ませないようにするにはカーネルコンフィグ側で設定を行ったのち、カスタムカーネルを作成する必要があるようです。