就 chroot 环境而言,“mount -t ...” 和“mount -o bind ...” 之间有什么区别

就 chroot 环境而言,“mount -t ...” 和“mount -o bind ...” 之间有什么区别

因此,我正在设置一个 chroot,其中我需要 proc、sys 和 dev 文件夹。

我已读到我需要按如下方式安装它们:

mount -t proc /proc /mnt/chroot/proc
mount -t sysfs /sys /mnt/chroot/sys
mount -o bind /dev /mnt/chroot/dev

从这里获得的答案:在 chroot 环境中挂载 dev-proc-sys

但我没有找到解释差异的地方。我看不出它们怎么会有很大的不同……

答案1

/dev是 tmpfs 的一个变体(devtmpfs)。内核用设备节点填充它,但内容是灵活的,并且udev用户空间守护进程调整其权限,创建符号链接(例如 /dev/disk/by-*)等。

您想要绑定现有实例以便继承 udev 所做的更改。尝试挂载一个新实例将会提供一个只有内核提供的节点但没有 udev 链接的新 tmpfs。划掉,显然当前的内核将 devtmpfs 视为单实例,而不是普通的 tmpfs。也就是说,挂载两次仍会得到相同的内容。

但是,我认为相同的理由仍然适用:人们建议绑定 /dev,因为他们做出了与我相同的假设(无论正确与否),即它的工作方式与传统的 tmpfs 相同。

此外,直到最近,/dev曾是事实上,传统的 tmpfs一切在其中由用户空间(udev 或类似)创建。在使用添加 devtmpfs 之前的系统时,绑定 /dev 仍然是必要的。

/proc并且/sys是完全虚拟的文件系统(procfs 和 sysfs)。内核控制全部操作并定义了一个刚性结构。

同一命名空间内的多个 procfs 或 sysfs 挂载完全相同 - 它们都引用文件系统的同一实例。因此,为普通 chroot 挂载新实例与绑定现有实例之间没有区别。

(当您使用容器时,差异开始出现,例如进程命名空间或网络命名空间。在容器内安装新的 procfs 实例只会提供对其自身进程的有限视图;绑定主机的 procfs 将允许容器查看所有进程。)

相关内容