我无法卸载在其上创建并删除映射的分区kpartx
:
# mount /dev/sdb1 usb/
# cd usb/
# kpartx -a -p sda -r -s -v sda.img
add map loop0sda1 (254:5): 0 16777216 linear 7:0 2048
add map loop0sda2 (254:6): 0 16777216 linear 7:0 16779264
add map loop0sda3 (254:7): 0 440401920 linear 7:0 33556480
add map loop0sda4 (254:8): 0 26159792 linear 7:0 473958400
# kpartx -dv /dev/loop0
del devmap : loop0sda4
del devmap : loop0sda3
del devmap : loop0sda2
del devmap : loop0sda1
# cd ..
#umount usb/
target is busy.
据我所知,该命令kpartx -dv /dev/loop0
正确删除了映射,我可以看到它们已从/dev/mapper/
.但我仍然无法卸载磁盘,因为它报告:target is busy.
lsof
显示没有从该磁盘打开文件:
# lsof +D
为什么在释放所有映射后我无法取消磁盘挂载?
答案1
第二个命令并不完全与第一个命令相反,因为作为参数给出的循环设备而不是最初触发此循环设备创建的块映像文件。
如果您随后运行:
losetup -l /dev/loop0
您很可能会得到以下输出:
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 0 0 1 /path/to/usb/sda.img 0 512
这使得资源与sda.img
文件绑定在一起,从而在提供它的文件系统上绑定,从而防止卸载它。
在这种状态下,要释放剩余资源,只需执行以下操作:
losetup -d /dev/loop0
应该做什么?
kpartx -dv /path/to/usb/sda.img
这一次应该给出:
del devmap : loop0sda4
del devmap : loop0sda3
del devmap : loop0sda2
del devmap : loop0sda1
loop deleted : /dev/loop0