它并不总是这样,但现在我得到了这种不一致的行为。绑定挂载不会复制现有挂载(除非您使用--rbind
),但会自动复制新挂载(和卸载)。这似乎是一个错误。这是什么原因造成的?
# mount --bind / /mnt/tmp
# mount | grep /mnt
/dev/mapper/fedora-root on /mnt/tmp type ext4 (rw,relatime,seclabel,data=ordered)
# mount /var/lib/docker
# mount | grep mnt
/dev/mapper/fedora-root on /mnt/tmp type ext4 (rw,relatime,seclabel,data=ordered)
/dev/mapper/fedora-docker on /mnt/tmp/var/lib/docker type ext4 (rw,relatime,seclabel,data=ordered)
这种情况发生在 Fedora Workstation 23 上。我相信 Debian 8 也会受到影响。
如果我在没有其他进程的情况下启动 bash,则不会发生这种情况,即init=/bin/bash
.所以它似乎不是 Linux 内核固有的。
这很烦人,因为这曾经是将文件从根文件系统移动到新安装点的最简单方法。使用 SELinux 会特别方便(至少如果您使用?),因为文件会自动标记,从而避免了诸如此类的cp
需要。restorecon
答案1
mount --make-private
如果您在安装点上运行,您应该能够看到新的安装停止被复制。
作为 init 运行 bash 的区别在于来源文件系统已作为私有安装。[*] 而引导整个系统正在有效运行--make-shared
。您可以通过查看来看到差异findmnt -o +PROPAGATION
。
一旦根文件系统被挂载为共享,任何直接挂载在其下的文件系统都将继承相同的传播设置。
根文件系统正在重新挂载为共享systemd
。该功能于 2012 年左右添加到 systemd 中。令人惊叹的 Arch Linux wiki 上对此进行了讨论。
https://github.com/systemd/systemd/commit/b3ac5f8cb98757416d8660023d6564a7c411f0a0
当您阅读本文时,我还建议您学习如何安全拆卸递归绑定安装。因为在共享挂载上,挂载并卸载双向传播:-)。
[*] 使用 启动init=/bin/bash
,我看到文件系统安装为私有。尽管我仍然使用 Fedora 的dracut
initramfs 启动,它在内部运行 systemd。我不是 100% 确定这里发生了什么。
答案2
我不知道为什么会发生这种情况,但我找到了避免这种情况的方法。至少对于大多数文件系统,您可以再次挂载它们,而不是使用绑定挂载。
编辑:使用此功能有其自身的一些问题。当您第二次挂载文件系统时,您传递的任何特定于文件系统的挂载选项都会被忽略。
# mount /dev/mapper/fedora-root /mnt/tmp
# mount | grep /mnt/tmp
/dev/mapper/fedora-root on /mnt/tmp type ext4 (rw,relatime,seclabel,data=ordered)
# mount /var/lib/docker
# mount | grep /mnt/tmp
/dev/mapper/fedora-root on /mnt/tmp type ext4 (rw,relatime,seclabel,data=ordered)