Shell 使用环回文件,Linux文件系统通常存在于磁盘或记忆棒(memory stick)这种设备上。文件其实也可以作为文件系统挂载。这种存在于文件中的文件系统(filesystem-in-a-file)可用于测试、文件系统定制或者是作为机密信息的加密盘。
实战演练
让我们来看看如何在大小为1GB的文件中创建ext4文件系统。
(1) 使用dd
命令创建一个1GB大小的文件:
$ dd if=/dev/zero of=loobackfile.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。这是因为作为块设备,硬盘是按照块大小的整数倍来分配存储空间的。
(2) 用mkfs
命令将1GB的文件格式化成ext4文件系统:
$ mkfs.ext4 loopbackfile.img
(3) 使用file
命令检查文件系统:
$ file loobackfile.img
loobackfile.img: Linux rev 1.0 ext4 filesystem data,
UUID=c9d56c42-
f8e6-4cbd-aeab-369d5056660a (extents) (large files) (huge files)
(4) 使用mkdir
创建挂载点并挂载环回文件:
# mkdir /mnt/loopback
# mount -o loop loopbackfile.img /mnt/loopback
选项-o loop
用来挂载环回文件系统。这里用的实际上是一种快捷方式,可以将环回文件系统附加到(attach)由操作系统选定的设备上,这些设备的名称类似于/dev/loop1
或/dev/loop2
。
(5) 也可以使用以下命令来指定具体的环回设备:
# losetup /dev/loop1 loopbackfile.img
# mount /dev/loop1 /mnt/loopback
(6) 使用下面的方法进行卸载(umount
):
# umount mount_point
例如:
# umount /mnt/loopback
(7) 也可以用设备文件的路径作为umount
命令的参数:
# umount /dev/loop1
注意,因为
mount
和umount
都是特权命令,所以必须以root用户的身份来执行。
工作原理
我们必须首先使用dd
命令生成一个文件来创建环回文件系统。dd
是一个用于复制原始数据(raw data)的通用命令。它将数据从if
参数所指定的文件复制到of
参数所指定的文件中。我们指定dd
复制一块大小为1GB的块,这样就创建了一个1GB的文件。/dev/zero是一个特殊的文件,从这个文件中读出的内容都是0。
然后,使用mkfts. ext4
命令在该文件中创建ext4文件系统。设备上必须有文件系统存在才能够挂载。常用的文件系统包括ext4、ext3和vfat。
最后,我们使用mount
命令将环回文件挂载到挂载点上(在本例中是/mnt/loopback)。挂载点使得用户可以访问文件系统中的文件。在执行mount
命令之前,应该先使用mkdir
命令创建挂载点。选项-o loop
用于指明要挂载的是环回文件,而非设备。
当mount
知道它使用的是环回文件时,它会自动在/dev中建立一个对应该环回文件的设备并将其挂载。如果想手动操作,可以使用losetup
命令建立设备,然后使用mount
命令挂载。
补充内容
让我们再来研究一下使用环回文件和挂载的其他用法。
- 在环回镜像中创建分区
假设我们需要创建一个环回文件,然后对其分区并挂载其中某个分区。在这种情况下,没法使用mount - o loop
。我们必须手动建立设备并挂载分区。使用下面的方法对文件(内容全部填充为0)进行分区:
# losetup /dev/loop1 loopback.img
# fdisk /dev/loop1
fdisk
是Linux系统中的标准分区工具,在http://www.tldp.org/HOWTO/Partition/fdisk_partitoning.html处可以找到一份有关如何使用fdisk
创建分区的简明教程(记得将教程中的/dev/hdb换成/dev/loop1)。
在loopback.img
中创建分区并挂载第一个分区:
# losetup -o 32256 /dev/loop2 loopback.img
/dev/loop2表示第一个分区,-o
用来指定偏移量,在DOS分区方案3中,这个偏移量是32256
。第一个分区在硬盘上起始于32 256字节处。
我们也可以指定所需的偏移量来挂载第二个分区。完成挂载之后,就可以像在物理设备上一样执行所有日常操作了。
- 快速挂载带有分区的环回磁盘镜像
如果我们希望挂载环回磁盘镜像中的分区,可以通过参数的形式将分区偏移量传递给losetup
命令。不过,有一个更快的方法可以挂载镜像中的所有分区:kpartx
。该命令默认并没有安装在系统中,你得使用软件包管理器来安装:
# kpartx -v -a diskimage.img
add map loop0p1 (252:0): 0 114688 linear /dev/loop0 8192
add map loop0p2 (252:1): 0 15628288 linear /dev/loop0 122880
这条命令在磁盘镜像的分区与/dev/mapper中的设备之间建立了映射,随后便可以挂载这些设备了。下列命令可以用来挂载第一个分区:
# mount /dev/mapper/loop0p1 /mnt/disk1
当你完成设备上的操作后(并使用umount
卸载所有挂载过的分区),使用下列命令移除映射关系:
# kpartx -d diskimage.img
loop deleted : /dev/loop0
- 将ISO文件作为环回文件挂载
ISO文件是光学存储介质的归档。我们可以采用挂载环回文件的方法,像挂载物理光盘一样挂载ISO文件。
我们甚至可以用一个非空目录作为挂载路径。在设备被卸载之前,这个挂载路径中包含的都是来自该设备的数据,而非目录中的原始内容。例如:
# mkdir /mnt/iso
# mount -o loop linux.iso /mnt/iso
现在就可以对/mnt/iso中的文件进行操作了。ISO是一个只读文件系统。
- 使用
sync
立刻应用更改
对挂载设备作出的更改并不会被立即写入物理设备。只有当内部缓冲区被写满之后才会回写设备。我们可以用sync
命令强制立刻写入更改:
$ sync
3
losetup
中的-o 32256 (512*63=32256)
用于设置数据偏移。由于历史原因,硬盘第一个扇区(512 字节)作为 MBR(Master Boot Record,主引导记录),其后的62个扇区作为保留扇区。