为什么禁止“移动共享挂载下的挂载”

为什么禁止“移动共享挂载下的挂载”

如果您mount --move在系统上运行使用 systemd 启动,将被禁止并显示上述消息。

这意味着您可以mount --make-private在父装载上运行,然后允许移动......

但我注意到我能够移动坐骑到共享子树。例如

mount --make-private /boot/
mount --move /boot/efi /mnt

这种区别意味着尝试撤消使用mount --move /mnt /boot/efi, 也会失败。

禁止移动共享挂载下的挂载的原因是什么?为什么允许移动坐骑在共享安装下?

$ mount --version
mount from util-linux 2.30.2 (libmount 2.30.2: selinux, btrfs, assert, debug)
$ rpm -q util-linux
util-linux-2.30.2-1.fc26.x86_64

答案1

确实,没有任何地方记录为什么您无法移动位于共享父级下的安装。我在内核中对这段代码进行了大量研究,我的理由是它是被禁止的,因为它很容易违反挂载传播语义。

例如,考虑以下代码:

mount --bind /opt /opt
mount --make-shared /opt
mkdir /opt/A
mount --bind /tmp /opt/A

mount --move /opt/A /mnt

由于 的父级/opt/A是共享挂载,这意味着/opt属于的整个源传播树需要从 移动/opt/mnt。但是,很容易设想这样一种情况:并非原始传播树中/opt所属的每个挂载都可以移动到,/mnt因为可能没有相应的挂载点。使用挂载命名空间很容易发生这种情况。因此,在这种情况下,在目标传播树中没有安装点的安装将必须被丢弃。但这意味着需要触发 umount 事件。但这还有其他问题。例如,有人可能会争辩说 umount 事件应该传播。但这意味着即将移动的整个安装树将被卸载。如果山树以某种方式重叠,那就更糟了。那里有很多隐藏的复杂性,这就是它被简单地阻止的原因。

相关内容