如果您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 事件应该传播。但这意味着即将移动的整个安装树将被卸载。如果山树以某种方式重叠,那就更糟了。那里有很多隐藏的复杂性,这就是它被简单地阻止的原因。