3.11 环回文件与挂载

环回(loopback)文件系统是Linux系统中非常有趣的部分。我们通常是在设备上(例如磁盘分区)创建文件系统。这些存储设备能够以设备文件的形式来使用,比如 /dev/device_name。为了使用存储设备上的文件系统,我们需要将其挂载到一些被称为挂载点(mount point)的目录上。环回文件系统是指那些在文件中而非物理设备中创建的文件系统。我们可以将这些文件挂载到挂载点上,就像设备一样。让我们来看看这是如何实现的。

3.11.1 预备知识

环回文件系统存在于文件之中。我们通过将环回文件连接到一个设备文件来进行挂载(mount)。环回文件系统的一个例子就是初始化内存文件,它位于 /boot/initrd.img。这个文件中存储了一个用于内核的初始化文件系统。

让我们来看看如何在一个1GB的文件中创建ext4文件系统。

3.11.2 实战演练

下面的命令可以创建一个1GB大小的文件。

  1. $ dd if=/dev/zero of=loopbackfile.img bs=1G count=1
  2. 1024+0 records in
  3. 1024+0 records out
  4. 1073741824 bytes (1.1 GB) copied, 37.3155 s, 28.8 MB/s

你会发现创建好的文件超过了1GB。这是因为硬盘作为块设备,其分配存储空间时是按照块大小的整数倍来进行的。

mkfs命令格式化这个1GB的文件:

  1. # mkfs.ext4 loopbackfile.img

这个命令将文件格式化成ext4文件系统。使用下面的命令检查文件系统:

  1. $ sudo file loopbackfile.img
  2.  
  3. loopbackfile.img: Linux rev 1.0 ext4 filesystem data, UUID=c9d56c42-f8e6-4cbd-aeab-369d5056660a (extents) (large files) (huge files)

现在就可以挂载环回文件了:

  1. $ sudo mkdir /mnt/loopback
  2. # mount -o loop loopback.img /mnt/loopback

-o loop用来挂载环回文件系统。

这是一种快捷的挂载方法。我们并没有连接到任何设备上。但是在内部,这个环回文件连接到了一个名为/dev/loop1或loop2的设备上。

我们可以手动来操作:

  1. # losetup /dev/loop1 loopback.img
  2. # mount /dev/loop1 /mnt/loopback

第一种方法并不能适用于所有情况。假如我们想创建一个硬盘文件,然后对它分区并挂载其中某个分区,那就不能使用mount -o loop,而要使用第二种方法。对一个用0填充的文件进行分区:

  1. # losetup /dev/loop1 loopback.img
  2. # fdisk /dev/loop1

在lookback.img中创建分区并挂载第一个分区:

  1. # losetup -o 32256 /dev/loop2 loopback.img

现在,/dev/loop2就代表第一个分区。

-o表示偏移量。32256字节是针对DOS分区方案的一个设置1。第一个分区自硬盘第32256字节之后起始。

1 losetup 中的 -o 32256 (512*63=32256)用于设置数据偏移。由于历史原因,硬盘第一个扇区(512 字节)作为 MBR(Master Boot Record,主引导记录),其后的62个扇区作为保留扇区。

我们可以指定所需的偏移量来设置第二个分区。挂载过分区之后,就可以像在物理设备上面那样执行任何操作了。

如果要卸载(umount),使用下面的方法:

  1. # umount mount_point

例如:

  1. # umount /mnt/sda1

或者,也可以用设备文件的路径作为umount命令的参数:

  1. # umount /dev/sda1

因为umount是一个特权命令,所以必须以超级用户的身份来执行。

3.11.3 补充内容

让我们再来研究其他的mount选项。

  • 将ISO文件作为环回文件挂载

ISO文件是任意种类光学存储介质的归档。我们可以采用环回挂载的方法,像挂载物理光盘一样挂载ISO文件。

挂载点就是一个目录,用来作为通过文件系统访问设备内容的路径。我们甚至可以用一个非空的目录作为挂载路径。那么直到设备被卸载,这个挂载路径中包含的都是来自设备的数据,而非原始目录中的内容。例如:

  1. # mkdir /mnt/iso
  2. # mount -o loop linux.iso /mnt/iso

现在就可以用 /mnt/iso中的文件进行操作了。ISO是一个只读文件系统。

  • 通过sync立即应用更改

当对挂载设备作出更改之后,这些改变并不会被立即写入物理设备。只有当缓冲区被写满之后才会进行设备回写。但是我们可以用sync命令强制将它即刻写入更改:

  1. # sync

sync命令必须以超级用户身份来执行。