switch_rootではなくいついつivot_rootを使用しますか?


19

nfsではなくcephを介してシステムをネットブートするために、Linuxの初期化プロセスをよりよく理解したいと思っています。

その過程で、ルートを切り替える2つの形式に遭遇しました。1つはswitch_rootと呼ばれ、もう1つはpivot_rootと呼ばれます。これらのスクリプトは、pxeブートプロセスを使用してtftpで取得したメモリ内ファイルシステム(initramfs)から実行されます。

どちらを使用するかはいつですか?ルートに配置されたいくつかの初期化スクリプトで両方が使用されているのを見ました。

回答:


16

ここで素晴らしい説明を見つけました。しかし、私が答えで理解したものの短い形式を入れてみてください。

短いバージョン

  1. システムの起動中、初期のユーザースペースが必要です。これは、initramfsまたはinitrdのいずれかを使用して実現できます。
  2. initrd、実際の FILE SYSTEMである ramdiskにロードされます。
  3. initramfsにはありませんファイルシステム
  4. 以下のためにinitrdを pivot_root使用し、ためにinitramfsが switch_root使用されています。

長いバージョン

さて、私が上に置いたものの詳細な説明に。

initramfsとinitrdは同じ目的を果たしますが、2つの違いがあります。最も明らかな違いは、initrdがRAMディスクにロードされることです。ramdiskにマウントされている実際のファイルシステム(通常はext2)で構成されています。一方、initramfsはファイルシステムではありません。これは、(圧縮された)cpioアーカイブ(newcタイプ)であり、tmpfsに解凍されます。これには、initramfsをもう少し最適化し、カーネルのブートプロセスでinitrdよりも少し早くロードできるという副作用があります。また、メモリ内のinitramfsのサイズは小さくなります。これは、カーネルが事前に定義されたRAMディスクサイズに依存するのではなく、実際にロードされるものにtmpfsのサイズを適合できるためです。

もう1つの副作用の違いもあります。ルートデバイス(およびその切り替え)の処理方法です。initrdはramに展開された実際のファイルシステムであるため、ルートデバイスは実際にはramdiskでなければなりません。initramfsには、initramfsが展開されるtmpfsになるカーネル「rootfs」があります(カーネルがinitramfsをロードする場合;そうでない場合、rootfsは単にroot =カーネルブートパラメーターで指定されたファイルシステムです)この暫定rootfsは、root =ブートパラメーターとして指定しないでください(デバイスが接続されていないため、これを行う方法はありません)。これは、initramfsを使用する場合でも、実際のルートデバイスをカーネルに渡すことができることを意味します。initrdでは、実際のルートデバイスを自分で処理する必要があります。また、「本物の」initrdを持つルートデバイスはramdiskです。カーネルは、実際のデバイス(ramdisk)から別のデバイス(実際のルート)にルートデバイスを実際に動かす必要があります。initramfsの場合、initramfsスペース(tmpfs)は実デバイスではないため、カーネルは実デバイスを切り替えません。したがって、コマンドpivot_rootはinitrdとともに使用されますが、initramfsには別のコマンドを使用する必要があります。Busyboxはこれを実現するためにswitch_rootを提供しますが、klibcはnew_rootを提供します。initramfsには別のコマンドを使用する必要があります。Busyboxはこれを実現するためにswitch_rootを提供しますが、klibcはnew_rootを提供します。initramfsには別のコマンドを使用する必要があります。Busyboxはこれを実現するためにswitch_rootを提供しますが、klibcはnew_rootを提供します。


2
pivot_rootは以前initramfs に使用していましswitch_rootたが、当時は存在しませんでした。switch_root便利な方法であると思われるpivot_rootいくつかのより多くのクリーンアップとも移動している/proc /sys/devなどだけでなく、ルート自体
ダニエル・アルダー

2
initramfs rootfsでpivot_rootを使用することはできません。無効な引数を取得します。実際のファイルシステムのみピボットできます。
TiCPU

@TiCPUそれでは、Linuxは初期のユーザー空間をどのように終了しますか?
Melab

提供されたソリューションは間違っているようです。Linus自身は、pivot_root()またはchroot()はの現在のプロセス参照を変更するだけだと言ってい/ます。したがって、私の理解では、それは任意のパスであり、実際の「ディスク」とは関係ありません。
erikbwork

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.