挂载新文件系统会影响非递归绑定挂载吗?

挂载新文件系统会影响非递归绑定挂载吗?

它并不总是这样,但现在我得到了这种不一致的行为。绑定挂载不会复制现有挂载(除非您使用--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://wiki.archlinux.org/index.php?title=谈话:Systemd&oldid=411350#Systemd_defaults_.2F_to_rshared.2C_gotcha

https://github.com/systemd/systemd/commit/b3ac5f8cb98757416d8660023d6564a7c411f0a0


当您阅读本文时,我还建议您学习如何安全拆卸递归绑定安装。因为在共享挂载上,挂载并卸载双向传播:-)。


[*] 使用 启动init=/bin/bash,我看到文件系统安装为私有。尽管我仍然使用 Fedora 的dracutinitramfs 启动,它在内部运行 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)

相关内容