initramfs rootfs では ivot_root は使用できず、無効なパラメーターを受け取ります。物理ファイルシステムのみを交換できます。
もちろん:
- Fedora Linux 28 -
dracut
initramfsの使用。 rd.break
カーネルコマンドラインにオプションを追加してinitramfsシェルから起動します。cd /sysroot
usr/bin/pivot_root . mnt
->値pivot_root
に対応する「無効なパラメータ」が原因で失敗します。errno
EINVAL
これについての説明はありませんman 2 pivot_root
。
EINVAL
put_old以下ではありません。新しい根。
なぜ失敗したのですか?次のコメント作成者は、「それでは、Linuxは初期ユーザースペースをどのように終了するのですか?」と答えました。
答え1
Linuxとは異なり、initrd
Linuxはアンインストールを許可しませんinitramfs
。これは明らかにカーネルコードを単純に保つのに役立ちます。
pivot_root
代わりにこのコマンドを使用できますswitch_root
。次のプロセスを実行します。 これにより、switch_root
initramfsメモリを解放するために以前のルートディレクトリのすべてのファイルが削除されるため、このコマンドを実行する場所に注意する必要があります。
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
したがって、この場合は将来のバージョンで言及される予定です。