説明
modprobe(8) (および depmod(8)) の動作は、設定ファイル /etc/modules.conf によって変更できる (このファイルは無くてもよい)。
設定ファイルは行単位で解釈される。
全ての空行と、'#' 文字以降の行末までは無視される。
行末が '\' になっている行は次の行に継続する。
残りは指定行 (directive) であり、
すべて以下のフォーマットのいずれかに従う:
[add] above module module_list alias alias_name result [add] below module module_list define VARIABLE WORD depfile=A_PATH else elseif EXPRESSION endif if EXPRESSION include PATH_TO_CONFIG_FILE insmod_opt=GENERIC_OPTIONS_TO_INSMOD install module command ... keep [add] options module MODULE_SPECIFIC_OPTIONS path=A_PATH path[TAG]=A_PATH generic_stringfile=A_PATH pcimapfile=A_PATH isapnpmapfile=A_PATH usbmapfile=A_PATH parportmapfile=A_PATH ieee1394mapfile=A_PATH pnpbiosmapfile=A_PATH [add] probe name module_list [add] probeall name module_list prune filename post-install module command ... post-remove module command ... pre-install module command ... pre-remove module command ... remove module command ... persistdir directory_name
各指定行に与える引数の解釈では、シェルのメタキャラクタが有効になる。 すなわち、ワイルドカードやコマンドのバッククォートといった、 シェルでの技が利用できる。
path[misc]=/lib/modules/1.1.5?/local path[net]=/lib/modules/`uname -r`/net
危険: ユーザーが指定した入力にシェル展開を適用するのは 大きなセキュリティ上のリスクがある。 modutils は信頼できるデータに対してのみシェルコマンドのメタ展開を行う。 基本的にこれは設定ファイルのデータのみを展開することを意味する。 modutils では、ユーザーは modprobe を (自分自身の設定ファイルを指定して) root 権限で実行することはできない、と仮定している。 ユーザーからの入力を指定して modutils を root 権限で起動するプログラム (カーネルを含む) は、正確に一つだけのユーザー入力パラメータを渡し、 かつセーフモードに設定しないと、ローカルで root を奪取される危険がある。 セーフモードの詳細については modprobe を参照のこと。
各指定は複数回繰り返してもよい。 指定によっては、前に add を置くこともできる。これがないと、指定した module_list が以前の module_list を置き換えるが、 これがあると module_list が以前の module_list に追加される。
記法 (SEMANTICS)
A_PATH はターゲットへの完全なパス名である。 `uname -r` や `kernelversion`. といったシェルのメタキャラクタを A_PATH に用いてもよい。これらの 2 つのコマンドは、 (modprobe や depmod のような) ユーティリティの内部でも、 現在のカーネルのリリースとバージョン (それぞれ 2.2.3 や 2.2 など) を表すものとして認識されている。
WORD は空白文字以外からなるシーケンスである。 もし ' や " や ` が文字列にあると、 対応する ', ", ` にマッチするまでの全ての文字 (空白文字も) がその文字列に含まれることになる。 全ての WORD は、その後メタキャラクタのルールにしたがって展開される。 展開した結果が二つ以上のワードになった場合は、 結果のうち最初のワードだけが用いられる。
EXPRESSION は以下のいずれかである。
- WORD compare_op WORD
- compare_op は ==, !=, <, <=, >=, > のいずれかである。 両 WORD が文字列として比較される。
- -n WORD compare_op WORD
- compare_op は ==, !=, <, <=, >=, > のいずれかである。 両 WORD が数値として比較される。
- WORD
- WORD の展開に失敗するか、 展開した結果が "0" (zero), "false", "" (empty) のいずれかであれば、展開結果の値は FALSE となる。 それ以外の場合は展開結果の値は TRUE となる。
- -f FILENAME
- FILENAME が存在するかどうかのテスト。
- -k
- "autoclean" が有効になっているかどうか (すなわちカーネルから呼ばれたかどうか) のテスト。
- ! EXPRESSION
- 式の否定も式である。
文法 (SYNTAX)
以下に有効な指定について説明する。- define VARIABLE WORD
- putenv(VARIABLE=WORD) を実行する。この指定は変数の作成・変更のいずれも行える。 変数は環境に作られるので、 現在のセッションで実行される全てのコマンドから利用できる。
- depfile=A_PATH
- 依存関係ファイルへのパス。 これは depmod によって作成され、 modprobe によってモジュールとその依存モジュールを探すために利用される。 通常はデフォルトの値を用いるべきである。以下を参照のこと。
- if EXPRESSION
-
式
EXPRESSION
が
TRUE
と解釈されたら、
else, elseif, endif
のいずれかにマッチするまでの全ての指定行が実行される。
FALSE
と解釈されたら、それらの指定行は無視される。
if
行は、内部の最大値である 20 までネストできる。
注意: path 指定行を条件式内部で処理することは避けて欲しい。 modprobe には「賢い頭脳」が組み込まれているので、 path 指定行の条件処理は、単に混乱を生むだけである。ほんとです。 - else
- これより前での if または elseif 指定行での式の評価が FALSE であり、 else があれば、ここまでの指定行は無視され、 これ以降 endif までの指定行が処理される。
- elseif EXPRESSION
- これより前に置かれた if または elseif での式評価の結果が FALSE で、ここでの式評価の結果が TRUE であれば、次に elseif, else, endif のいずれかが現れるまでの指定行が処理される。
- endif
-
これは設定ファイルにおける条件処理を制御する
if, elseif, else
のチェインを終了させる。
if EXPRESSION any config lines elseif EXPRESSION any config lines else any config lines endif
else と elseif は無くてもよい。
- include PATH_TO_CONFIG_FILE
- 別々のプラットフォームや設定を一つの設定ファイルで扱うのは、 非常に複雑になる場合がある。 if の条件によって include 指定行を用いれば、この取り扱いは簡単になる。
- insmod_opt=GENERIC_OPTIONS_TO_INSMOD
- insmod に (他では指定できないような) 特殊なオプションが必要な場合は、 このオプションで起動の度にそれらを追加することが可能である。 特殊な状況を除いて、 通常は insmod の標準的なデフォルトのオプションを変更する必要はない。
- keep
- このワードが path の記述を含む行の前に置かれた場合は、 デフォルトのパスのセットは保存され、それに追加される。 これがない場合の通常の振舞いでは、 パスのセットが設定ファイルで置き換えられる。
- path=A_PATH
- path[TAG]=A_PATH
-
A_PATH
引数はモジュールを探すディレクトリの追加分を指定する。
path
指定行は、オプションのタグをとることができる。
これはそのモジュールの目的に関する情報を多少なりとも示し、
また
modprobe
の動作をいくらか自動化する。
この "path" キーワードに追加されるタグは角括弧 [] で括られる。
タグがない場合は、 "misc" タグが指定されたかのように動作する。
非常に有用なタグとして、 boot がある。これはブート時にロードしなければならないモジュールを 保有しているすべてのディレクトリをマークするために利用できる。
なお keep 指定行を使えば、 path 指定行によるデフォルトのパスの置き換えを防ぐことができる。 - generic_stringfile=A_PATH
- これは generic_string ファイルへのパスである。このファイルは depmod によって作成され、モジュールからの文字列情報が必要な インストールスクリプトが利用する。 通常はデフォルトの値を用いるべきである。以下を参照のこと。
- pcimapfile=A_PATH
- これは pcimap ファイルへのパスである。このファイルは depmod によって作成され、インストールスクリプトが pci デバイスをサポートするモジュールを検索する際に用いられる。 通常はデフォルトの値を用いるべきである。以下を参照のこと。
- isapnpmapfile=A_PATH
- これは isapnpmap ファイルへのパスである。このファイルは depmod によって作成され、インストールスクリプトが ISA PNP デバイスをサポートするモジュールを検索する際に用いられる。 通常はデフォルトの値を用いるべきである。以下を参照のこと。
- usbmapfile=A_PATH
- これは usbmap ファイルへのパスである。このファイルは depmod によって作成され、インストールスクリプトが USB デバイスをサポートするモジュールを検索する際に用いられる。 通常はデフォルトの値を用いるべきである。以下を参照のこと。
- parportmapfile=A_PATH
- これは parportmap ファイルへのパスである。このファイルは depmod によって作成され、インストールスクリプトが parport デバイスをサポートするモジュールを検索する際に用いられる。 通常はデフォルトの値を用いるべきである。以下を参照のこと。
- ieee1394mapfile=A_PATH
- これは ieee1394map ファイルへのパスである。このファイルは depmod によって作成され、インストールスクリプトが ieee1394 デバイスをサポートするモジュールを検索する際に用いられる。 通常はデフォルトの値を用いるべきである。以下を参照のこと。
- pnpbiosmapfile=A_PATH
- これは pnpbiosmap ファイルへのパスである。このファイルは depmod によって作成され、インストールスクリプトが pnpbios デバイスをサポートするモジュールを検索する際に用いられる。 通常はデフォルトの値を用いるべきである。以下を参照のこと。
- alias alias_name result
-
"alias" 指定行はモジュールに別名をつけるために用いる。
/etc/modules.conf に
alias iso9660 isofs
のような行があれば、実際にはそのようなモジュールがなくても modprobe iso9660 のように書くことができるようになる。
なおalias some_module off
という行は、modprobe にそのモジュールのロード要求を無視させる。 また
alias some_module null
というエイリアスは、some_module への要求を常に成功させるが、 しかし実際にはそのモジュールはインストールされない。 これは above や below 指定行で作成されるスタックのベースとして利用できる。
-
alias
指定のレベルは深くなっても良い
(訳注: alias の alias の alias... としてかまわない)。
全てのエイリアスは、
実際に物理的に存在しているモジュールを探すべく、再帰的に展開される。
エイリアスの実際の深さの限界は、おおよそ 1000 程度になっている。
これは以下のようなループを検知するためである。
alias a b alias b a
alias マッピングの最終的な結果がいずれのモジュールにもマッチしなければ、 modprobe はその結果に probe と probeall をマップする。 これらも成功しなければ、そのモジュールは見付からなかったことになる。 したがって以下のような指定は気が利いていると言える (devfs より)。
alias /dev/sg* /dev/sg probeall /dev/sg scsi-hosts sg
モジュール A が実際に存在する場合にも、モジュール A をモジュール B への エイリアスとしてマップすることはできる。 しかしこれは誤解の元であるので推奨できない。 歴史的な理由から、カーネルのサウンドシステムには sound.o というモジュールがある。しかしサウンドの開発者たちも、 sound をユーザサウンドカード用モジュールへのエイリアスとしたい、 すなわち "alias sound sb" としたいことがあるかもしれない。 この要求をサポートし、 なおかつ「オプションをエイリアスに与えることが可能」 という定められた動作を維持するために、 modprobe はモジュール名のエイリアス展開を、 その名前が modules.dep に見付かった場合には行わない (見付からなければ展開する)。 これはエイリアスと実際のモジュールのあり得る全ての組み合わせに対して 期待された動作をするとは限らないので、 実際に存在するモジュールと同じ名前へのエイリアスは避けるべきなのである。
- [add] probe name module_list
- [add] probeall name module_list
- これらの指定行は name が modprobe のコマンドラインで要求されたモジュール名である場合に限って利用できる。 効果としては、 name への要求があると、 module_list にあるモジュールが、 指定の順序で試される。二つの指定行の違いは、 probe はモジュールの挿入が一度成功すればそこで試行を終了するのに対して、 probeall はリストの最後まで続ける点にある。 終了ステータスは、いずれかのモジュールのインストールに 成功したかどうかを反映する。 add が前に付加されると、新しいリストを前のリストに置き換えるのではなく追加する。
- prune filename
- インストールされているカーネルに対するモジュールディレクトリのトップには、 モジュールではないファイルがおかれている。 これらには modules.dep, modules.generic_string, modules.pcimap, modules.isapnpmap, modules.usbmap, modules.parportmap, modules.ieee1394map, modules.pnpbiosmap のほか、 カーネルソースツリーへのビルド用 symlink など、インストールプロセスが ビルドツリーから保存しておきたいと考えたファイルが含まれる。 これらに対して depmod が "not an ELF file" という警告を発するのをやめさせるには、 これらのモジュールでないファイルが prune リストに入っていなければならない。 depmod は組み込みの prune リストを持っており、これにはいかなるカーネルビルドに おいても存在するファイルが含まれているので、削除することはできない。 自分のファイルをこのモジュールディレクトリのトップに追加したら、 各 filename に対して prune 宣言を加えると良い。 注意: prune リストは path のトップディレクトリをスキャンするとき、 かつそのディレクトリが標準的なサブディレクトリ名リスト以下、 高々一つのサブディレクトリしか含まない場合にしか (すなわちカーネルのインストールでビルドされた トップディレクトリのように見える場合にしか) 参照されない。 prune リストは path のサブディレクトリには効力を持たない。
- [add] options [-k] module [MODULE_SPECIFIC_OPTIONS]
-
エイリアスされた名前も含め、すべてのモジュール名はそれぞれ固有の
options
指定行を持つことができる。
エイリアスに対して指定されたオプションは、
より「基本的な」名前に対して指定されたオプションよりも高い優先度を持つ。
このルールは
options
指定行の衝突を解決する際に利用される。
コマンドラインで指定されたオプションは、最も高い優先度を持つ。
モジュール名の前に
-k
があると、たとえ
modprobe
が autoclean オプション
-k
で実行されていた場合でも、モジュールは autoclean されなくなる。
add
が前に付加されると、新しいリストを前のリストに置き換えるのではなく追加する。
alias
の結果が実際のモジュールでなければ、その
alias
のチェーンによって構成された
options
は、probe[all] を呼ぶ前に捨てられる。
MODULE_SPECIFIC_OPTIONS
のどれかにシェルにとって特別な文字 (スペース・コンマ・括弧)
が含まれている場合には、そのオプションは '"..."'
で括らなければならない。 '' は
modules.conf の内部でオプションを区切り、 "" は
オプションがシェルに渡されるときにそれを区切る。以下に例を示す。
abc='"def,ghi jkl (xyz)"'
- [add] above module module_list
- この指定行は、あるモジュールのモジュールスタックの上に 他のモジュールセットを "pull in" するのに利用できる。 結果は lsmod(8) コマンドの出力で見ることができる。 above 指定行は依存関係が modules.dep ファイルには記述できないほど複雑なような状況下で有用である。 これは post-install および pre-remove 指定行の最適化された場合であるとみなすことができる。 モジュールのインストールに失敗しても、 modprobe の終了ステータスには影響しないことに注意。 add が前に付加されると、新しいリストを前のリストに置き換えるのではなく追加する。
- [add] below module module_list
- この指定行は、あるモジュールのモジュールスタックの下に 他のモジュールセットを "push" するのに利用できる。 結果は lsmod(8) コマンドの出力で見ることができる。 below 指定行は依存関係が modules.dep ファイルには記述できないほど複雑なような状況下で有用である。 これは pre-install および post-remove 指定行の最適化された場合であるとみなすことができる。 モジュールのインストールに失敗しても、 modprobe の終了ステータスには影響しないことに注意。 add が前に付加されると、新しいリストを前のリストに置き換えるのではなく追加する。
以下の指定行はモジュールのロード・アンロードの際に 特定のコマンドを実行したい場合に利用できる (指定しなくてもよい)。 エイリアスされたモジュール名に対してもこれらの指定は可能で、 エイリアス展開後のモジュール名に対する指定が他にあれば、 それらとともに適切な順序で実行される。
- pre-install module command
- 指定したモジュールをインストールする前に command を実行する。 below 指定行も参照のこと。
- install module command
- 指定したモジュールをインストールする際に、デフォルトの insmod ではなく command を実行する。
- post-install module command
- 指定したモジュールをインストールした後に command を実行する。 above 指定行も参照のこと。
- pre-remove module command
- 指定したモジュールを削除する前に command を実行する。 above 指定行も参照のこと。
- remove module command
- 指定したモジュールを削除する際に、デフォルト (組み込み) の rmmod ではなく command を実行する。
- post-remove module command
- 指定したモジュールを削除した後に command を実行する。 below 指定行も参照のこと。
- persistdir=directory_name
- rmmod が永続モジュールパラメータを含むモジュールを削除する時、 (おそらく) 修正されたパラメータを directory_name の下に保存する。 modprobe が永続モジュールパラメータを含むモジュールをロードする時、 以前の値を directory_name の下から探す。 persistdir はモジュールがロードされた時に読み込み可能で、 モジュールがアンロードされた時に書き込み可能でなければならない。 デフォルト値は /var/lib/modules/persist である。 多くの Linux ディストリビューションはファイルシステムをマウントする前に モジュールをロードするが、これは永続データに関する問題を引き起こすかもしれない。 /var が別のパーティションにあって、モジュールがロードされてからマウントされる場合、 insmod は永続データを読み込めない。 /var が別のパーティションにある場合には、二つの選択肢がある。
- 1) persistdir にルートパーティションのディレクトリ、 例えば /lib/modules/persist を指定する。 これは rmmod が実行されるときにルートパーティションが書き込み可能であることを仮定している。
- 2) ファイルシステム関係のモジュールを全て最初にロードし、 /var パーティションをマウントし、それから残りのモジュールをロードする。 これはファイルシステムに永続データがないことを仮定している。
デフォルトの設定
設定ファイル '/etc/modules.conf' がない場合や、 あるいは指定行の上書き変更がない場合には、 以下のデフォルトが用いられる。
depfile=/lib/modules/`uname -r`/modules.dep generic_stringfile=/lib/modules/`uname -r`/modules.generic_string pcimapfile=/lib/modules/`uname -r`/modules.pcimap isapnpmapfile=/lib/modules/`uname -r`/modules.isapnpmap usbmapfile=/lib/modules/`uname -r`/modules.usbmap parportmapfile=/lib/modules/`uname -r`/modules.parportmap ieee1394mapfile=/lib/modules/`uname -r`/modules.ieee1394map pnpbiosmapfile=/lib/modules/`uname -r`/modules.pnpbiosmap path[boot]=/lib/modules/boot path[toplevel]=/lib/modules/`uname -r` path[toplevel]=/lib/modules/`kernelversion` path[toplevel]=/lib/modules/default path[toplevel]=/lib/modules persistdir=/var/lib/modules/persist
alias と options 指定行に対しても一連のデフォルト設定がある。 このセットは継続的に拡張されているので、ここにはリストしない。 (現在の) デフォルトのセットは、 /etc/modules.conf ファイルがないときに modprobe -c コマンドを実行すれば閲覧できる。
全ての options 指定行は、以下のようにモジュールに必要なオプションを指定する。
modprobe de620 bnc=1
これらのオプションは /etc/modules.conf ファイルに与えられているオプションと、 modprobe のコマンドラインによって上書きされる。
エイリアスされたモジュールにも options 指定行は (されていないモジュールと) 同じように使うことができる。 これは例えばダミーのモジュールに便利である。
alias dummy0 dummy options dummy0 -o dummy0