rbind挂载后递归umount


13

进入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
您确定/mnt/chroot/sys/kernel/security在那个时候安装了吗?输出是grep /sys/kernel/security /proc/mounts什么?umount不需要将其参数列在中/etc/mtab。如果通过它-n,它将根本不会打开文件。
吉尔(Gilles)'所以

如果您仔细查看我的grep命令(用于为umount创建xargs),我只会向其发送/ proc / mounts
natecornell 2014年

Answers:


11

这对我来说正确--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会受到原始旧安装点下繁忙(打开)文件的影响。(非常意外...)

不知道这在最新版本的mount中是否已解决,但完全可以--rbind--make-rslave用相同的mount调用:mount --rbind --make-rslave /dev /mnt/test
Javi Merino

1
虽然可以将两个参数组合在一起,但可以使其进行非递归安装。因此,它实际上并没有按预期工作。
Miral

10

这个答案归功于Gilles。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

谢谢,吉尔斯!


1
尝试mount --rbind / /mnt && umount -n /mnt/dev/shm(或点),我明白了umount: /mnt/dev/shm: target is busyumount -l /mnt杀死系统(例如sudo无法说stdin不是tty)。这是在已安装的Fedora系统上。我想这是我的一个老问题:unix.stackexchange.com/questions/269695/…–
sourcejedi

3

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

手册页上的内容如下:

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


0

感谢那。我在脚本中使用了此命令来卸载整个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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.