initramfsの新しいルートへのHub_root - "無効な引数"エラー

initramfsの新しいルートへのHub_root - "無効な引数"エラー

initramfs rootfs では ivot_root は使用できず、無効なパラメーターを受け取ります。物理ファイルシステムのみを交換できます。

もちろん:

  1. Fedora Linux 28 - dracutinitramfsの使用。
  2. rd.breakカーネルコマンドラインにオプションを追加してinitramfsシェルから起動します。
  3. cd /sysroot
  4. usr/bin/pivot_root . mnt

->値pivot_rootに対応する「無効なパラメータ」が原因で失敗します。errnoEINVAL

これについての説明はありませんman 2 pivot_root

EINVAL put_old以下ではありません。新しい根

なぜ失敗したのですか?次のコメント作成者は、「それでは、Linuxは初期ユーザースペースをどのように終了するのですか?」と答えました。

答え1

Linuxとは異なり、initrdLinuxはアンインストールを許可しませんinitramfs。これは明らかにカーネルコードを単純に保つのに役立ちます。

pivot_root代わりにこのコマンドを使用できますswitch_root。次のプロセスを実行します。 これにより、switch_rootinitramfsメモリを解放するために以前のルートディレクトリのすべてのファイルが削除されるため、このコマンドを実行する場所に注意する必要があります。

initramfs は rootfs です。 rootfsをピボットルートまたはマウント解除できません。代わりに、rootfsのすべてのエントリを削除してスペースを解放し(-xdev / -exec rm '{}' ';'を探す)、rootfsを新しいルートで上書きし(cd /newmount; mount --move . /; .), stdin /stdout/stderr 新しい /dev/console に接続し、新しい初期化を実行します。

提案されたシェルコマンドはCコードでのみほぼ同じです。このコマンドがすべてシェルに組み込まれていない場合、実際には機能しません。最初のコマンドは、initramfs :-)からすべてのプログラムやその他のファイルを削除するためです。


Rootfs は、2.6 システムに常に存在していた ramfs (またはアクティブな場合は tmpfs) の特別なインスタンスです。 rootfsをアンマウントできない理由は、initプロセスを終了できないのとほぼ同じです。空のリストを確認して処理するために特別なコードを使用する代わりに、カーネルは特定のリストが終了しないように小さく、簡単に保証できます。空になる。

https://github.com/torvalds/linux/blob/v4.17/Documentation/filesystems/ramfs-rootfs-initramfs.txt

答え2

fs/namespace.c の ivot_root システムコールの説明:

さらに、現在のルートディレクトリは "rootfs"(初期ramfs)ファイルシステムには存在できません。バラよりドキュメント/ファイルシステム/ramfs-rootfs-initramfs.txt この状況の代替。

提出しましたこれに関するマニュアルページプロジェクトパッチman 2 pivot_rootしたがって、この場合は将来のバージョンで言及される予定です。

関連情報