什么时候会使用pivot_root而不是switch_root?

什么时候会使用pivot_root而不是switch_root?

我想更好地了解 Linux init 进程,以便通过 ceph 而不是 nfs 网络启动系统。

在此过程中,我遇到了两种形式的切换根目录。一个称为switch_root,另一个称为pivot_root。这些脚本从内存文件系统 (initramfs) 运行,该文件系统是使用 pxe 引导进程通过 tftp 获得的。

你什么时候会使用其中一种而不是另一种?我已经看到这两者都被用在一些放置在根目录中的初始化脚本中。

答案1

我找到了一个精彩的解释这里。不过,让我尝试用更简短的格式表达我在答案中的理解。

较短版本

  1. 当系统启动时,它需要一个早期的用户空间。它可以使用 initramfs 或 initrd 来实现。
  2. 初始化程序被加载到 ramdisk 中是一个实际的 文件系统
  3. 初始化文件系统不是A文件系统
  4. 为了初始化程序 pivot_root用于初始化文件系统 switch_root用来。

加长版

现在,详细解释我上面所说的内容。

虽然 initramfs 和 initrd 具有相同的用途,但有两个区别。最明显的区别是 initrd 被加载到 ramdisk 中。它由安装在 ramdisk 中的实际文件系统(通常是 ext2)组成。另一方面,initramfs 不是文件系统。它只是一个(压缩的)cpio 存档(newc 类型),被解压到 tmpfs 中。这有一个副作用,即使 initramfs 更加优化,并且能够比 initrd 在内核启动过程中更早加载。此外,内存中的 initramfs 的大小更小,因为内核可以根据实际加载的内容调整 tmpfs 的大小,而不是依赖于预定义的 ramdisk 大小,并且它还可以清理已使用的 ram,而 ramdisk 倾向于继续使用(由于pivot_root 实现的细节)。

还有另一个副作用差异:如何处理根设备(以及切换到它)。由于 initrd 是解压到 ram 中的实际文件系统,因此根设备实际上必须是 ramdisk。对于 initramfs,有一个内核“rootfs”,它成为 initramfs 解压到的 tmpfs(如果内核加载 initramfs;如果没有,则 rootfs 只是通过 root= 内核引导参数指定的文件系统),但是这个临时 rootfs 不应该被指定为 root= boot 参数(并且没有办法这样做,因为没有附加设备)。这意味着在使用 initramfs 时您仍然可以将真实的根设备传递给内核。使用 initrd,您必须自己处理真正的根设备。另外,由于具有 initrd 的“真实”根设备是 ramdisk,因此内核必须将根设备从一个真实设备(ramdisk)真正切换到另一真实设备(您的真实根设备)。对于 initramfs,initramfs 空间(tmpfs)不是真实设备,因此内核不会切换真实设备。因此,虽然命令pivot_root与initrd一起使用,但必须对initramfs使用不同的命令。 Busybox 提供了 switch_root 来完成此操作,而 klibc 则提供了 new_root。

答案2

pivot_root当您出于某种目的想要保留原始根时 使用。pivot_root交换两个安装点。

switch_root当您想放弃原始根时使用。 switch_root 是一个修饰chroot,它将把常见的挂载点(/dev、/proc、/sys 等)移动到新的根目录中,并尝试删除旧根目录中的所有内容。

从概念上讲,使用pivot_root然后自己进行安装移动和删除在功能上等同于使用switch_root.

同样重要的是:pivot_root不能与 initramfs 一起使用。

相关内容