次の行を実行するGRUBを考えてみましょう。
kernel /vmlinuz root=/dev/sda1 ro
initrd /initrd
Linuxカーネルは起動時に/dev/sda1
デバイスノードをどのように見つけますか?
initrd/initramfs イメージには、ストレージへのアクセスを許可するためにメモリーにロードされるストレージ (など) デバイス用のモジュールが含まれていることがわかります。私を悩ませるのは、root=/dev/sda1
カーネルがカーネルパラメータをどれだけ正確に解析するかです。
initrd / initramfsの(または)スクリプトは/init
ディレクトリを作成し、その中にデバイスノードを作成しますか?それとも、「注」と「負」の数字がカーネルにハードコードされていますか?/linuxrc
/dev
/dev/sda1
/dev/sda1
答え1
initramfsがある場合、カーネルはinitramfsを解凍してインストールしてから/init
実行されます。他のすべては/init
実行可能ファイルによって処理されます。これはまた、カーネルがブートパラメータroot
で指定されたデバイスをインストールしないことを意味します。
他のディストリビューションは異なるinitramfsフレームワークを使用します。例えばデラクールFedoraの場合、またはinitramfsのツールDebian の場合。最も一般的な解決策はudev
、mdev
または同様のものを使用することですdevtmpfs
。一部はただ使用することができますMAKEDEV
静的レイアウトを作成するか、デバイスファイルを画像に統合します。
initramfsなしで起動すると、カーネルは、たとえば既知のメジャー/マイナー番号を持つデバイスからのみ起動できますが、/dev/sda1
lvmデバイスでは起動できません。
答え2
ルートデバイスのプライマリデバイス番号とマイナーデバイス番号は両方ともカーネルイメージに保存されます(rdev
詳細についてはマンページを参照)。
ただし、カーネルコマンドライン引数はカーネルによって解釈されません。初期のramdisk initrdには、最小限のLinuxを含むファイルシステムが含まれており、通常は解釈部分を実行します。 initrdの仕組みはディストリビューションによって異なります。これには、ノード/ dev / sda1または実行時にノードを生成するいくつかのスクリプト/プログラムが含まれる場合があります。
DebianベースのLinuxを使用している場合は、以下のようにRAMディスクを解凍できます。
mkdir /tmp/initrd
cd /tmp/initrd
zcat /boot/path/to/initrd | cpio -iv
debian initrds はどのように動作するかを見るためのスクリプトです。カーネルがinitrdを解凍したinit
後/tmp/initrd
。のブロックを参照してくださいfor x in $(cat /proc/cmdline); do
。
/proc/cmdline
Grubを使用して渡された引数はどこにあります(今ではシェルを使用して確認/検証できます!) Debians initrd の詳細については、root=/dev/nfs
Grub にオプションを渡して、カーネル/initrd が NFS 共有をルートファイルシステムとして使用できるようにすることができます。これにより、/dev/nfs
ノードが作成またはインストールされなくなります。 initrdに何をすべきか教えてください。
最後に、これらの各initrdは、init=
デフォルトオプションなどの特定のオプションが提供されているコマンドを実行します。/sbin/init
タイトルの元の質問に戻り、yes /init(おそらく)は実行時にノードを作成します。さまざまなプログラム/経験的方法/桟橋を使用してルートファイルシステムをマウントする方法を学びます。
答え3
初期コードは、デフォルトmdev
でudev
すべてのデバイスを検索し、/dev
フォルダの初期内容を生成するプログラムを実行します。これにより、カーネルが効率的に実行され、システム全体のmount /dev/sda1 /
検索を開始できます。
バラよりここもっと知りたいですかmdev
?
メジャー番号とマイナー番号は実際にはデバイスドライバであり、静的メジャー番号を使用するカーネルモジュールにハードコードされています(例:ドキュメント/devices.txtカーネルソースコードから)。ほとんどの(すべて?)ディスクドライバカーネルモジュールはこのカテゴリに属します。したがって、@Ulrich Dangelが述べたように、一部のカーネルは、必要なモジュールがカーネルイメージに静的にリンクされている限り、initramfs / initrdなしで起動できます。