chroot和pivot_root有什么区别?

Fly*_*Pig 8 linux linux-kernel

在我学习docker的过程中,我听说Linux命令chroot不足以隔离容器,我们需要一个名为pivot_root的新命令,为什么?我查阅了他们的手册,但只是对更不熟悉的概念感到困惑。特别是在pivot_root手册页中,它说pivot_root更改了调用进程的挂载命名空间中的根挂载。那么是什么root mount意思呢?我知道Linux在启动时会将根设备挂载到/(我不确定我是否正确),那么使用pivot_root将根设备挂载到另一个目录有什么效果呢?我也很好奇为什么我们需要这个奇怪的根设备。它是像硬盘一样的物理设备吗?

小智 4

在我学习docker的过程中,我听说Linux命令chroot不足以隔离容器,我们需要一个名为pivot_root的新命令,为什么?

您可以在chroot(2) 的手册页中看到,chroot可以使用 轻松转义cd ..。这是因为系统的根目录不是文件系统的根节点,因此,cd ..遍历文件系统可以逃避chroot.

我查阅了他们的手册,但只是对更不熟悉的概念感到困惑。特别是在pivot_root手册页中,它说pivot_root更改了调用进程的挂载命名空间中的根挂载。那么root挂载是什么意思呢?

要大致了解这些概念,请将文件系统视为文件和文件夹的后端。我们有不同的文件系统(ntfs、ext4 等),它们在硬盘中实现文件树。还有一些不受硬盘支持的特殊文件系统,例如 tempfs(使用 RAM 的临时文件系统)或 devfs(将每个设备大致映射到文件)。现在,挂载是系统的目录和文件与文件系统之间的映射

因此,pivot_root不是更改指向根的目录(确实chroot如此),而是更改挂载表,这使得/指向另一个文件系统后端。因此,cd ..将不再定义。

我知道Linux在启动时,会将根设备挂载到/(我不确定我是否正确),那么使用pivot_root将根设备挂载到另一个目录有什么效果呢?我也很好奇为什么我们需要这个奇怪的根设备。它是像硬盘一样的物理设备吗?

引导过程有几个阶段,我们不会在这里详细描述它们。有一次,系统正在运行,并且目录由 RAM 上的文件系统支持(用于执行早期工作)。然后,为了从这个根目录切换到另一个根目录(由硬盘支持),我们可以使用pivot_root(更多信息请参见此处)。因此,为了解决您的问题,根设备不是物理设备,而是安装到/.

此外,对于容器的情况,我们将一个(某种程度上虚拟的)文件系统安装到一个目录,然后将pivot_root一个进程放入该目录,这使得该进程的根目录及其子目录设置为指向该文件系统,这样我们无法逃避该文件系统(和目录),这是迈向完整沙盒容器体验的一步。