有没有办法卸载“父”安装点?

有没有办法卸载“父”安装点?

我的一位同事将错误的卷安装到目录上,然后将正确的卷安装到同一目录上。有没有办法卸载这个“不正确”的卷而不接触“正确”的卷?

这是这种情况的可重现示例:

$ dd if=/dev/zero of=file-a bs=1M count=1
$ mkfs.ext4 file-a
$ dd if=/dev/zero of=file-b bs=1M count=1
$ mkfs.ext4 file-b
$ mkdir target
$ sudo mount -o loop file-a target
$ sudo mount -o loop file-b target

以下是这些命令之后的情况:

$ findmnt
TARGET                                SOURCE         FSTYPE         OPTIONS
/                                     /dev/xxx       ext4           
└─/home/user/test-umount/target       /dev/loop1     ext4           rw,relatime
  └─/home/user/test-umount/target     /dev/loop2     ext4           rw,relatime

所以我们想/dev/loop1在这里卸载设备,但保留/dev/loop2挂载到target.

这样做umount target将卸载第二卷,这不是预期的效果。尝试卸载循环设备本身会给出:

$ sudo umount /dev/loop1
$ umount: /dev/loop1: umount failed: Invalid argument.

有什么办法可以解决这个难题吗?

答案1

就在这里。

将该安装移动target到其他地方,卸载原始安装,然后将其移回:

# mkdir target-1
# mount --move target target-1
# umount target
# mount --move target-1 target

如果根或任何其他父挂载的target传播设置为共享(使用 systemd 时的默认设置),则移动挂载将不起作用。在这种情况下,您可以mount --move用一对mount --make-rprivate /; ...; make --rshared /命令将其括起来:

# mkdir target-1
# mount --make-rprivate /; mount --move target target-1; mount --make-rshared /
# umount target
# mount --make-rprivate /; mount --move target-1 target; mount --make-rshared /

不过,检查一下是个好主意。之前和之后:

# grep -v shared /proc/self/mountinfo
#

相关内容