MODULES.CONF(5)

名前
modules.conf - カーネルモジュールのロードに対する設定ファイル

このマニュアルについて
このマニュアルは、Linux Kernel 2.4 の時代に使われていた modutils パッケージの設定ファイル modules.conf の説明で、古いものです。現在ではたいていの場合、kmod パッケージのユーティリティがモジュールの管理に使われており、 設定ファイルのマニュアルも modprobe.d と depmod.d の二つに別れています。(2022/12/02, Linux JM Project)

説明
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

別の設定ファイル
歴史的な理由から、もし /etc/modules.conf が存在しないと、 modutils は代わりに /etc/conf.modules を読む。 しかしこの古い名前の利用は推奨できない。 /etc/modules.conf に置き換えるべきである。 このバージョンの modutils では、 /etc/conf.modules があると警告メッセージを発する。 以降のバージョンではエラーメッセージを出して モジュールのロードを行わないことになるだろう。

関連項目
depmod(8), modprobe(8), insmod(8)

著者
Bjorn Ekwall <bj0rn@blox.se>
Keith Owens <kaos@ocs.com.au>