的确:
- Fedora Linux 28 - 使用
dracut
initramfs。 rd.break
通过在内核命令行上添加选项来引导进入 initramfs shell 。cd /sysroot
usr/bin/pivot_root . mnt
->pivot_root
失败并显示“无效参数”,对应于errno
的值EINVAL
。
对此没有任何解释man 2 pivot_root
:
EINVAL
put_old不在下面新根。
为什么会失败?正如下一个评论者回答的那样,“那么 Linux 将如何退出早期用户空间?”
答案1
与 不同的是initrd
,Linux 不允许卸载initramfs
.显然这有助于保持内核代码简单。
pivot_root
您可以使用该命令来代替switch_root
。它执行以下过程。 请注意,这switch_root
会删除旧根目录上的所有文件,以释放 initramfs 内存,因此您需要小心运行此命令的位置。
initramfs 是rootfs:您既不能pivot_root rootfs,也不能卸载它。相反,删除 rootfs 中的所有内容以释放空间(find -xdev / -exec rm '{}' ';'),使用新根覆盖 rootfs(cd /newmount; mount --move . /; chroot .),将 stdin/stdout/stderr 连接到新的 /dev/console,并执行新的 init。
请注意,建议的 shell 命令只是 C 代码的粗略等效项。除非这些命令都内置到您的 shell 中,否则它们不会真正起作用,因为第一个命令会从 initramfs 中删除所有程序和其他文件:-)。
Rootfs 是 ramfs(或 tmpfs,如果启用的话)的一个特殊实例,它始终存在于 2.6 系统中。您无法卸载 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
会提到这个案例。