当进入 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
在尝试卸载它们之前运行它们。umount
device 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