Busyboxベースの最小システムの初期化で現在のハードウェアのカーネルモジュールをロードする方法

Busyboxベースの最小システムの初期化で現在のハードウェアのカーネルモジュールをロードする方法

最小限に忙しい箱initLinuxシステムに基づいて現在のハードウェアのすべてのカーネルモジュールがロードされるようにするには、スクリプトからどのコマンドを呼び出す必要がありますか?

答え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

その後、現在のハードウェア(およびその依存関係)のすべてのドライバがロードされ初期化されます。

関連情報