Shell 使用环回文件

Shell 使用环回文件,Linux文件系统通常存在于磁盘或记忆棒(memory stick)这种设备上。文件其实也可以作为文件系统挂载。这种存在于文件中的文件系统(filesystem-in-a-file)可用于测试、文件系统定制或者是作为机密信息的加密盘。

Shell使用环回文件

实战演练

让我们来看看如何在大小为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

注意,因为mountumount都是特权命令,所以必须以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命令挂载。

补充内容

让我们再来研究一下使用环回文件和挂载的其他用法。

  1. 在环回镜像中创建分区

假设我们需要创建一个环回文件,然后对其分区并挂载其中某个分区。在这种情况下,没法使用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字节处。

我们也可以指定所需的偏移量来挂载第二个分区。完成挂载之后,就可以像在物理设备上一样执行所有日常操作了。

  1. 快速挂载带有分区的环回磁盘镜像

如果我们希望挂载环回磁盘镜像中的分区,可以通过参数的形式将分区偏移量传递给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
  1. 将ISO文件作为环回文件挂载

ISO文件是光学存储介质的归档。我们可以采用挂载环回文件的方法,像挂载物理光盘一样挂载ISO文件。
我们甚至可以用一个非空目录作为挂载路径。在设备被卸载之前,这个挂载路径中包含的都是来自该设备的数据,而非目录中的原始内容。例如:

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

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

  1. 使用sync立刻应用更改

对挂载设备作出的更改并不会被立即写入物理设备。只有当内部缓冲区被写满之后才会回写设备。我们可以用sync命令强制立刻写入更改:

$ sync

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程