回环设备(loop-back devices)
回环设备( 'loopback device')允许用户以一个普通磁盘文件虚拟一个块设备。设想一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。(当然,disk-image 必须存在于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)回环设备允许你这样使用一个普通文件。
回环设备以/dev/loop0、/dev/loop1等命名。每个设备可虚拟一个块设备。注意只有超级用户才有权限设置回环设备。
回环设备的使用与其它任何块设备相同。特别是,你可以在这个设备上创建文件系统并像普通的磁盘一样将它挂载在系统中。这样的一个将全部内容保存在一个普通文件中的文件系统,被称为虚拟文件系统(virtualfilesystem)(译者注:这个用法并不常见。VFS通常另有所指,如指代Linux内核中有关文件系统抽象的代码层次等)。
可以通过下列步骤创建一个虚拟文件系统并通过回环设备挂载:
创建一个用于承载虚拟文件系统的空文件。这个文件的大小将成为挂载后文件系统的大小。
创建指定大小文件的简单方法是通过dd命令。这个命令以块为单位(通常为512字节)从一个文件向另一个文件复制数据。/dev/zero文件则是一个很好的数据来源。
要建立一个10MB大的名为disk-image的文件可以通过以下命令:
%ddif=/dev/zeroof=/tmp/disk-imagecount=20480
20480+0recordsin
20480+0recordsout
%ls-l/tmp/disk-image
-rw-rw----1rootroot10485760Mar801:56/tmp/disk-image
这个新建立的文件被填满了0字节。在挂载之前,必须在其上建立一个文件系统。这个过程会建立许多用于组织和存储文件的控制单元并构造根目录结构。
在这个磁盘映像之上可以构建任何类型的文件系统。以创建ext2文件系统为例(ext2是Linux系统中最常见的文件系统),用mke2fs可以完成这个操作。因为这个命令通常是针对块设备进行操作,当对一个普通文件操作时它会要求确认:
%mke2fs-q/tmp/disk-image
mke2fs1.18,11-Nov-1999forEXT2FS0.5b,95/08/09
disk-imageisnotablockspecialdevice.
Proceedanyway?(y,n)y
这里-q参数用于省略输出有关新建立文件系统的概要信息。如果你想看到这些信息,则请省略这个参数。
现在disk-image文件包含了一个新建立的文件系统,正如一个被刚刚初始化完毕的10MB大小的磁盘。
以一个环回设备挂载这个文件系统。方法是使用mount命令,指定磁盘文件为被挂载的设备。同时指定loop=loopback-device作为-o选项的参数,告诉mount命令使用哪个回环设备。
下面例子中的命令可用于挂载我们的disk-image文件系统。要记住的是只有超级用户可以使用环回设备。第一个命令将创建一个目录/tmp/virtual-fs,这个目录将被用于挂载我们的文件系统。
%mkdir/tmp/virtual-fs
%mount-oloopback=/dev/loop0/tmp/disk-image/tmp/virtual-fs
这时,这个设备应该已经被挂载,就如同一个普通的10M空间的磁盘一样。
%df-h/tmp/virtual-fs
FilesystemSizeUsedAvailUse%Mountedon
/tmp/disk-image9.7M13k9.2M0%/tmp/virtual-fs
你可以向任何其它磁盘一样使用这个设备:
%cd/tmp/virtual-fs
%echo'Hello,world!'>test.txt
%ls-l
total19
drwxr-xr-x2rootroot12288Mar802:00lost+found
-rw-rw----1rootroot14Mar802:12test.txt
%cattest.txt
Hello,world!
请注意lost+found是一个由mke2fs自动建立的文件夹一旦文件系统被破坏,部分数据被回复但没有与任何文件关联起来,将被放置在这个文件夹中。。
结束使用后,卸载这个文件系统:
%cd/tmp
%umount/tmp/virtual-fs
你可以删除disk-image,或者之后再次挂载并使用其中的文件。你甚至可以将这个文件复制到远程主机并在那里挂载、使用——文件系统的内容完全不会受到影响。
除了从新创建一个文件系统,还可以从一个现有的文件系统复制而得到一份映像。例如,可以通过普通的复制操作为一个CD-ROM创建一份映像。
如果系统中有一个IDE接口的CD-ROM驱动器,使用前面说过的设备名如/dev/hda。如果CD-ROM是SCSI接口的话,设备文件名可能是/dev/scd0之类。系统中也可能包含一个符号链接/dev/cdrom指向实际的光驱。请参考/etc/fstab(译者注:手册)查看系统实际使用的光驱对应的设备。
接下来要做的仅仅是将这个设备复制为一个文件——得到的文件将是被存在硬盘上的、这个CD-ROM内容的完整映像。例如:
%cp/dev/cdrom/tmp/cdrom-image
取决于设备的速度和CD-ROM的容量,这个操作可能需要几分钟的时间。最终的文件将会相当大,它的体积与这个CD-ROM的容量相同。
这时,你可以在系统中挂载这个光盘而无须插入原始的CD-ROM盘片。要挂载在/mnt/cdrom目录下:
mount-oloopback=/dev/loop0/tmp/cdrom-image/mnt/cdrom
因为映像位于磁盘上,这个文件系统的速度将远胜于直接挂载自实际光驱的时候。请注意多数光盘使用的文件系统类型都是 iso9660。假设我有一个磁盘镜像 /tmp/sda1.img
#mount/tmp/sda1.img/mnt/sda1-oloop
#umount/tmp/sda1.img
即可