为什么一个人根本不需要回路设备?


15

我以前用过使用创建的图像文件dd,使用建立文件系统了mkfsmount他们的安装分区访问它们。稍后,我在Internet上看到许多示例losetup预先使用来在之下创建一个循环设备条目/dev,然后将其挂载。我不知道为什么人们实际上需要一个图像文件来充当循环设备并拥有自己的/dev条目,而无需任何麻烦就能获得相同的行为。

简介:在现实生活中,/dev/loopX当我们可以不使用fs映像挂载它时,为什么我们根本需要一个条目呢?循环设备有什么用?


9
“……虽然可以毫无麻烦地获得相同的行为。” -你错了;)-在Linux上,如果没有循环设备的“麻烦” 就无法挂载文件。只是如今的智能mount足以为您解决麻烦。(如史蒂芬·哈里斯(Stephen Harris)在回答中所示)
marcelm

Answers:


22

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

如果不进行循环安装,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

但是,如果使用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
$

你不需要明确的losetup,只是用mount -o loop,offset=$((512*2048)),其中512是扇区尺寸,2048是什么fdisk给了作为Start分区的。
Ruslan

是的,这只是用法的一个例子。在此特定示例中,进行偏移量计算可能会更容易,但是在某些情况下(例如,您要同时安装的多个分区)可能更容易确定losetupkpartx。让工具完成艰苦的工作:-)
Stephen Harris

18

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

在很多情况下,挂载映像时无需考虑环路设备,因为mount它可以为您处理所有事情。但是回路设备仍然存在。losetup -l -a将显示给他们。

另请参见mount和mount -o loop有什么区别


因此,块设备化由mount?隐式处理。
corsel

2
是的,mount照顾losetup,添加-o loop等等
Stephen Kitt

@corsel,在大多数情况下,让您进行挂载调用lostup可以正常工作,但也有例外,例如从磁盘映像挂载多个分区。
hildred '18 October

11

您似乎在使用Linux,并且Linux为该功能使用了错误的名称。

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

背景是设备驱动程序在纯文件顶部模拟块设备。您需要这样做,因为文件系统不能将纯文件用作文件系统的后台存储。它需要一个块设备,而这正是所fbk模拟的。

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


3
您在个人资料上获得的简历令人印象深刻。尊重...
corsel

11
您的帖子发布得有些微不足道。您可能已经编写了第一个实现,但是Linux使用了不同的实现,因此它没有使用“错误的”名称,只是您为实现选择的名称不同。
奥斯汀·海默加恩

4
我从来没有说过他们使用了正确的名字,我只是说声称自己做错了,会让你听起来像一个自以为是的精英主义者。
奥斯汀·海默加恩

9
“ loop”名称是“ loopback”的缩写,是指将块设备上的操作“环回”到VFS的方式。Solaris 8引入了lofi类似工作的(“回送文件”)设备。BSD以名称vnd(“ vnode disk”)引入了它们,因此多年来,这个概念有很多不同的名称。
caf

2
CS中最困难的两个问题是:缓存一致性,标识符命名和不合一的错误。
詹斯

1

即使在后台从文件中挂载文件系统不需要它,使用绝对需要块设备的驱动程序或程序进行安装时,也仍然需要它。考虑一下nbd(网络块设备)服务器,复合块设备驱动程序,例如mdraid,lvm等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.