pivot_root()
現在のプロセスのルートファイルシステムを_put_old_ディレクトリに移動し、_new_root_を現在のプロセスの新しいルートファイルシステムにします。
int pivot_root(const char *new_root, const char *put_old);
この記事を読んで、次の質問がありました。
- _put_old_は何に使用されますか?カーネルは内部目的にのみ使用しますか、それともどのような用途に使用できますか?
- 現在のファイルシステムを_put_old_ディレクトリに移動する必要があるのはなぜですか?
- _put_old_ディレクトリが_new_root_ディレクトリの下にある必要があるのはなぜですか?
公式文書では、システムコールを活用したい場合に実行したいことを明確に説明していますpivot_root
が、文書がこれらの規則を適用する理由と、後で行うことを明確に説明していないようです。
この事実を知っているフレンドリーな人がこの問題を解決するのに役立ちますか?
答え1
pivot_root
システムの起動時に使用されます。 RAMの初期Linuxシステムと最終ルートファイルシステムの切り替えを容易にするために導入されました。
Linuxが起動すると、カーネルと初期ルートファイルシステムがブートローダによってメモリにロードされます。ブートローダ(ROMに保存)は、LinuxシステムをRAMにロードしてからカーネルを実行する小さなプログラムです。
起動順序が終了すると、RAM ファイルシステムは初期ルートファイルシステムとしてマウントされます。これを行うinitrd
には2つのオプションがありますinitramfs
。どちらの方法も、初期ルートファイルシステムからカーネルを起動します。
カーネルは、最終ルートファイルシステムを作成するために複数のタスクを実行する必要があります。これにはさまざまなテクノロジがありますが(Linuxディストリビューションによっては)、デフォルトではカーネルは最終ルートファイルシステムにアクセスするために必要なハードウェアドライバをロードします。
たとえば、ルートファイルシステムがNFSにある場合、カーネルは最初にネットワークを設定し、NFS共有にアクセスするための情報を取得してから、NFS共有をマウントする必要があります。
新しいルートにアクセスできるようになると、新しいルートが一時的なマウントポイントにマウントされ、所定の位置に回転しますpivot_root
。最終的なクリーンアップ操作を完了するには、スクリプトにしばらくの間元のルートディレクトリが必要になることがあります。クリーンアップが完了すると、初期ルートシステムがアンマウントされ、メモリが解放されます。
詳細については、次を参照してください。初期のLinuxラムディスク。