私はnfsネットワークではなくcephを介してシステムを起動するためのLinux initプロセスをよりよく理解したいと思います。
この過程で、私は2つの形式のルート変換に出会いました。 1つはスイッチルート(switch_root)と呼ばれ、もう1つはピボットルート(pivot_root)と呼ばれます。これらのスクリプトは、pxeブートプロセスを使用してtftpを介して取得されたメモリ内ファイルシステム(initramfs)で実行されます。
いつ他のものを使用しますか?ルートディレクトリの一部の初期化スクリプトで両方が使用されていることを見たことがあります。
答え1
素晴らしい説明が見つかりましたここ。しかし、答えの私の理解をより短い形式で表現しましょう。
より短いバージョン
- システムが起動したら、初期ユーザースペースが必要です。 initramfsまたはinitrdを使用して実装できます。
- 初期化プログラムRAMディスクにロードされました本当だ ファイルシステム。
- ファイルシステムの初期化はいいいえㅏファイルシステム。
- ~のため初期化プログラム
pivot_root
使用ファイルシステムの初期化switch_root
使用される。
拡張バージョン
さて、上記の内容を詳しく説明します。
initramfsとinitrdは同じ目的で使用されますが、2つの違いがあります。最も明白な違いは、initrdがRAMディスクにロードされることです。 RAMディスクにマウントされた物理ファイルシステム(通常ext2)で構成されています。一方、initramfsはファイルシステムではありません。これはtmpfsに解凍された(圧縮された)cpioアーカイブ(newcタイプ)です。これは、initramfsがより最適化され、initrdよりもカーネルブートプロセスでより早くロードされる可能性があるという副作用があります。また、カーネルはあらかじめ定義されたRAMディスクのサイズに依存するのではなく、実際にロードされたコンテンツに基づいてtmpfsのサイズを変更することができ、RAMディスクの使用中に使用したRAMをクリーンアップできるため、メモリ内initramfsのサイズは小さくなります。 ( ivot_root 実装の詳細により)。
副作用による別の違いは、ルーティングされたデバイスを処理する方法(そしてそのデバイスに切り替える方法)です。 initrdはRAMに解凍された物理ファイルシステムであるため、ルートデバイスは実際にRAMディスクである必要があります。 initramfsの場合、initramfsが解凍するtmpfsになるカーネル"rootfs"があります(カーネルがinitramfsをロードする場合、そうでない場合rootfsはroot =カーネルブートパラメータで指定されたファイルシステムのみです)、この一時rootfsはそうではありません。 root =ブートパラメータとして指定されます(接続されたデバイスがないため、これを行う方法はありません)。これは、initramfsを使用すると、実際のルートデバイスをカーネルに渡すことができることを意味します。 initrdでは、実際のルートデバイスを直接処理する必要があります。また、initrdのある「実」ルートデバイスはRAMディスクなので、カーネルは実際にはルートデバイスをある物理デバイス(RAMディスク)から別のデバイス(実際のルートデバイス)に切り替える必要があります。 initramfsの場合、initramfsスペース(tmpfs)は物理デバイスではないため、カーネルは物理デバイスを切り替えません。したがって、ivot_rootコマンドはinitrdと共に使用されますが、initramfsには別のコマンドを使用する必要があります。 Busyboxはこれを行うためにswitch_rootを提供し、klibcはnew_rootを提供します。
答え2
pivot_root
何らかの目的で元のルートを保存したい場合に使用されます。pivot_root
2つの取り付けポイントを交換します。
switch_root
元のルートを捨てたいときに使用されます。 switch_rootは、chroot
共通のマウントポイント(/ dev、/ proc、/ sysなど)を新しいルートディレクトリに移動し、古いルートディレクトリのすべてのエントリを削除しようとする装飾です。
概念的に使用してpivot_root
からインストールの移動と削除を直接実行することは、使用と機能的に同じですswitch_root
。
また、重要:pivot_root
initramfsでは使用できません。