我如何让 losetup -a 正常工作?

我如何让 losetup -a 正常工作?
# losetup /dev/loop0 /tmp/tmpuUwgbn
# losetup -a
# losetup -f
/dev/loop1
# losetup /dev/loop0
/dev/loop0: [0806]:33654 (/tmp/tmpuUwgbn)
# ls -la /tmp/tmpuUwgbn
-rw------- 1 root root 0 2011-08-24 15:49 /tmp/tmpuUwgbn
# losetup -a
#

明明知道的情况下为什么不losetup -a列出来呢?/dev/loop0man页面没有给出任何提示。

答案1

备份文件小于 512B 的循环设备不会在 中列出/proc/partitions,lostup 使用它来查找循环设备。我相信它没有在那里列出的原因是通过创建这样的循环设备,您得到的块设备小于其块大小(在循环设备的情况下为 512B)。

因此,虽然 losetup 和内核允许您创建小于 512B 的循环设备,但您无论如何都不能使用它(无法读取或写入它blocksize --getsize returns 0)。您可以使用此类设备做的唯一事情是 - 据我了解 - 增长支持文件并调用losetup -c /dev/loopX- 如果支持文件 >=512B,则循环设备现在出现在/proc/partitions和 中$(losetup -a)

恕我直言,这种能力losetup -c是内核支持使用 <511B 后备文件创建循环设备而不是返回错误的原因。

答案2

这是因为losetup -a由于某种原因没有列出关联文件小于 512 字节的循环设备:

# losetup /dev/loop1 `mktemp`
# losetup -a
# losetup -d /dev/loop1
# t=`mktemp`; truncate --size 1 $t; losetup /dev/loop1 $t
# losetup -a
# losetup -d /dev/loop1
# t=`mktemp`; truncate --size 511 $t; losetup /dev/loop1 $t
# losetup -a
# losetup -d /dev/loop1
# t=`mktemp`; truncate --size 512 $t; losetup /dev/loop1 $t                    
# losetup -a
/dev/loop1: [0806]:33683 (/tmp/tmp.M0F7bovkxK)

为什么?我希望我知道。我觉得该man页面应该在某处提到这一点。

相关内容