Linux / Unixコマンド:insmod

Linux / Unixのコマンドinsmod 実行中のカーネルにローダブルモジュールインストールします。 insmodは、カーネルのエクスポートされたシンボルテーブルからすべてのシンボルを解決することによって、実行中のカーネルにモジュールをリンクしようとします。

モジュールファイル名がディレクトリや拡張子なしで指定された場合、 insmodはいくつかの一般的なデフォルトディレクトリでモジュールを検索します。 環境変数MODPATHを使用して、このデフォルトを上書きすることができます。 /etc/modules.confなどのモジュール構成ファイルが存在する場合、 MODPATHに定義されているパスが上書きされます

環境変数MODULECONFを使用して、デフォルトの/etc/modules.conf (または/etc/conf.modules (非推奨))から別の設定ファイルを選択することもできます。 この環境変数は、上のすべての定義を上書きします。

環境変数UNAME_MACHINEが設定されている場合、modutilsはuname()システムコールのマシンフィールドの代わりにその値を使用します。 これは主に、32ビットユーザー空間で64ビットモジュールをコンパイルする場合、またはその逆の場合に使用します.UNAME_MACHINEをモジュールの種類に設定します。 現在のmodutilsは、モジュールの完全なクロスビルドモードをサポートしていませんが、32ビットと64ビットのバージョンのホストアーキテクチャを選択することに限定されています。

オプション

-e persist_name 、-- persist = persist_name

このモジュールのインスタンス化がアンロードされたときに、モジュールの永続データが読み込まれてから読み込まれる場所を指定します。 モジュールに永続データがない場合、このオプションは暗黙のうちに無視されます。 永続的なデータは、このオプションが存在する場合のみinsmodによって読み込まれます。デフォルトでは、 insmodは永続データを処理しません。

省略形として、 -e "" (空の文字列)は、 insmodによって、 modules.confに定義されているpersistdirの値として解釈され、モジュールの検索パスを基準にしたモジュールのファイル名末尾の ".gz"、 ".o"または ".mod"。 modules.confが " persistdir = "(つまり、 persistdirが空のフィールドである)を指定している場合、この短縮形は暗黙のうちに無視されます。 ( modules.conf (5)を参照してください)。

-f 、-- force

実行中のカーネルのバージョンとモジュールがコンパイルされたカーネルのバージョンが一致しなくても、モジュールをロードしようとします。 これは、カーネルのバージョンチェックをオーバーライドするだけであり、シンボル名のチェックには影響しません。 モジュール内のシンボル名がカーネルと一致しない場合、 insmodにモジュールを強制的にロードする方法はありません。

-h 、-- help

オプションの要約を表示してすぐに終了します。

-k 、-- autoclean

モジュールの自動クリーニングフラグを設定します。 このフラグはkerneld (8)によって、ある時間(通常は1分)使用されていないモジュールを削除するために使用されます。

-L 、-- lock

flock (2)を使用すると、同じモジュールの同時ロードを防ぐことができます。

-m 、-- map

stdoutにロードマップを出力すると、カーネルパニック時にモジュールのデバッグが容易になります。

-n 、-- noload

ダミーを実行し、モジュールをカーネルにロードする以外はすべて実行します。 -mまたは-Oで要求された場合、実行によってマップまたはblobファイルが生成されます。 モジュールがロードされていないので、実際のカーネルロードアドレスは不明であるため、マップファイルとBLOBファイルは任意のロードアドレス0x12340000に基づいています。

-o module_name 、-- name = module_name

ソースオブジェクトファイルのベース名から名前を派生させるのではなく、モジュールに明示的に名前を付けます。

-O blob_name 、-- blob = blob_name

blob_nameにバイナリオブジェクトを保存します。 その結果、バイナリBLOB(ELFヘッダーなし)がセクションの操作と再配置の後にカーネルにロードされるものを正確に示します。 オプション-mは、オブジェクトのマップを取得するために推奨されます。

-p 、-- probe

モジュールが正常にロードされたかどうかを調べます。 これには、モジュールパス内のオブジェクトファイルの検索、バージョン番号のチェック、およびシンボルの解決が含まれます。 再配置をチェックしたり、マップやBLOBファイルを生成したりしません。

-P 接頭辞 、-- prefix = 接頭辞

このオプションは、シンボル名に余分な接頭辞が追加されているため、SMPまたはbigmemカーネルのバージョン管理されたモジュールで使用できます。 カーネルがシンボルバージョンでビルドされている場合、 insmodは自動的に "get_module_symbol"または "inter_module_get"の定義から接頭辞を抽出します。その1つはモジュールをサポートするカーネルに存在しなければなりません。 カーネルにシンボルバージョンがないのに、モジュールがシンボルバージョンでビルドされている場合、ユーザーは-Pを指定する必要があります。

-q 、-- quiet

未解決のシンボルのリストは印刷しないでください。 バージョンの不一致については不平を言ってはいけません。 この問題は、 insmodの終了ステータスにのみ反映されます。

-r- root

一部のユーザーは、非rootユーザーIDの下でモジュールをコンパイルし、rootとしてモジュールをインストールします。 このプロセスは、modulesディレクトリがrootによって所有されていても、root以外のユーザIDが所有するモジュールを残すことができます。 ルート以外のユーザーIDが侵害された場合、侵入者はそのユーザーIDが所有する既存のモジュールを上書きし、このエクスポージャーを使用してルートアクセスまでブートストラップすることができます。

デフォルトでは、modutilsはrootが所有していないモジュールの使用を拒否します。 -rを指定すると、チェックがトグルされ、rootがroot以外のモジュールをロードできるようになります。 注:ルートチェックのデフォルト値は、modutilsの設定時に変更できます。

設定時に-rを使用してルートチェックを無効にするか、またはデフォルトを「no root check」に設定することがセキュリティ上の大きな問題であり、推奨されません。

-s- syslog

ターミナルの代わりにすべてをsyslog (3)に出力します。

-S 、-- kallsyms

カーネルがそれをサポートしていなくても、ロードされたモジュールに強制的にkallsymsデータを持たせます。 このオプションは、 kallsymsデータなしでカーネルがロードされるが、選択されたモジュールがデバッグにkallsymsを必要とする小型システム向けです。 このオプションはRed Hat Linuxのデフォルトです。

-v 、-- verbose

冗長にする。

-V 、-- version

insmodのバージョンを表示します。

-X 、-- export ; -x 、-- noexport

モジュールの外部シンボルのすべてをエクスポートしたり、エクスポートしたりしないでください。 デフォルトでは、シンボルがエクスポートされます。 このオプションは、モジュールが独自の制御されたシンボルテーブルを明示的にエクスポートしないので非推奨になる場合にのみ有効です。

-Y 、-- ksymoops ; -y 、-- noksymoops

ksymoopsにksymoopsシンボルを追加しないでください。 これらのシンボルは、このモジュールにOopsがある場合、より良いデバッグを提供するためにksymoopsによって使用されます。 デフォルトでは、 ksymoopsシンボルが定義されます。 このオプションは、 -X / -xオプションとは独立しています。

ksymoopsシンボルは、ロードされたモジュールあたり約260バイトを追加します。 カーネル空間が不足していてksymsを最小サイズに縮小しようとしている場合を除き、デフォルトを採用し、より正確なOopsのデバッグを取得してください。 永続的なモジュールデータを保存するには、 ksymoopsシンボルが必要です。

-N 、 - 数値のみ

モジュールバージョンの数値部分をカーネルバージョンと照合するだけです。つまり、モジュールがカーネルに属しているかどうかを判断する際にEXTRAVERSIONを無視してください。 このフラグはカーネル2.5以降で自動的に設定されます。以前のカーネルではオプションです。

モジュールのパラメータ

一部のモジュールでは、ロード時パラメータを受け入れて操作をカスタマイズします。 これらのパラメータは、マシンごとに異なるI / OポートとIRQ番号であり、ハードウェアからは特定できません。

2.0シリーズカーネル用に構築されたモジュールでは、任意の整数または文字ポインタシンボルをパラメータとして扱い、変更することができます。 2.1シリーズのカーネルからは、シンボルが明示的にパラメータとしてマークされているため、特定の値のみが変更される可能性があります。 さらに、ロード時に提供される値をチェックするための型情報が提供されます。

整数の場合、すべての値は、10進数、8進数、16進数のいずれかで、C:17,021または0x11になります。 配列要素はコンマで区切って指定したシーケンスです。 値を省略すると要素をスキップできます。

2.0シリーズモジュールでは、数値で始まらない値は文字列と見なされます。 2.1から、パラメータの型情報は、値を文字列として解釈するかどうかを示します。 値が二重引用符( " )で始まる場合、文字列はCのように解釈され、エスケープシーケンスとすべて。シェルプロンプトから引用符自体をシェルの解釈から保護する必要があるかもしれないことに注意してください。

GPLライセンスモジュールとシンボル

カーネル2.4.10以降、モジュールには、 MODULE_LICENSE()を使用して定義されたライセンス文字列が必要です。 いくつかの文字列はGPL互換であると認識されます。 他のライセンス文字列またはライセンスなしとは、モジュールが専有として扱われることを意味します。

カーネルが/ proc / sys / kernel / taintedフラグをサポートしている場合、 insmodはGPLライセンスなしでモジュールをロードするときに汚染フラグを '1'にORします。 カーネルが汚染をサポートし、モジュールがライセンスなしでロードされている場合、警告が発行されます。 汚染をサポートしない古いカーネルであっても、GPL互換ではないMODULE_LICENSE()を持つモジュールに対しては、常に警告が発行されます。 これにより、古いカーネルで新しいmodutilsが使用されたときの警告が最小限に抑えられます。

insmod -f (force)モードは汚染をサポートするカーネルで汚染されたフラグを '2'でORします。 常に警告を出します。

いくつかのカーネル開発者は、コードによってエクスポートされたシンボルは、GPL互換のライセンスを持つモジュールによってのみ使用される必要があります。 これらのシンボルは、通常のEXPORT_SYMBOLの代わりにEXPORT_SYMBOL_GPLによってエクスポートされます。 カーネルや他のモジュールからエクスポートされたGPL専用シンボルは、GPL互換のライセンスを持つモジュールにしか表示されません。これらのシンボルは、 / proc / ksymsに「 GPLONLY_ 」という接頭辞を付けて表示されます。 insmodは、GPLライセンスモジュールをロードしている間、シンボルのGPLONLY_プレフィックスを無視するので、モジュールはプレフィックスなしで通常のシンボル名を参照するだけです。 GPL互換のライセンスなしでは、GPLのみのシンボルはモジュールで使用できません。これには、ライセンスのないモジュールも含まれます。

Ksymoopsアシスタンス

モジュールを使用しているときにカーネルのoopsのデバッグを助けるために、 insmodはデフォルトでksymsにいくつかのシンボルを追加します。- Yオプションを参照してください。 これらのシンボルは__insmod_modulename_始まります。 シンボル名を一意にするためには、 モジュール名が必要です。 異なるモジュール名で同じオブジェクトを複数回読み込むことは正当です。 現在定義されているシンボルは次のとおりです。

__insmod_modulename_Oobjectfile_Mmtime_Vversion

objectfileは、オブジェクトがロードされたファイルの名前です。 これにより、ksymoopsがコードを正しいオブジェクトに一致させることができます。 mtimeは、ファイルが16進数で最後に変更されたタイムスタンプで、statが失敗した場合はゼロです。 versionはモジュールがコンパイルされたカーネルのバージョン、バージョンがない場合は-1です。 _Oシンボルは、モジュールヘッダと同じ開始アドレスを持ちます。

__insmod_modulename_Sectionname_Llength

このシンボルは、選択されたELFセクションの先頭に現在表示されています。現在は.text、.rodata、.data、.bssおよび.sbssです。 セクションのサイズがゼロでない場合にのみ表示されます。 sectionnameはELFセクションの名前、 lengthはセクションの長さを10進数で表したものです。 これらのシンボルは、シンボルが利用できない場合にksymoopsがアドレスをセクションにマップするのに役立ちます。

__insmod_modulename_Ppersistent_filename

モジュールに永続データとしてマークされた1つ以上のパラメータがあり、永続データを保存するためのファイル名 (上記の-eを参照)がある場合のみ、 insmodによって作成されます。

モジュールでカーネルのOopsをデバッグする際のもう1つの問題は、 / proc / ksyms/ proc / modulesの内容が、Oopsとログファイルを処理するときに変更できることです。 この問題を解決するために、 / var / log / ksymoopsディレクトリが存在する場合、 insmodrmmodは自動的に/ proc / ksyms/ proc / modules/ var / log / ksymoopsに `date +%Y%m %d%H%M%S 'である。 システム管理者は、Oopsのデバッグ時に使用するスナップショットファイルをksymoopsに伝えることができます。 この自動コピーを無効にするスイッチはありません。 それが発生しないようにするには、 / var / log / ksymoopsを作成しないでください 。 そのディレクトリが存在する場合は、ルートが所有し、644または600のモードである必要があります。毎日このスクリプトを実行する必要があります。 以下のスクリプトは、 insmod_ksymoops_cleanとしてインストールされています

知るべき基本情報

insmod - ロード可能なカーネルモジュールをインストールする

シノプシス

insmod [-fhkLmnpqrsSvVxXyYN] [-e persist_name ] [-o module_name ] [-O blob_name ] [-P 接頭辞 ] module [ symbol = value ...]