无法卸载 /dev 绑定挂载

无法卸载 /dev 绑定挂载

我制作了一个脚本,它(尝试)将我的实时磁盘复制/dev/sdb到第二个磁盘/dev/sda,每个分区一个 rsync (完整脚本)。

最后一步是在 上安装 grub /dev/sda。我使用的方法是这样的:

  1. 挂载 /dev/sda 根分区/mnt/root1
  2. 在 /mnt/root1 上绑定挂载 {/dev,/sys/,/proc} :
# mount -o bind /sys  /mnt/root1/sys
# mount -o bind /proc /mnt/root1/proc
# mount -o bind /dev  /mnt/root1/dev
  1. 运行 chrootedupdate-grubgrub-install运行/dev/sda
chroot /mnt/root1 update-grub
chroot /mnt/root1 grub-install /dev/sda
  1. 卸载 3 个绑定安装:
# umount /mnt/root1/sys
# umount /mnt/root1/proc
# umount /mnt/root1/dev

但是,/mnt/root1/devumount 失败:

# umount  /mnt/root1/dev 
umount: /mnt/root1/dev: target is busy.

笔记:mount 命令给出了/dev/mnt/root1/dev

udev on /dev type devtmpfs (rw,nosuid,relatime,size=8131896k,nr_inodes=2032974,mode=755,inode64)
udev on /mnt/root1/dev type devtmpfs (rw,nosuid,relatime,size=8131896k,nr_inodes=2032974,mode=755,inode64)

我的问题是:绑定安装怎么会很忙?有解决方法吗?

编辑:我能够 umount (实际上隐藏了它已安装的事实,如果我理解手册页) /mnt/root1/dev 与umount --lazy,但它对我来说看起来不正确。

相关问题:https://stackoverflow.com/questions/7878707/how-to-unmount-a-busy-device

答案1

从杂项考虑开始:

当实现类似的目的时,我更喜欢安装:

  • --类型过程/proc /mnt/root1/proc 这是因为 proc 是一种特殊的文件系统,我不确定它总是会被自动识别。顺便说一句,由于其目的和性质,它不需要(不应该?)绑定到 /proc

  • 对于 /sys 和 /dev,我更喜欢:

A :--rbind/sys /mnt/root1/sys (mount --rbind /dev /mnt/root1/dev)
因为我需要递归挂载( /sys 和 /dev 的子目录也应该感到担心)

乙:--make-rslave/mnt/root1/sys (mount --make-rslave /mnt/root1/dev)
对于您的问题,这是关键点。

因为一个奴隶坐骑从其主机接收传播,但反之亦然,挂载并卸载事件只会向它传播。

保证了这个关键点,那么你应该能够umount -R /mnt/root1/dev.

答案2

绑定安装怎么会很忙?

可能有一个后台进程仍在运行,该进程正忙于/dev从 chroot 内引用挂载。检查与lsof.

有解决方法吗?

终止持有此类引用的进程/dev


我遇到了完全相同的问题场景。我从 live CD 启动并从硬盘挂载 root fs 分区,以便在 chroot 下运行 dnf 命令。完成后,我退出 chroot 并卸载所有绑定挂载 (/dev /proc /sys /run),但 dev 绑定挂载拒绝卸载。

(root) localhost-live: /media>dmesg | grep devtmpfs
[    0.592936] devtmpfs: initialized
(root) localhost-live: /media>mount | grep devtmpfs
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=4096k,nr_inodes=4089246,mode=755,inode64)
devtmpfs on /media/luks_sda4/dev type devtmpfs (rw,nosuid,seclabel,size=4096k,nr_inodes=4089246,mode=755,inode64)
(root) localhost-live: /media>umount /media/luks_sda4/dev
umount: /media/luks_sda4/dev: target is busy.
(root) localhost-live: /media>umount --force /media/luks_sda4/dev
umount: /media/luks_sda4/dev: target is busy.
(root) localhost-live: /media>fuser /media/luks_sda4/dev
/media/luks_sda4/dev:    25rc
(root) localhost-live: /media>ps aux | sed -n '1p; / 25 /p'
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          25  0.0  0.0      0     0 ?        S    05:44   0:00 [kdevtmpfs]
root        7984  0.0  0.0 222560  2304 pts/1    S+   07:58   0:00 sed -n 1p; / 25 /p
(root) localhost-live: /media>

在寻找解决方案时我遇到了这篇博文它建议lsof在目录上运行,并且给出了问题所在的非常清晰的提示:

(root) localhost-live: /media>lsof luks_sda4
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh-agent 4007 root  cwd    DIR  253,2     4096    2 luks_sda4
ssh-agent 4007 root  rtd    DIR  253,2     4096    2 luks_sda4
(root) localhost-live: /media>

我有钥匙链安装并启动 chroot 时,系统要求我提供 ssh 密钥的密码(正常)。显然,作为 ssh-agent 实例的一部分,它在后台启动,但它并没有通过退出 chroot 来终止。

有了这些知识,卸载开发绑定安装就很简单了:

(root) localhost-live: /media>kill -HUP 4007
(root) localhost-live: /media>lsof luks_sda4
(root) localhost-live: /media>umount /media/luks_sda4/dev 
(root) localhost-live: /media>mount | grep devtmpfs
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=4096k,nr_inodes=4089246,mode=755,inode64)
(root) localhost-live: /media>

相关内容