您不能在 initramfs rootfs 上使用 pivot_root,您将得到 Invalid Argument。您只能旋转真实的文件系统。
的确:
- 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不在new_root之下。
为什么会失败?正如下一位评论者回答的那样,“那么 Linux 将如何退出早期用户空间?”
与 不同的是
initrd
,Linux 不允许卸载initramfs
. 显然,这有助于使内核代码保持简单。代替
pivot_root
,您可以使用该switch_root
命令。它执行以下过程。 请注意,switch_root
删除旧根目录上的所有文件以释放 initramfs 内存,因此您需要小心运行此命令的位置。请注意,建议的 shell 命令只是 C 代码的粗略等价物。除非它们都内置到您的 shell 中,否则这些命令不会真正起作用,因为第一个命令会从 initramfs 中删除所有程序和其他文件:-)。
https://github.com/torvalds/linux/blob/v4.17/Documentation/filesystems/ramfs-rootfs-initramfs.txt
从 fs/namespace.c 中对 pivot_root 系统调用的评论:
我向man-pages 项目提交了一个关于这个的补丁,所以在它的未来版本中,
man 2 pivot_root
会提到这个案例。