最小限に忙しい箱init
Linuxシステムに基づいて現在のハードウェアのすべてのカーネルモジュールがロードされるようにするには、スクリプトからどのコマンドを呼び出す必要がありますか?
答え1
ハードウェアによっては、一部の通話がある場合があります。バスモジュールをロードします。これらのほとんどはすでに自動化されています。私はそれを通して仮定しています ファイルシステムの初期化、udev/mdev、ハルダー、システム初期化、など...
モジュールを手動でロードする1つの方法は、modprobe
すべての依存関係を処理するモジュールを呼び出すことです。
たとえば、
# modprobe snd_pcm
私の場合は、サウンドを生成するために必要なすべてのモジュールをロードします。
すべての依存関係が最初にmodprobe
ロードされますsnd_hda_core
。これが理由snd_hda_core
の一部ですsnd_pcm
。
$ lsmod | grep ^snd_hda_core
snd_hda_core 110592 5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_codec_realtek
その後、すべてのsnd_pcm
依存関係はmodprobe
。
$ lsmod | grep ^snd_pcm
snd_pcm 135168 10 snd_hda_codec_hdmi,snd_hda_intel,snd_usb_audio,snd_hda_codec,soundwire_intel,snd_compress,snd_soc_core,snd_hda_core,snd_pcm_dmaengine
デフォルトでは、一部のモジュールをロードするファイルを含む/etc/modules-load.d/
フォルダがあります。*.conf
これは必要なことをすべて行うので、初期化スクリプトを書く必要はありません。
$ cat /etc/modules-load.d/local.conf
vfio_pci
asus-wmi-sensors
tun
つまり、すべてのモジュールをロードするには、1回の呼び出しまたは1つのファイルのみが必要です。
modprobeのマンページ...
modprobeには、modprobeに付属の対応するdepmodユーティリティによって生成された最新のmodule.dep.binファイルが必要です(depmod(8)を参照)。このファイルは、各モジュールに必要な他のモジュール(存在する場合)をリストし、modprobeでこれらの依存関係を自動的に追加または削除するために使用されます。
depmodのマンページ...
Linuxカーネルモジュールは、他のモジュールで利用可能なサービス(「記号」と呼ばれる)を提供できます(コードのEXPORT_SYMBOLバリアントの1つを使用)。 2番目のモジュールがこのシンボルを使用している場合、その2番目のモジュールは明らかに最初のモジュールに依存します。これらの依存関係はかなり複雑になる可能性があります。
depmod は、/lib/modules/version の下の各モジュールを読み込み、エクスポートするシンボルと必要なシンボルを決定し、モジュールの依存関係リストを作成します。デフォルトでは、このリストは同じディレクトリにあるmodule.depとmodule.dep.binというバイナリハッシュバージョンに書き込まれます。
###################
次へ追加
それを指摘した後は、その背後に隠された魔法を説明しなければなりません。頑張らなければならないのにちょっと曖昧ですね。
私のGPUの1つを見てみましょう。
次の例は次のとおりです。モデリア私のGPUとニックネームモジュール定義が重複しています。
$ lspci
...
0b:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1)
...
$ cat /sys/bus/pci/devices/0000:0b:00.0/modalias
pci:v000010DEd00001B06sv00001462sd00003607bc03sc00i00
$ modinfo nvidia
...
alias: pci:v000010DEd*sv*sd*bc03sc02i00*
alias: pci:v000010DEd*sv*sd*bc03sc00i00*
depends: i2c-core,drm
...
lspciのマンページ...
カーネルモジュールがデバイスを処理できることを報告します。
この部分は私に少し見慣れて推測するしかなかった。
とにかく、これまでに収集した情報に基づいて、この情報に基づいてモジュールを構成する方法は2つあります。
最初の方法(開始時)...
echo "alias $(cat /sys/bus/pci/devices/0000:0b:00.0/modalias) nvidia" >> /etc/modprobe.d/default.conf
2番目の方法(ランタイム)...
echo "0000:0b:00.0" > /sys/bus/pci/drivers/nvidia/bind
これNvidiaフォルダは任意のモジュール名のいずれかです。たとえば、私が指定できます。vfio-pci代わりにフォルダ。
echo "0000:0b:00.0" > /sys/bus/pci/drivers/nvidia/unbind
echo "0000:0b:00.0" > /sys/bus/pci/drivers/vfio-pci/bind
これは単なる例であり、GPUモジュールは起動時にのみロードできるため、実際の環境では機能しません。
答え2
いくつかのドライバがカーネルに組み込まれ、他のドライバが生成されたすべての関連メタdepmod
データと共にカーネルモジュールとして表示される最小限のinitramfsを想定し、もう少し深く掘り下げた結果は次のとおりです。
カーネルに組み込まれたドライバは、/init
呼び出す前にロードされます。
/init
モジュールで構築されたドライバは、次のようにロードする必要があります。
- まずインストールする必要があります
/sys
。/proc
- その後、既存のハードウェアを検索して関連カーネルモジュールをロードする必要があります。
ハードウェアのスキャンとモジュールのロードは通常、単純なプログラムで行う必要があります。mdev -s
移動する。
残念ながらまともな役割をしなかった。したがって、このプロセスが強制的に発生するように呼び出す必要がありますfind /sys/ -name modalias | xargs sort -u | xargs -n 1 modprobe
。
その後、現在のハードウェア(およびその依存関係)のすべてのドライバがロードされ初期化されます。