hub_root 从 initramfs 到新根 - 错误“参数无效”

hub_root 从 initramfs 到新根 - 错误“参数无效”

您不能在 initramfs rootfs 上使用ivot_root,您将收到无效参数。您只能旋转真实的文件系统。

的确:

  1. Fedora Linux 28 - 使用dracutinitramfs。
  2. rd.break通过在内核命令行上添加选项来引导进入 initramfs shell 。
  3. cd /sysroot
  4. 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会提到这个案例。

相关内容