
Linuxが起動すると、initrd
起動プロセスをさらにサポートするために必要なデフォルトのサポートファイルとカーネルモジュールがインストールされます。 Linuxオペレーティングシステムからの後続のrootfs
インストールと削除。initrd
私の質問は、initrd
アンマウントされた場合、ユーザーがどのようにマウントされたファイルを表示できるかということですinitrd
。
たとえば、次のようになります。/etc
などの一部のファイル/lib
答え1
その後、Linuxオペレーティングシステムでrootfsがマウントされ、initrdが削除されます。
正確に「削除可能」ではありません。ほとんどのLinuxディストリビューションはインストール可能なinitrdを使用しません。年度。代わりに、彼らは入手可能なアーカイブ「initramfs」を使用します。抽出済み元の「/」にマウントされたRAMファイルシステム(tmpfs)を入力します。このinitrd=
オプションはまだ指定されていますが、動作は元のinitrdメカニズムとはまったく異なります。
私の質問は、initrdを削除するときに/etc、/lib、/bin、/usr、..ディレクトリとその内容がまだ存在する理由です。
initramfsの観点から見ると、実際には「/etc」や「/lib」ではないからです。 initramfs「/」を直接マウントしないでください。- initramfsそれ自体「/」 - 代わりに「/mnt」や「/newroot」などの場所に実際のルートファイルシステムをマウントするため、これらのディレクトリは「/newroot/lib」などで始まります。
initramfsが完了した最後のステップの1つは、「pivot_root()」または「mount(MS_MOVE)」です。「/newroot」を新しい「/」にします。、本質的に2つのマウントを交換します(以前の「/」、つまりinitramfsはサブマウントに移動します)。
initramfsから抽出された最小の「/bin」、「/etc」および「/lib」するその過程で消えます。
つまり、プロセスはおおよそ次のようになります。
- カーネルはに空のtmpfsをマウントします
/
。 - カーネルは initramfs.cpio アーカイブを
/
/bin、/lib などに最小限のファイルを含むメモリに解凍します。 - カーネルは
/init
initramfs の「コア」を実行します。 - initramfs /initスクリプトは、カーネルコマンドラインから「root =」を読み込み(または他の方法を使用して)、実際のルートファイルシステムを
/newroot
同様の場所にマウントします。この時点で、ファイルは/newroot/lib、/newroot/homeなどにあります。 - initramfs は、「/newroot/run」の tmpfs や「/newroot/usr」の NFS ベースの /usr など、 /newroot の下に必要な他の項目をオプションでインストールできます。
- initramfs /initは、次の2つの方法のうちの1つとして
/newroot
使用できると思います。/
- initramfs "/"で抽出されたすべてのファイルを削除してから行動"/newroot" を "/" にマウントし(今は空の tmpfs を上書きして永久に保持されます)、 chroot() を使用して永続的にします。これは、Arch Linux の initramfs が switch_root ツールを使って行うことです。
- または、ivot_root() を呼び出して initramfs/ を /newroot に "交換" し、後者を new/ に変換し、initramfs を /run/initramfs と同じ場所に移動してマウント解除できます。この方法がまだ使用されているかどうかはわかりません。
- 最後に、「/」が実際のルートなので、/ init(まだメモリ内で実行中)は実際のルートファイルシステムを実行します
/sbin/init
。
通常、initramfs /initは単純なシェルスクリプトです(必ずしもそうではありませんが、systemdの完全なコピーでもかまいません)。あなたは見ることができますアーキテクチャ mkinitcpio /init。これは内部的に "overlay using mount(MS_MOVE)" メソッドを使用します。ルートディレクトリの切り替えユーティリティLinuxで。