您何时会在switch_root上使用ivot_root?


19

我想更好地了解Linux初始化过程,以便通过ceph而不是nfs网络引导系统。

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

您什么时候可以使用另一个?我已经看到两者都用在放置在根目录下的一些init脚本中。

Answers:


16

我在这里找到了一个很好的解释。但是,让我尝试将答案中的理解写成较短的格式。

短版

  1. 系统启动时,它需要早期的用户空间。可以使用initramfs或initrd来实现。
  2. initrd被加载到ramdisk中,它是一个实际的 FILE SYSTEM
  3. initramfs的不是一个文件系统
  4. 对于initrd pivot_root使用,对于initramfs switch_root使用。

较长的版本

现在,对上面我所做的详细解释。

尽管initramf和initrd具有相同的目的,但有2个区别。最明显的区别是initrd已加载到ramdisk中。它由安装在虚拟磁盘中的实际文件系统(通常为ext2)组成。另一方面,initramfs不是文件系统。它只是一个(压缩的)cpio归档文件(类型为newc),已解压缩到tmpfs中。这样做的副作用是使initramfs更加优化,并且在内核引导过程中的加载比initrd稍早。同样,内存中的initramfs的大小也较小,因为内核可以使tmpfs的大小适应实际加载的大小,而不是依赖于预定义的ramdisk大小,

还有另一个副作用差异:如何处理根设备(以及切换到根设备)。由于initrd是解压缩到ram中的实际文件系统,因此根设备必须实际上是ramdisk。对于initramfs,有一个内核“ rootfs”,它成为将initramfs解包到的tmpfs(如果内核加载了initramfs;否则,则rootfs就是通过root = kernel boot参数指定的文件系统),但是不应将此临时rootfs指定为root =引导参数(并且将无法执行此操作,因为未连接任何设备)。这意味着在使用initramfs时,您仍然可以将真正的根设备传递给内核。使用initrd,您必须处理真正的根设备是您自己。另外,由于“真实” 具有initrd的根设备是ramdisk,内核必须将根设备从一台实际设备(ramdisk)切换到另一台(您的真实根目录)。对于initramfs,initramfs空间(tmpfs)不是真实设备,因此内核不会切换真实设备。因此,尽管命令ivot_root与initrd一起使用,但对于initramfs必须使用其他命令。Busybox提供switch_root来完成此任务,而klibc提供new_root。一个不同的命令必须用于initramfs。Busybox提供switch_root来完成此任务,而klibc提供new_root。一个不同的命令必须用于initramfs。Busybox提供switch_root来完成此任务,而klibc提供new_root。


2
pivot_root过去用于initramfs,switch_root当时不存在。switch_root似乎是一种方便的方法pivot_root该方法可以进行更多清理,移动/proc /sys以及其他操作/dev,而不仅仅是根本身
Daniel Alder

2
您不能在initramfs rootfs上使用pivot_root,您将获得无效参数。您只能透视真实的文件系统。
TiCPU

@TiCPU那么Linux将如何退出早期的用户空间?
Melab

提供的解决方案似乎是错误的。Linus自己说,pivot_root()或chroot()只会更改的当前进程参考/。因此,根据我的理解,它可能是任何路径,与实际的“磁盘”无关。
erikbwork

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.