卸载后无法分离文件支持的循环设备

卸载后无法分离文件支持的循环设备

我有一些经常通过 用于交叉编译工作的映像文件chroot。我通常会用它创建一个循环设备,挂载它的主分区,绑定挂载/dev,,,也许(我实际上不知道正确的还需要什么,但这似乎工作正常),然后来工作。所有这些似乎都有效,但是在卸载所有内容后,循环设备实际上无法通过分离/proc。相反,标志似乎被设置了,就是这样。我试图删除底层文件(成功了),试图诱骗它放手,但所做的只是添加到 输出中相应行的末尾。对于更具体的例子,这大概是我所做的。/sys/etc/resolv.confchrootchrootlosetup -d $LOOP_DEVICEAUTOCLEAR(deleted)losetup -d $LOOP_DEVICE

# Pretend this never fails
LOOP_DEVICE=$(sudo losetup --partscan --file --show $SOME_IMAGE_FILE)

# Mount the desired partition for chrooting
sudo mount ${LOOP_DEVICE}${LOOP_PARTITION} $MOUNT_POINT

# Recursive bind mount and rslave, so it can be easily unmounted
for DIRECTORY in dev proc sys
do
    sudo mount --rbind /$DIRECTORY $MOUNT_POINT/$DIRECTORY
    sudo mount --make-rslave $MOUNT_POINT/$DIRECTORY
done

# Do what needs to be done in there
sudo chroot $MOUNT_POINT $SOME_COMMAND

# Clean up, unmount, and detach
sudo umount -R $MOUNT_POINT
sudo losetup -d $LOOP_DEVICE

# At this point, $LOOP_DEVICE still shows up, for some reason,
# even if $SOME_IMAGE_FILE is deleted
sudo losetup -l

我还尝试过逐个卸载某些东西,以防万一umount -R无法正确卸载所有东西,但这并没有解决问题。要重现此问题,也许可以尝试使用 Raspberry Pi 映像或其他东西,然后运行上述命令。请注意,这只是一个粗略的命令列表,用于说明我所做的操作,并不是真正的脚本。

我四处寻找答案,但它们要么是旧的(例如,一个指向十年前的内核错误),要么是没有答案,要么是含糊不清,要么与我的情况不太接近。我不知道是我做错了什么导致循环设备无法拆卸,还是它真的是十年来一直没有修复的内核错误,或者这个问题真的是我在搜索中遗漏的内容的重复。就上下文而言,我在内核 5.4.0 上的 Ubuntu 18.04 上,但我认为在内核 5.8.0 上的 Ubuntu 20.04 上也发生过这种情况。

答案1

在 Debian Testing (Bookworm) 上使用 5.18 内核或我编译的全新 6.0RC1 内核时仍然会发生这种情况。这全是由于 --make-rslave。如果我仅使用 --rbind 挂载 dev 或 sys,则不会发生这种情况,但这会导致另一个问题,即 /dev 和/或 /sys 在卸载后会从正常操作系统中卸载。

我不知道这个问题是否会被解决。据我所知,这个问题已经存在很长时间了。

这只会发生在环回设备上,不会发生在其他设备上。我可以在 USB 驱动器上执行相同的操作,没有任何问题。

相关内容