MODPROBE(8)

名前
modprobe - ローダブルモジュールの高レベル管理

書式
modprobe [-adnqv] [-C config] module [symbol=value ...]
modprobe [-adnqv] [-C config] [-t type] pattern
modprobe -l [-C config] [-t type] pattern
modprobe -c [-C config]
modprobe -r [-dnv] [-C config] [module ...]
modprobe -Vh

このマニュアルについて
このマニュアルは、Linux Kernel 2.4 の時代に使われていた modutils パッケージの modprobe の説明で、古いものです。現在ではたいていの場合、 kmod パッケージの modprobe が使われています。(2022/12/02, Linux JM Project)

オプション

-a, --all
    最初にロードに成功した後に停止するのではなく、 マッチしたモジュールをすべてロードする。

-c, --showconfig
    現在用いられている設定を表示する。

-C, --config config
    設定ファイルを /etc/modules.conf ではなく config にする。 (/etc/modules.conf はなくてもよい)。 環境変数 MODULECONF でも設定ファイルを /etc/modules.conf (あるいは推奨しないが /etc/conf.modules) から変更できる。

環境変数
    UNAME_MACHINE をセットすると、modutils は uname() システムコールの machine フィールドの 代わりにこの変数の値を用いる。 これは主に 32 ビットユーザー空間で 64 ビットモジュールをコンパイルする (またはその逆)場合に用いる。 現在の modutils はモジュールに対する完全なクロスビルドモードに対応しておらず、 ホストアーキテクチャの 32 ビット版と 64 ビット版を選択できるだけである。

-d, --debug
    モジュールのスタックの内部表現に関する情報を表示する。

-h, --help
    オプションの一覧を表示して直ちに終了する。

-k, --autoclean
    ロード済みのモジュールに "autoclean" を設定する。 カーネルが modprobe に足りない機能をモジュールとして提供するよう依頼するときに用いられる。 -k オプションを指定すると、自動的に -q オプションも有効になる。 これらのオプションは自動的に insmod に送られる。

-l, --list
    マッチするモジュールをリストする。

-n, --show
    実際には動作を行わず、何が行われるかを表示する。

-q, --quiet
    insmod がモジュールのインストールに失敗しても報告しない。 黙って他の可能性を試しながら通常のように継続する。 このオプションは自動的に insmod に送られる。

-r, --remove
    コマンドラインでモジュールが指定されればモジュール (のスタック) を削除する。 されなければ autoclean を実行する。

-s, --syslog
    標準エラー出力にではなく syslog を経由してレポートする。 このオプションは自動的に insmod に送られる。

-t moduletype; --type moduletype
    指定したタイプのモジュールだけを扱う。 modprobe は、ディレクトリパスに "/moduletype/" をこの形で含むモジュールだけしか対象にしない。 moduletype にはディレクトリを複数の階層で指定しても良い。例えば "-t drivers/net" とすれば、 xxx/drivers/net/ およびそのサブディレクトリにあるモジュールだけを 対象にする。

-v, --verbose
    すべてのコマンドを、実行される通りに表示する。

-V, --version
    modprobe のバージョンを表示する。

注意: モジュール名にはパス ('/') や末尾の '.o' を含めてはならない。 例えば、 'slip' は modprobe に対する正当なモジュール名だが、 これはコマンドラインと設定ファイルの両方に適用されるルールである。

説明
modprobe と depmodは、Linux のモジュール化されたカーネルを、 あらゆるユーザー、管理者、ディストリビューションの作成者にとって より管理しやすいものにするために作成された。

modprobe は Makefile に似た形式で依存関係を記述したファイルを用いる。 これは depmod によって作成されるもので、 あらかじめ定められたディレクトリツリーに置かれたモジュールのセットから、 関連するファイル (群) を自動的にロードするためのものである。

modprobeはモジュールのセット (単一のモジュールであることも、 依存関係にあるモジュールのスタックであることもある) のロードに用いられる。 また、特定のタグがつけられたすべてのモジュールをロードするのにも用いられる。

modprobeはモジュールスタックに必要とされるベースモジュールを、 依存関係を記述したファイル modules.dep の記述にしたがって すべてロードする。これらのモジュールのどれかをロードできないと、 現在のセッションでロードされたモジュールスタックの全体が 自動的にアンロードされることになる。

modprobeがモジュールをロードするやりかたは 2 種類ある。 ひとつめ (プローブモード) は、 (pattern で定義された) リストからモジュールをロードしようとする。 モジュールがひとつロードできると、modprobeはただちに停止する。 これはイーサネットドライバのリストから モジュールをひとつロードするような場合に利用できるだろう。

もうひとつの方では、modprobeはリストのすべてのモジュールを ロードする。以下の「例」の記述を参照のこと。

-rオプションをつけると、 modprobe は自動的にモジュールのスタックを アンロードする("rmmod -r"と同様)。 "modprobe -r"とだけすると、 使われていない autoload されたモジュールを削除すると同時に、 設定ファイル /etc/modules.conf の記述にしたがって 削除の前処理・後処理用のコマンドを実行する。

-l オプションと-tオプションを同時に指定すると、 利用可能なすべてのモジュールのうち、特定のタイプのものだけが表示される。

-cオプションを指定すると、 現在用いられている設定が表示される (デフォルト + 設定ファイル)。

設定
modprobe(とdepmod)の動作は、設定ファイル /etc/modules.confによって変更できる (このファイルはなくてもよい)。

このファイルに記述できる内容の詳細や、depmodと modprobeが用いるデフォルトの設定に関しては modules.conf(5)を参照のこと。

モジュールがカーネルによって "autoload" された場合は、 削除の前処理・後処理のコマンドは実行されないことに注意。 将来サポートされる予定の「永続型モジュール保存 (persistent module storage)」 に期待して欲しい。

削除の前後処理の機能を用いたい場合は、 kerneld の autoload を使わないようにして、 以下のような行を crontab に書きこむ必要がある (これは kmod システムによっても用いられる)。 以下では autoclean を 2 分おきに行っている。

 */2 * * * * test -f /proc/modules && /sbin/modprobe -r

動作ルール
modprobeは、現在のカーネルリリース向けにコンパイルされたモジュールを 含むディレクトリをまず最初に見る。 そこにモジュールがなければ、modprobeはカーネルバージョンに共通の ディレクトリ (2.0, 2.2 など) を見る。 そこにもモジュールがなければ、 デフォルトのリリース以外のモジュールを含むディレクトリを見る。

新しい Linux をインストールしたときは、モジュールをそのカーネルのリリース (とバージョン) に対応したディレクトリに移動すべきである。 そしてこのディレクトリから「デフォルト」のディレクトリに シンボリックリンクをはるようにする。

新しいカーネルをコンパイルして"make modules_install" コマンドを実行すると、新しいディレクトリは作成するが、 「デフォルト」のリンクは変更しない。

カーネルの配布に含まれないモジュールを入手したら、 それは /lib/modules 以下のバージョンには依存しないディレクトリに 配置するとよい。

以上がデフォルトの動作であるが、これは /etc/modules.conf の記述によって変更できる。

例

modprobe -t net
    "net" という名前のディレクトリにあるモジュールのどれかひとつをロードする。 どれかのモジュールのロードに成功するまで、各モジュールがひとつづつ試みられる。

modprobe -a -t boot
    "boot"という名前のディレクトリにあるすべてのモジュールがロードされる。

modprobe slip
    これを実行すると、 s1hc.o というモジュールがまだロードされていなければロードしようとする。 slip モジュールには s1hc モジュールの機能が必要だからである。 この依存関係は、depmodによって (これ以前に) 自動的に生成された modules.dep というファイルに記述されている。

modprobe -r slip
    slip モジュールをアンロードする。 s1hc モジュールも自動的にアンロードする (ただし ppp のような他のモジュールによって利用されていない場合)。

ファイル
/etc/modules.conf(/etc/conf.modulesも使えるが推奨しない)
/lib/modules/*/modules.dep,
/lib/modules/*

関連項目
depmod(8), lsmod(8), kerneld(8), ksyms(8), rmmod(8)

セーフモード
実効 UID が 実 UID と異なる場合、 modprobe は入力を非常に慎重に扱う。 最後のパラメータは(たとえ'-'で始まっていても)モジュール名として扱われる。 一つのモジュール名だけが指定でき、"変数=値"の形のオプション指定は禁止される。 モジュール名は常に文字列として扱われ、セーフモードではメタ展開は行われない。 しかし、設定ファイルから読み込んだデータはメタ展開を行う。

modprobe がカーネルから起動された場合、実効 UID は実 UID と異なるかもしれない。 これはカーネルが 2.4.0-test11 以上の時に真となる。 理想的な世界では modprobe は カーネルが正しいパラメータだけを modprobe に渡すと信用することが出来た。 しかし高レベルカーネルコードは未検証のパラメータを直接ユーザーから modprobe に渡すので、 少なくとも一つのローカル root exploit が発生する。 それで、もはや modprobe はカーネルからの入力を信用しない。

modprobe は環境変数が以下の文字列しか含まない場合、 自動的にセーフモードとなる。
 HOME=/
 TERM=linux
 PATH=/sbin:/usr/sbin:/bin:/usr/bin
これは昔のカーネルのように実 UID と実効 UID が同じであっても、 カーネル 2.2 から 2.4.0-test11 までの カーネルから modprobe が起動されたことを検出する。

ログ記録コマンド
/var/log/ksymoops ディレクトリが存在し、modprobe がモジュールを 読み込み・削除できるようなオプションを付けて起動されていた場合、 modprobe は実行したコマンドと返り値を /var/log/ksymoops/`date +%Y%m%d.log` のファイル名で記録する。 この自動ログ記録を停止するオプションはない。 もしこのような記録をさせたくなければ、 /var/log/ksymoops ディレクトリを作らなければよい。 もしディレクトリを作るなら、root が所有してモードは 644 か 600 にし、 毎日ぐらいのペースで insmod_ksymoops_clean を実行するべきである。

必要なユーティリティ
depmod(8), insmod(8)

注意
modprobe に与えるパターンが (シェルによって解釈されずに) 意図通りに解釈されるようにするには、 パターンにエスケープが必要となることが多いだろう。

バグ
modprobe [ -V | --version ] は直ちに終了するべきである。 しかしながら、現在はバージョン情報を表示した後、 何もオプションが指定されなかったかのように振舞う。

著者
Jacques Gelinas (jack@solucorp.qc.ca)
Bjorn Ekwall (bj0rn@blox.se)