switch_root 给出无效参数

switch_root 给出无效参数

我的目标是卸载根磁盘,以便我可以格式化它。为此,我想将根目录从硬盘切换到其他根目录。我选择使用 initramfs(包含最小根文件系统)中的文件来创建要切换回的 rootfs。

我在全新安装的 Ubuntu 16.04 上执行此操作。

以下命令创建 ramdisk 并将 initramfs 的内容复制到 ramdisk 上。

dd if=/dev/zero of=/dev/ram bs=1k count=209715
mke2fs -vm0 /dev/ram 209715
mount -t ext2 /dev/ram /ramroot/
cd /ramroot/
zcat /boot/initrd.img-4.4.0-47-generic | cpio -idmv
mkdir old-root

但是,当我执行 switch_root 命令时,我得到“无效参数”

root@ubuntu-512mb-nyc3-01:/ramroot# switch_root /ramroot /ramroot/old-root
switch_root: failed to mount moving /run to /ramroot/run: Invalid argument
switch_root: forcing unmount of /run
switch_root: failed to mount moving /ramroot to /: Invalid argument
switch_root: failed. Sorry.

我究竟做错了什么?

答案1

我建议不要用于switch_root此目的。它的设计目的实际上只是供 initramfs 使用,从 initramfs 切换到真正的 root,没有其​​他目的。您可以在其联机帮助页上的以下警告中看到该特殊用途的证据:

WARNING:  switch_root  removes recursively all files and directories on
the current root filesystem.

这样做是为了在 initramfs 切换到真正的 root 后,可以恢复 initramfs(这是一个 tmpfs)使用的内存。 (顺便说一句,它内置于switch_rootinitramfs shell 脚本中而不是其一部分的原因是,它是执行此操作的唯一机会:在旧根不再使用之后且二进制文件仍短暂挂在文件上时引用它的描述符。)您真的想要switch_rootrm -rf的根文件系统吗?我想也许你不介意,因为无论如何你都打算重新制作 fileysstem,但这不是最佳选择。

另外,您的用法switch_root不正确:后面的参数/ramroot应该是要运行的命令(在新根目录中),而不是目录的名称。但这不是你问题的根源。

从 mount(2) 联机帮助页中尚不清楚EINVAL错误的根源是什么,但看到它失败我并不感到惊讶:因为您的用例不是 的预期用例switch_root,所以它可能没有经过很好的测试和支持。我猜想可能是旧文件系统仍在使用中(有对其的开放引用),导致挂载无法MS_MOVE工作。

您可以尝试以下方法来查看它们是否有效,但我认为它们很可能都不起作用:

  • 请额外确保系统上没有正在运行的任何内容保存对旧根文件系统的引用(甚至不是sshd用于与计算机连接的根文件系统)。将所有 SSH 服务器基础结构复制到新的根文件系统后,您可能可以使用各种技巧在不依赖于旧chroot根文件系统的计算机中安排 SSH 会话,但这将是体操。
  • 用于exec调用switch_root.它被设计为以这种方式调用。
  • 使用 tmpfs 文件系统而不是 ext2 文件系统。对于您想要做的事情,没有理由在 ramdisk 之上使用 ext2 文件系统。您也可以只使用 tmpfs(就像 initramfs 那样)。

完成您想要做的事情的更好方法是使用机器的控制台并使用真正的 initramfs 来完成您的工作。当然,这需要您具有对机器的工作控制台访问权限。使用类似break=bottom内核命令行的方式启动,initramfs 将让您有机会在 ramfs 下运行时执行所需操作。在执行此操作之前,您需要将所需的工具复制到 initramfs 中。

最后,如果你有能力这样做,那么在救援系统下做这些事情会更容易、更安全。我可以想到使用上述break技巧在 initramfs 下完成工作的充分理由(例如,您可以访问远程串行控制台,但没有机会插入带有救援系统的 USB 密钥,并且不支持网络启动救援系统),但是如果您犯了错误,那就很危险(您将失去访问权限,并且无论如何都需要前往数据中心)。

相关内容