4. 创建和使用 Squash 压缩文件系统

4.1. 基本步骤

为了从单个目录(例如,/some/dir)创建一个 Squash 压缩文件系统,并将其输出到一个常规文件(从而生成一个文件系统镜像),您只需要输入一个神奇的短语

	bash# mksquashfs /some/dir dir.sqsh

mksquashfs 将执行压缩,并打印生成的 inode 数量和写入数据的大小,以及平均压缩率。现在您已经有了您的/some/dir目录镜像在dir.sqsh文件中。您现在可以使用 mount 命令,使用回环设备挂载它

	bash# mkdir /mnt/dir
	bash# mount dir.sqsh /mnt/dir -t squashfs -o loop

检查是否符合预期

	bash# ls /mnt/dir

如果您想将文件系统直接输出到设备(例如,您的软盘在/dev/fd0):

	bash# mksquashfs /some/dir /dev/fd0

),那么只需 mount 该设备

	bash# mount /dev/fd0 /mnt/floppy -t squashfs

并检查是否正常

	bash# ls /mnt/floppy

4.2. 压缩文件系统

这里描述的操作适用于大多数可以使用只读压缩文件系统的情况,无论您希望它位于块设备还是文件中。这可以是任何东西,从不常更改的大型 FTP/HTTP 服务存档,到拥有一个 Squash 压缩的/usr分区以及类似的任何东西。

4.2.1. 示例 1

假设您有一个/var/arch目录,其中包含大量文件,并且您想将其转换为 Squash 压缩文件系统,并将其作为文件保存在您的根分区上(它将是一个文件系统镜像,您将通过回环设备挂载它)。执行所需的操作如下。

压缩目录,然后通过回环设备挂载它以进行测试

	bash# mksquashfs /var/arch /var/arch.sqsh
	bash# mkdir /mnt/tmp
	bash# mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop
	bash# ls /mnt/tmp

如果一切如预期,通过将以下行添加到您的/etc/fstab:

	/var/arch.sqsh	/var/arch	squashfs	ro,defaults	0 0

来使此文件系统在启动时自动挂载

	bash# umount /mnt/tmp
	bash# mount /var/arch

从临时挂载点卸载文件系统,并使用其 fstab 条目进行挂载

	bash# ls /var/arch

现在只需确保一切正常

4.2.2. 示例 2假设您有两个硬盘分区,/dev/hda6(是空的)和/dev/hda7假设您有两个硬盘分区,(比/var/arch更大,挂载在(是空的)和,包含一些数据并且已满)。现在,假设您想压缩假设您有两个硬盘分区,文件系统并将其移动到(是空的)和,然后将/etc/fstab用于其他目的。我们将假设您在(是空的)和):

	/dev/hda7	/var/arch	reiserfs	defaults	0 0

中具有以下行(reiserfs 只是在

	bash# mksquashfs /var/arch /var/arch.sqsh
	bash# mkdir /mnt/tmp
	bash# mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop
	bash# ls /mnt/tmp

上使用的示例文件系统)。(是空的)和与之前的示例类似如果一切顺利,卸载(如果需要),并使用 dd 复制假设您有两个硬盘分区,:

	bash# umount /dev/hda7
	bash# dd if=/var/arch.sqsh of=/dev/hda6

/var/arch.sqsh/etc/fstab(是空的)和(如果需要),并使用 dd 复制

	/dev/hda6	/var/arch	squashfs	ro,defaults	0 0

现在更改

	bash# mount /var/arch
	bash# ls /var/arch

中的行

	bash# rm /var/arch.sqsh

挂载新的文件系统并检查是否一切正常

不要忘记删除不需要的文件系统镜像

4.3. 创建微型/嵌入式系统

通过“微型/嵌入式”,我的意思是为从软盘、IDE/USB 闪存盘、iso9660 CD-ROM、小型硬盘等启动而构建的 Linux 系统。无论您是希望将整个根文件系统放在单个介质上(单个分区、单个软盘),还是拥有模块化系统(多个软盘或磁盘分区),过程几乎相同。创建此类 Linux 系统本身不在本 HOWTO 的范围之内 - 有专门的 HOWTO 和指南(例如Bootdisk HOWTOLinux From Scratch - 访问 www.tldp.org 以检索这些文档)。

  1. 4.3.1. 软盘/闪存/硬盘上的 Squash 压缩文件系统

  2. 为了使用 SquashFS 在小型磁盘上创建 Linux 系统,您只需按照创建最小系统的常用步骤进行操作,并在相应的点执行以下操作

  3. 在为您的系统开发内核时,请确保您启用 SquashFS 支持,以便它可以挂载 Squash 压缩文件系统使用 mksquashfs 创建只读的初始 ram 磁盘和/或根文件系统和/或其他文件系统不要忘记将文件系统类型设置为/etc/fstabsquashfs

和/或系统的启动脚本中,用于挂载 Squash 压缩文件系统软盘示例。假设您的软盘系统树在/usr/home/user/floppylinux

	bash# cd /home/user
	bash# mksquashfs floppylinux root.sqsh -e usr
	bash# mksquashfs floppylinux/usr usr.sqsh

,并且您想将根文件系统放在一个软盘上,将/usr放在另一个软盘上。您应该做的是

注意 1:您可以在这里看到我们如何使用 -e 选项来排除使用 mksquashfs 创建只读的初始 ram 磁盘和/或根文件系统和/或其他文件系统目录以用于根文件系统的镜像。/etc/fstab注意 2:不要忘记在您的根磁盘的/usr或启动脚本中指定

,在挂载文件系统时。将根磁盘插入您的 3.5 英寸软盘驱动器(我假设您在其上安装了 lilo 或 grub,因此,此软盘上存在文件系统,并且根文件系统将位于此文件系统的

	bash# mount /mnt/floppy
	bash# cp root.sqsh /mnt/floppy/boot

/boot/usr目录下)完成后,卸载根软盘,将软盘更换为磁盘,并使用 dd 传输

	bash# dd if=usr.sqsh of=/dev/fd0

usr

文件系统

  1. 4.3.2. CD-ROM 上的 Squash 压缩文件系统

  2. 使用 SquashFS,您可以压缩将在 live CD 中使用的大型文件系统(仅举例)。为此,SquashFS 也与 UnionFS 一起使用。

  3. 在目标系统的 Linux 内核中启用 SquashFS/etc/fstab创建一个 Squash 压缩的根文件系统

修改目标系统的或启动脚本,以便在您需要时挂载 Squash 压缩文件系统, 如果您从正在运行的 Linux 系统创建一个根文件系统,请为 mksquashfs 使用 -e 选项来排除所有伪文件系统,例如/proc/sys(在 2.5.x 之后的 linux 内核上)和

/dev

(当使用 DevFS 时)。此外,不要忘记添加使用 mksquashfs 创建的文件系统镜像本身(我想您知道这些排除的原因)。

4.4. 使其可写

如前所述,SquashFS 的另一个有趣的用途是与 Unionfs 文件系统一起使用,后者为只读文件系统提供写入时复制语义,从而增强了可能性。(对于 unionfs,您可以查看 http://www.filesystems.org/project-unionfs.html举个例子,您可能想将您的 /home/user 压缩,以压缩和备份您的文件,而不会失去应用更改或写入新文件的可能性。创建ro.fsSquash 压缩文件系统和

bash# mksquashfs /home/user1 ro.fs
bash# mkdir /home/rw.fs

rw.fs

bash# mount -t squashfs ro.fs /mnt -o loop

目录。使用回环设备挂载 Squash 压缩的 ro.fs 文件系统挂载 unionfs 文件系统,使/mnt/home/rw.fs表面上合并在

bash# cd /home
bash# mount -t unionfs -o dirs=rw.fs=rw:/mnt=ro unionfs user1

/home/user1

bash# cd /home/user1
bash# touch file1
bash# ls

位置下。

bash# cd ..
bash# umount /home/user1
bash# umount /mnt

bash# ls /home/user1
bash# ls /home/rw.fs 

如您所见,现在您可以在 /home/user1 中创建新文件。卸载 unionfs 和 squashfs 文件系统,并列出 /home/user1 和 /home/rw.fs 目录的内容您可以看到新的/mnt

file1

bash# mksquashfs /home/rw.fs /home/ro.fs

是在

中创建的。

bash# echo squashfs >> /etc/modules
bash# echo unionfs >> /etc/modules

当您想将新创建的文件添加到稳定压缩的 Squash 压缩文件系统时,您必须将它们添加到现有的文件系统中。

chown user1 /home/rw.fs

现在,要在系统启动时挂载您的 Squash 压缩用户主目录,您可以按如下操作

...
/home/ro.fs  /mnt squashfs loop 0 0
unionfs /home/user1 unionfs dirs=/home/rw.fs=rw:/mnt=ro 0 0