insmod は実行中のカーネルにモジュールをリンクし、 カーネルがエクスポートしているシンボルテーブルにある 全てのシンボルを解決しようとする。
ディレクトリや拡張子なしでモジュールファイル名を与えると、 insmod は標準のデフォルトディレクトリ(複数)からモジュールを探す。環境変数 MODPATH を使って、このデフォルト値を上書きすることができる。 /etc/modules.conf のようなモジュール設定ファイルがあれば、 こちらの内容が MODPATH での指定を上書きする。
環境変数 MODULECONF によって、 /etc/modules.conf (あるいは /etc/conf.modules (使わないほうが良い)) 以外の設定ファイルを指定することもできる。 この環境変数は、上記の指定すべてより優先される。
ksymoops シンボルは、各ローダブルモジュールごとに、 約 260 バイトを余分に必要とする。カーネル空間がキツキツで、 ksyms を最小にしたいような場合を除き、 デフォルトのままにして詳しい Oops デバッグを有効にするほうが良い。
2.0 系列のカーネル用に構築したモジュールでは、 全ての整数と文字ポインタシンボルはパラメータとして扱われ、 従ってその内容は変更されうる。 2.1 系列のカーネルからは、特定の値だけが変更されるように、 シンボルにはパラメータかどうかの印が明示的に付けられる。 また、ロード時に与えられた値をチェックするために、 追加の型情報が与えられる。
整数の場合には、全ての値は 10 進値、8 進値, 16 進値で C 言語と同じように指定できる (17, 021, 0x11 等)。 配列の要素は、値をコンマで区切って並べることにより指定する。 値を省略することにより、要素を飛ばすことができる。
2.0 系列のモジュールでは、数字で始まらない値は文字列と解釈される。2.1 以降では、値を文字列と解釈するかどうかはパラメータの型情報によって判断する。 値が二重引用符(")で始まる場合は、 エスケープシーケンスも含めて全て C 言語と同じように文字列として解釈される。 シェルのプロンプトで使う場合にはクォート自体もシェルが解釈するため、 保護しなければならない点に注意すること。
カーネルが /proc/sys/kernel/tainted flag をサポートする場合は、 insmod は GPL ライセンスを持たないモジュールのロード時に、 tainted (汚染) フラグを '1' と OR する。 カーネルが tainting をサポートしていると、 ライセンスのないモジュールがロードされる際には警告が発せられる。 警告は GPL 互換でない MODULE_LICENSE() を持つモジュールに対しては (tainting をサポートしていない古いカーネルでも)、 常に警告が発せられる。 これによって、新しいモジュールが古いカーネルで利用されるときも、 警告は最小限になる。
insmod -f (強制) モードでは、tainting をサポートするカーネルなら tainted フラグが '2' と OR され、常に警告が発せられる。
カーネル開発者の中には、彼らのコードがエクスポートするシンボルは、 GPL 互換なライセンスのモジュールからしか利用できないようにしたい、 と考えている人たちがいる。これらのシンボルは EXPOET_SYMBOL の代わりに EXPORT_SYMBOL_GPL でエクスポートされる。 カーネルや、別のモジュールによってエクスポートされた GPL オンリーのシンボルは、GPL 互換なライセンスのモジュールからしか見えない。 これらのシンボルには、 /proc/ksyms において 'GPLONLY_' というプレフィックスが付く。 insmod は GPL ライセンスのモジュールをロードするときは、 シンボルの 'GPLONLY_' プレフィックスを無視し、 通常のシンボル名の部分だけを参照する。 GPL オンリーのシンボルは GPL 互換なライセンスを持たないモジュールに対しては利用可能とならない。 ライセンスを全く持たないモジュールに対しても同様である。
__insmod_modulename_Oobjectfile_Mmtime_Vversion
objectfile は、オブジェクトのロード元のファイルの名前である。 これによって ksymoops がコードを正しいオブジェクトにマッチさせることが可能となる。 mtime はそのファイルの最終修正タイムスタンプを 16 進で表したものである。 stat に失敗すると 0 になる。 version はモジュールのコンパイル時に指定されたカーネルのバージョンで、 バージョンが取得できなければ -1 となる。 シンボル _O はモジュールヘッダと同じスタートアドレスになる。
__insmod_modulename_Ssectionname_Llength
このシンボルは指定された ELF セクションの先頭に現れる。 現在は .text, .rodata, .data, .bss である。 これが現れるのは、セクションの長さが 0 以上の場合だけである。 sectionname は ELF セクションの名前、 length は各セクションの長さの 10 進表記である。 これらのシンボルにより、 ksymoops はシンボルが使えない場合でも アドレスをセクションにマップできるようになる。
__insmod_modulename_Ppersistent_filename
モジュールが永続データとしてマークされたパラメータを持ち、 永続データを保存するファイル名が有効な場合 (上述の -e 参照) にのみ、insmod によって作成される。
モジュールにおけるカーネル Oops のデバッグにおける別の問題として、 /proc/ksyms と /proc/modules の内容が Oops とログファイル処理の間で 変わってしまう可能性がある。 この問題の処理を助けるため、 /var/log/ksymoops があると、insmod と rmmod は自動的に /proc/ksyms と /proc/modules を /var/log/ksymoops に `date +%Y%m%d%H%M%S` の prefix を付けてコピーする。 システム管理者は ksymoops に対して、 Oops のデバッグ時にどのスナップショットファイルを利用するか伝えることができる。 この自動コピーを無効にするスイッチは存在しない。 これを望まない場合は、 /var/log/ksymoops を作ってはならない。 このディレクトリを置くときには、所有者は root とし、 モードは 644 または 600 にして、 以下のスクリプトを一日一回程度実行すると良い。 このスクリプトは insmod_ksymoops_clean としてインストールされる。
#!/bin/sh # Delete saved ksyms and modules not accessed in 2 days if [ -d /var/log/ksymoops ] then set -e # Make sure there is always at least one version d=`date +%Y%m%d%H%M%S` cp -a /proc/ksyms /var/log/ksymoops/${d}.ksyms cp -a /proc/modules /var/log/ksymoops/${d}.modules find /var/log/ksymoops -type f -atime +2 -exec rm {} \; fi