为什么需要一个循环设备?

cor*_*sel 18 filesystems mount block-device loop-device

我以前曾经使用 来创建图像文件dd,使用它们在它们上设置一个文件系统,mkfs然后mount它们将它们作为已安装的分区进行访问。后来在网上看到很多例子都是losetup事先在 下做一个loop设备入口/dev,然后挂载。我不知道为什么实际上需要一个图像文件来充当循环设备并拥有自己的/dev条目,而可以轻松获得相同的行为。

总结:在实际场景中,为什么我们根本不需要一个/dev/loopX条目,而我们可以直接挂载 fs 映像而没有它?循环装置有什么用?

Ste*_*ris 24

通常,安装必须在块设备上完成。循环驱动程序将块设备前端放入您的数据文件中。

如果您在没有循环安装的情况下执行循环安装,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
$ 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我不能直接挂载

$ 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
Run Code Online (Sandbox Code Playgroud)

但是,如果使用losetupkpartx然后我就可以访问该分区:

$ 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
$
Run Code Online (Sandbox Code Playgroud)


Ste*_*itt 20

文件系统期望读取和写入块设备,但图像文件不是块设备。循环设备在文件(或另一个块设备,可选择重新映射)之上提供块设备。

在很多情况下,挂载图像时无需考虑循环设备,因为mount它会为您处理一切;但仍然涉及循环设备。losetup -l -a将展示给他们。

另请参阅mount 和 mount -o loop 之间的区别是什么

  • 是的,`mount` 负责 `losetup`,添加 `-o loop` 等。 (2认同)

sch*_*ily 12

您似乎在使用 Linux,而 Linux 对该功能使用了错误的名称。

我于 1988 年在 SunOS-4.0 上发明了该功能,我称该功能为fbk- 文件模拟块设备。

背景是设备驱动程序在纯文件之上模拟块设备。您需要它,因为文件系统不能使用普通文件作为文件系统的后台存储。它更需要一个块设备,这就是fbk模拟。

一段时间以来,有些人使程序mount变得更加聪明,并且有一些挂载实现会自动fbk为文件创建一个实例,以防mount程序检测到预期为块设备的参数似乎是计划文件。

  • 你的帖子有点精英。您可能已经编写了第一个实现,但是 Linux 使用了不同的实现,因此它没有使用“错误”名称,只是与您为实现选择的名称不同。 (11认同)
  • “循环”名称是“环回”的缩写,指的是块设备上的操作“环回”到 VFS 的方式。Solaris 8 引入了一个工作方式类似的`lofi`(“环回文件”)设备;BSD 以“vnd”(“vnode 磁盘”)的名称引入了它们,因此这些年来这个概念有很多不同的名称。 (9认同)
  • 我从来没有说过他们使用了正确的名字,我只是说声称这是错误的会让你听起来像一个固执己见的精英主义者。 (4认同)
  • 您在个人资料中获得的简历令人印象深刻。尊重... (3认同)
  • CS 中最难的两个问题:缓存一致性、标识符命名和一对一错误。 (2认同)