3.11 环回文件与挂载
环回(loopback)文件系统是Linux系统中非常有趣的部分。我们通常是在设备上(例如磁盘分区)创建文件系统。这些存储设备能够以设备文件的形式来使用,比如 /dev/device_name。为了使用存储设备上的文件系统,我们需要将其挂载到一些被称为挂载点(mount point)的目录上。环回文件系统是指那些在文件中而非物理设备中创建的文件系统。我们可以将这些文件挂载到挂载点上,就像设备一样。让我们来看看这是如何实现的。
3.11.1 预备知识
环回文件系统存在于文件之中。我们通过将环回文件连接到一个设备文件来进行挂载(mount)。环回文件系统的一个例子就是初始化内存文件,它位于 /boot/initrd.img。这个文件中存储了一个用于内核的初始化文件系统。
让我们来看看如何在一个1GB的文件中创建ext4文件系统。
3.11.2 实战演练
下面的命令可以创建一个1GB大小的文件。
- $ dd if=/dev/zero of=loopbackfile.img bs=1G count=1
- 1024+0 records in
- 1024+0 records out
- 1073741824 bytes (1.1 GB) copied, 37.3155 s, 28.8 MB/s
你会发现创建好的文件超过了1GB。这是因为硬盘作为块设备,其分配存储空间时是按照块大小的整数倍来进行的。
用mkfs
命令格式化这个1GB的文件:
- # mkfs.ext4 loopbackfile.img
这个命令将文件格式化成ext4文件系统。使用下面的命令检查文件系统:
- $ sudo file loopbackfile.img
- loopbackfile.img: Linux rev 1.0 ext4 filesystem data, UUID=c9d56c42-f8e6-4cbd-aeab-369d5056660a (extents) (large files) (huge files)
现在就可以挂载环回文件了:
- $ sudo mkdir /mnt/loopback
- # mount -o loop loopback.img /mnt/loopback
-o loop
用来挂载环回文件系统。
这是一种快捷的挂载方法。我们并没有连接到任何设备上。但是在内部,这个环回文件连接到了一个名为/dev/loop1或loop2的设备上。
我们可以手动来操作:
- # losetup /dev/loop1 loopback.img
- # mount /dev/loop1 /mnt/loopback
第一种方法并不能适用于所有情况。假如我们想创建一个硬盘文件,然后对它分区并挂载其中某个分区,那就不能使用mount -o loop
,而要使用第二种方法。对一个用0填充的文件进行分区:
- # losetup /dev/loop1 loopback.img
- # fdisk /dev/loop1
在lookback.img中创建分区并挂载第一个分区:
- # 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),使用下面的方法:
- # umount mount_point
例如:
- # umount /mnt/sda1
或者,也可以用设备文件的路径作为umount
命令的参数:
- # umount /dev/sda1
因为umount
是一个特权命令,所以必须以超级用户的身份来执行。
3.11.3 补充内容
让我们再来研究其他的mount
选项。
- 将ISO文件作为环回文件挂载
ISO文件是任意种类光学存储介质的归档。我们可以采用环回挂载的方法,像挂载物理光盘一样挂载ISO文件。
挂载点就是一个目录,用来作为通过文件系统访问设备内容的路径。我们甚至可以用一个非空的目录作为挂载路径。那么直到设备被卸载,这个挂载路径中包含的都是来自设备的数据,而非原始目录中的内容。例如:
- # mkdir /mnt/iso
- # mount -o loop linux.iso /mnt/iso
现在就可以用 /mnt/iso中的文件进行操作了。ISO是一个只读文件系统。
- 通过
sync
立即应用更改
当对挂载设备作出更改之后,这些改变并不会被立即写入物理设备。只有当缓冲区被写满之后才会进行设备回写。但是我们可以用sync
命令强制将它即刻写入更改:
# sync
sync
命令必须以超级用户身份来执行。