試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

カーネルモジュールの起動時の自動読み込みについてとOpenRC

  1. カーネルモジュールと自動検出/読み込み
  2. 追加の自動読み込みリストの場所と書式はディストリによって異なる
  3. 本題: GentooのOpenRCでは自動読み込みリストの場所が移動し、書式も変更

カーネルモジュールと自動検出/読み込み

GNU/Linuxデバイスドライバは、カーネルに組み込むか外部のモジュールにするかのどちらかの形をとる。ものによって異なるが、多くは「必要なときだけ使用される」モジュールの形にすることができるようになっている。これらの多くは起動時に自動で読み込まれる。もしくは、パッケージの設定により読み込むモジュールが決定されて、以後の起動で自動で読み込まれるようになるというもの(hwmonやALSA関係など)もある。
また、ファイルシステムのサポートもモジュールにすることができ、該当ファイルシステムを初めてマウントするときにモジュールが読み込まれるようになっている。*1同様に、通信するデータをフィルタするiptables関係なども、必要なモジュールがあれば自動的に読み込まれて使用される。
しかし、カーネルモジュールの中には、仮想デバイスやcpufreqのCPUドライバなど、自動的には読み込まれずに起動後に手動で読み込む必要のあるものもある。また、本来自動検出/読み込みされるはずのデバイスドライバなどが自動で処理されないということもあるかもしれない。

追加の自動読み込みリストの場所と書式はディストリによって異なる

OSの起動時に自動的に追加で読み込ませたいカーネルモジュールの名前をリストに記述するという仕組みは用意されていることが多い。ところが、この一覧ファイルの場所も書式もディストリによって異なる。例えば、Debian/Ubuntuでは/etc/modulesというファイルになる。
(2010/10/27)ディストリによっては/etc/modulesが存在する場合でもこれは用いられずに/etc/modprobe.preloadが用いられるようになっていることがある。

本題: GentooのOpenRCでは自動読み込みリストの場所が移動し、書式も変更

Gentoo Linuxでは、これまで/etc/modules.autoload.d/kernel-2.6という場所にその一覧のファイルが存在していたのだが、OSとしての基礎となるbaselayoutというパッケージのバージョンを2系*2に上げたところ、このファイルはなくなって、/etc/conf.d/modulesというファイルが使用されるようになった。
注意しなければならないのは、設定の書式が変更されたということ。ただ、OpenRCのインストール時に自動的に/etc/modules.autoload.d/以下のファイルからの変換*3が行われるため、それまでの設定を引き継ぐのに特に問題はない。
書式の比較としては、OpenRCへの移行に関する公式のドキュメントが詳しい。言葉で書くと下のようになるが、実際のコードを見たほうが分かりやすい。

  • 「modules="[モジュール名(スペースで区切る)]"」でカーネルのバージョンによらず読み込むモジュール一覧
  • 「modules_[バージョン(「_」で区切る)]="[モジュール名(スペースで区切る)]"」で、特定のカーネルバージョンで読み込むモジュール一覧
  • 「module_[モジュール名]_args="[モジュール引数(name1=val1 name2=val2 ...)]"」でモジュールへの引数を指定(カーネルのバージョンによらない)
  • 「module_[モジュール名]_args_[バージョン(「_」で区切る)]="[モジュール引数(name1=val1 name2=val2 ...)]"」でモジュールへの引数を指定(カーネルのバージョンを指定)

下はALSA MIDI関係の仮想デバイスを使用した指定例。

modules="snd-virmidi snd-seq-dummy"
module_snd_virmidi_args="index=2 midi_devs=2"

使用したバージョン:

  • baselayout 2.0.0
  • OpenRC 0.2.5

*1:ただし、初期RAMディスクイメージ(initrd)を使用しない場合は、起動するパーティションファイルシステムのサポートがないとカーネルパニックになって起動できない

*2:OSとしての起動プロセスを高速なOpenRCというプログラムで行うようになっていて、起動/終了の時間を大幅に短縮している

*3:OpenRCのebuildを参照