我以前使用创建映像文件dd
,使用它们在它们上设置文件系统,mkfs
并将mount
它们作为已安装的分区进行访问。后来在网上看到很多例子都使用losetup
事先在 下制作一个循环设备条目/dev
,然后挂载它。我不明白为什么实际上需要一个图像文件来充当循环设备并拥有自己的/dev
条目,而无需任何麻烦即可获得相同的行为。
概括:在现实场景中,/dev/loopX
当我们可以在没有条目的情况下挂载 fs 映像时,为什么我们需要存在条目呢?循环设备有什么用?
答案1
通常,安装必须在块设备上完成。循环驱动程序将块设备前端放入数据文件中。
如果您没有进行循环安装,losetup
则操作系统会在后台执行循环安装。
例如
$ dd if=/dev/zero of=/tmp/foo bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0798775 s, 1.3 GB/s
$ mke2fs /tmp/foo
mke2fs 1.42.9 (28-Dec-2013)
....
$ losetup
$ mount -o loop /tmp/foo /mnt1
$ losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0 0 0 1 0 /tmp/foo
$ umount /mnt1
$ losetup
$
losetup
如果您的文件映像中嵌入了分区, 您可能需要直接调用。
例如,如果我有这张图片:
$ fdisk -l /tmp/foo2
Disk /tmp/foo2: 104 MB, 104857600 bytes, 204800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1f25ff39
Device Boot Start End Blocks Id System
/tmp/foo2p1 2048 204799 101376 83 Linux
我无法直接安装
$ mount -o loop /tmp/foo2 /mnt1
mount: /dev/loop0 is write-protected, mounting read-only
mount: wrong fs type, bad option, bad superblock on /dev/loop0,
missing codepage or helper program, or other error
但如果我使用losetup
然后kpartx
我可以访问分区:
$ losetup -f /tmp/foo2
$ losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0 0 0 0 0 /tmp/foo2
$ kpartx -a /dev/loop0
$ mount /dev/mapper/loop0p1 /mnt1
$
答案2
文件系统期望读取和写入块设备,但图像文件不是块设备。循环设备在文件之上提供一个块设备(或另一个块设备,可以选择重新映射)。
在许多情况下,安装映像时无需考虑循环设备,因为它mount
会为您处理所有事情;但仍然涉及循环设备。losetup -l -a
会向他们展示。
也可以看看mount 和 mount -o 循环有什么区别。
答案3
您似乎使用的是 Linux,而 Linux 对该功能使用了错误的名称。
我于 1988 年在 SunOS-4.0 上发明了该功能,我称该功能fbk
为“文件模拟 BlocK 设备”。
背景是设备驱动程序在普通文件之上模拟块设备。您需要这个,因为文件系统无法使用普通文件作为文件系统的后台存储。它更需要一个块设备,这就是fbk
模拟的。
一段时间以来,有些人使程序变得mount
更加聪明,并且存在一些挂载实现,可以自动fbk
为文件创建实例,以防mount
程序检测到预期为块设备的参数似乎是计划文件。
答案4
即使在后台从文件挂载文件系统时不需要它,您仍然需要它来进行任何使用绝对需要块设备的驱动程序或程序的设置。想想 nbd(网络块设备)服务器、复合块设备驱动程序,例如 mdraid、lvm 等......