rbind 挂载后递归卸载

nat*_*ell 18 mount unmounting

当进入 chroot 时,有时需要使用 -rbind 而不是 -bind 挂载 /sys 和 /dev 以确保当有人去寻找时一切都在正确的位置。

卸载时出现问题。

一个简单的 umount 总是失败;随着孩子们也被安装,它似乎正在使用:

$ umount /mnt/chroot/sys
umount: /mnt/chroot/sys: device is busy.
    (In some cases useful info about processes that use
     the device is found by lsof(8) or fuser(1))
Run Code Online (Sandbox Code Playgroud)

另一种可能的解决方案是从 proc 中列出挂载,然后像这样卸载每个挂载:

$ grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount
Run Code Online (Sandbox Code Playgroud)

但是,这也失败了,因为递归挂载实际上并未在 mtab 中注册:

/mnt/chroot/sys/kernel/security is not mounted (according to mtab)
Run Code Online (Sandbox Code Playgroud)

也许解决方案是执行惰性卸载,但这对我来说似乎很危险。

有没有更好的方法来做到这一点,我错过了?

imz*_*hev 21

这对我有用 - https://unix.stackexchange.com/a/264488/4319

mount --rbind /dev /mnt/test
mount --make-rslave /mnt/test
umount -R /mnt/test
Run Code Online (Sandbox Code Playgroud)

将前两个命令作为两个单独的命令非常重要:不要组合--rbind--make-rslave在一次 mount 调用中。

没有--make-rslave,该行为是不需要的(并且不成功):

  • umount -l 也会影响原来的旧挂载点,
  • 并且umount -R会受到原始旧挂载点下繁忙(打开)文件的影响。(很意外……)


nat*_*ell 10

这个答案归功于吉尔斯;吉尔斯在问题评论中指出,“-n”开关会忽略 mtab 并卸载 /proc/mounts 中列出的任何内容。

从联机帮助页:

-n     Unmount without writing in /etc/mtab.
Run Code Online (Sandbox Code Playgroud)

因此,要回答我关于如何解开 --rbind 挂载的问题,这是对我有用的完整命令:

grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount -n
Run Code Online (Sandbox Code Playgroud)

谢天谢地,吉尔斯!


Pau*_*ias 5

util-linux v2.23 (25-Apr-2013) 开始,该umount命令支持该-R, --recursive选项。

这是手册页的内容:

递归卸载每个指定的目录。如果链中的任何卸载操作因任何原因失败,则每个目录的递归都将停止。挂载点之间的关系由/proc/self/mountinfo 条目决定 。文件系统必须由挂载点路径指定;不支持按设备名称(或 UUID)递归卸载。

对于安装了--rbind它的文件系统,mount --make-rslave如果umount抱怨device is busy.