我制作了一个脚本,它(尝试)将我的实时磁盘复制/dev/sdb
到第二个磁盘/dev/sda
,每个分区一个 rsync (完整脚本)。
最后一步是在 上安装 grub /dev/sda
。我使用的方法是这样的:
- 挂载 /dev/sda 根分区
/mnt/root1
- 在 /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
- 运行 chrooted
update-grub
并grub-install
运行/dev/sda
:
chroot /mnt/root1 update-grub
chroot /mnt/root1 grub-install /dev/sda
- 卸载 3 个绑定安装:
# umount /mnt/root1/sys
# umount /mnt/root1/proc
# umount /mnt/root1/dev
但是,/mnt/root1/dev
umount 失败:
# 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>