卸载 rbind 挂载而不影响原始挂载

ica*_*ndo 12 linux mount unmounting linux-kernel bind-mount

serverfault 上被问到但没有得到足够的关注,所以在这里重新发布,希望这里的一些人知道答案。

还有另一个问题在讨论卸载 rbind 挂载,但该解决方案有不良影响。考虑以下目录布局:

.
??? A_dir
?   ??? mount_b
??? B_dir
?   ??? mount_c
??? C_dir
Run Code Online (Sandbox Code Playgroud)

现在我绑定C_dirB_dir/mount_c和 rbindB_dirA_dir/mount_b

[hidden]$ sudo mount --bind C_dir B_dir/mount_c
[hidden]$ sudo mount --rbind B_dir A_dir/mount_b
[hidden]$ mount | grep _dir | wc -l
3
Run Code Online (Sandbox Code Playgroud)

现在umount A_dir/mount_b会失败,这并不奇怪。根据网络上随处可见的答案,我们需要umount A_dir/mount_b/mount_c先然后umount A_dir/mount_b。但是,umount A_dir/mount_b/mount_c也会 unmount B_dir/mount_c,这是不需要的:

[hidden]$ sudo umount A_dir/mount_b/mount_c
[hidden]$ mount | grep _dir | wc -l
1
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,我如何卸载A_dir/mount_bB_dir不受影响,即仍然绑定B_dir/mount_cC_dir

编辑:这个问题似乎没有出现在 Ubuntu 中。更具体地说,它在我的 Ubuntu 14.04 上运行良好,但在 Fedora 23 和 CentOS 7 上运行不正常。为什么会有不同,Fedora 和 CentOS 有什么工作?

编辑:关于我试图解决的实际问题的更多信息。我尝试创建一个沙箱并用于--rbind/dev和安装/proc到沙箱。销毁沙箱时,我似乎无法彻底销毁它,因为<sandbox-root>/dev/pts在 FC23 和 CentOS7 中卸载将卸载/dev/pts,之后我的 shell 和 SSH 连接挂起,我必须重新启动机器。这就是为什么我要问是否有办法卸载 --rbind 安装而不影响子安装。

ica*_*ndo 12

我自己找到了解决方案。我只需要使用--make-rslave来进行任何更改,A_dir/mount_b而不是传播回B_dir

sudo mount --make-rslave A_dir/mount_b
sudo umount -R A_dir/mount_b
Run Code Online (Sandbox Code Playgroud)

请参阅mount手册页部分共享子树操作