rbind挂载后递归umount

rbind挂载后递归umount

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

卸载的时候问题就来了。

简单的卸载总是会失败;随着孩子们的安装,它似乎正在使用中:

$ 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))

另一种可能的解决方案是列出 proc 中的挂载,然后卸载每个挂载,如下所示:

$ grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount

然而,这也会失败,因为递归挂载实际上并未在 mtab 中注册:

/mnt/chroot/sys/kernel/security is not mounted (according to mtab)

也许解决方案是执行延迟卸载,但这对我来说似乎相当危险。

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

答案1

这对我来说是正确的——https://unix.stackexchange.com/a/264488/4319:

mount --rbind /dev /mnt/test
mount --make-rslave /mnt/test
umount -R /mnt/test

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

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

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

答案2

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

从联机帮助页:

-n     Unmount without writing in /etc/mtab.

因此,为了回答我如何解开 --rbind 安装的问题,这是对我有用的完整命令:

grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount -n

谢谢,吉尔斯!

答案3

自从实用程序Linux v2.23(2013 年 4 月 25 日) 该umount命令支持该-R, --recursive选项。

手册页内容如下:

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

对于用它挂载的文件系统,如果抱怨的话--rbind,可能需要mount --make-rslave在尝试卸载它们之前运行它们。umountdevice is busy

答案4

感谢那。我在脚本中使用它来卸载整个 chroot-tree:(确保相应地设置 $MNT)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done

相关内容