/init(または/linuxrc)スクリプトは/ devに一時デバイスノードを作成しますか?

/init(または/linuxrc)スクリプトは/ devに一時デバイスノードを作成しますか?

次の行を実行する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 の場合。最も一般的な解決策はudevmdevまたは同様のものを使用することですdevtmpfs。一部はただ使用することができますMAKEDEV静的レイアウトを作成するか、デバイスファイルを画像に統合します。

initramfsなしで起動すると、カーネルは、たとえば既知のメジャー/マイナー番号を持つデバイスからのみ起動できますが、/dev/sda1lvmデバイスでは起動できません。

答え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/cmdlineGrubを使用して渡された引数はどこにあります(今ではシェルを使用して確認/検証できます!) Debians initrd の詳細については、root=/dev/nfsGrub にオプションを渡して、カーネル/initrd が NFS 共有をルートファイルシステムとして使用できるようにすることができます。これにより、/dev/nfsノードが作成またはインストールされなくなります。 initrdに何をすべきか教えてください。

最後に、これらの各initrdは、init=デフォルトオプションなどの特定のオプションが提供されているコマンドを実行します。/sbin/init

タイトルの元の質問に戻り、yes /init(おそらく)は実行時にノードを作成します。さまざまなプログラム/経験的方法/桟橋を使用してルートファイルシステムをマウントする方法を学びます。

答え3

初期コードは、デフォルトmdevudevすべてのデバイスを検索し、/devフォルダの初期内容を生成するプログラムを実行します。これにより、カーネルが効率的に実行され、システム全体のmount /dev/sda1 /検索を開始できます。

バラよりここもっと知りたいですかmdev

メジャー番号とマイナー番号は実際にはデバイスドライバであり、静的メジャー番号を使用するカーネルモジュールにハードコードされています(例:ドキュメント/devices.txtカーネルソースコードから)。ほとんどの(すべて?)ディスクドライバカーネルモジュールはこのカテゴリに属します。したがって、@Ulrich Dangelが述べたように、一部のカーネルは、必要なモジュールがカーネルイメージに静的にリンクされている限り、initramfs / initrdなしで起動できます。

関連情報