nfsではなくcephを介してシステムをネットブートするために、Linuxの初期化プロセスをよりよく理解したいと思っています。
その過程で、ルートを切り替える2つの形式に出くわしました。 1つはswitch_rootと呼ばれ、もう1つはpivot_rootと呼ばれます。これらのスクリプトは、pxeブートプロセスを使用してtftp経由で取得されたメモリ内ファイルシステム(initramfs)から実行されます。
いつ使用しますか?ルートに配置されたいくつかのinitスクリプトで両方が使用されているのを見てきました。
承認された回答:
ここで素晴らしい説明を見つけました。ただし、回答で理解した内容の短い形式で入力してみましょう。
短いバージョン
- システムの起動中は、初期のユーザースペースが必要です。
initramfsまたはinitrdのいずれかを使用して実現できます。 - initrd 実際のRAMディスクにロードされます ファイルシステム 。
- initramfs ない ファイルシステム 。
- initrdの場合
pivot_root
initramfsに使用されますswitch_root
使用されます。
長いバージョン
さて、私が上に置いたものの詳細な説明に。
initramfsとinitrdはどちらも同じ目的を果たしますが、
2つの違いがあります。最も明らかな違いは、initrdが
RAMディスクにロードされることです。これは、RAMディスクにマウントされた実際のファイルシステム(通常は
ext2)で構成されています。一方、initramfsは
ファイルシステムではありません。これは、tmpfsに解凍される(圧縮された)cpioアーカイブ(タイプ
newc)です。これには、
initramfsをもう少し最適化し、カーネルブートプロセスのinitrdよりも少し早く
ロードできるようにするという副作用があります。また、カーネルは
事前定義されたRAMディスクサイズに依存するのではなく、
tmpfsのサイズを実際にロードされるものに適合させることができるため、
メモリ内のinitramfsのサイズは小さくなります。
使用されたRAMをクリーンアップすることもできますが、ramdiskは使用され続ける傾向があります(
ピボットルート実装の詳細のため)。また、別の副作用の違いがあります。ルートデバイス(および
それに切り替える)の処理方法です。 initrdはramにアンパックされた実際のファイルシステムであるため
、ルートデバイスは実際にはramdiskである必要があります。
initramfsの場合、カーネル「rootfs」がtmpfsになり、
initramfsがアンパックされます(カーネルがinitramfsをロードする場合、
そうでない場合、rootfsは単にファイルシステムはroot=
カーネルブートパラメータを介して指定されます)が、この暫定rootfsは
root =ブートパラメータとして指定されるべきではありません(そして
そうする方法はありません、デバイスが接続されていないため)。これは、
initramfsを使用する場合でも、
実際のルートデバイスをカーネルに渡すことができることを意味します。 initrdを使用すると、実際のルート
デバイスが自分で何であるかを処理する必要があります。また、initrdを使用する「実際の」ルートデバイスは
ramdiskであるため、カーネルは実際にルートデバイスを一方の実際のデバイス(ramdisk)からもう一方(実際のルート)に切り替える必要があります。
initramfsの場合、initramfsスペース(tmpfs)は実際のデバイスではないため、
カーネルは実際のデバイスを切り替えません。したがって、コマンド
ivot_rootはinitrdで使用されますが、initramfsには別のコマンドを
使用する必要があります。 Busyboxはこれを実現するためにswitch_rootを提供しますが、
klibcはnew_rootを提供します。