SquashFS HOWTO

修订历史
修订 1.92008-07-24修订者
文本更正。
修订 1.82008-01-06修订者
根据 SquashFS 3.3 版本进行更改。添加了一些部分。
修订 1.72005-03-25修订者
根据 SquashFS 2.1 版本进行更改。
修订 1.62004-11-10修订者
根据 SquashFS 2.0 版本进行更改。文本更正。
修订 1.52004-06-07修订者
根据 SquashFS 2.0 alpha 版本进行更改。大量描述改进和澄清。拆分了针对 Linux 内核 2.6.x(新)和 2.4.x 系列的说明。
修订 1.12004-05-22修订者
根据 SquashFS 1.3r3 版本进行更改。
修订 1.02004-02-19修订者
初始版本,由 LDP 审核。
修订 0.22003-12-08修订者
文本更正,添加了许可证。
修订 0.12003-11-24修订者
初始版本。SquashFS 1.3r2 版本的说明。

摘要

本 HOWTO 描述了 SquashFS 的用法 - 一种用于 Linux 的高度压缩的只读文件系统,旨在用于微型和嵌入式系统,以及任何其他您想要使用压缩文件系统的地方。通过本文档,您将学习如何准备支持 SquashFS 的 Linux 内核,创建 squash 文件系统并愉快地使用它。

本 HOWTO 的主页

SquashFS HOWTO 位于 http://artemio.net/projects/linuxdoc/squashfs。在那里您将始终找到该文档的最新版本,并且可以发送您的反馈。


目录
1. 什么是 SquashFS
1.1. 简介
1.2. SquashFS 概述
1.3. 使其清晰
2. 准备使用 SquashFS
2.1. 获取 SquashFS
2.2. 准备支持 SquashFS 的内核
2.3. 编译 SquashFS 工具
2.4. 在 Debian 上安装 SquashFS
3. SquashFS 工具详解
3.1. 使用 mksquashfs
3.2. 命令行选项
3.3. 使用 unsquashfs
4. 创建和使用 squash 文件系统
4.1. 基本步骤
4.2. Squash 文件系统
4.3. 创建微型/嵌入式系统
4.4. 使其可写
5. 致谢
6. 许可证

1. 什么是 SquashFS

1.1. 简介

在创建微型和嵌入式 Linux 系统时,存储设备(软盘、闪存盘等)的每个字节都非常重要,因此尽可能使用压缩。此外,出于存档目的,经常需要压缩文件系统。对于庞大的公共档案以及个人媒体档案,这至关重要。

SquashFS 将所有这些提升到一个新的水平。它是一个只读文件系统,允许您压缩整个文件系统或单个目录,将它们写入其他设备/分区或普通文件,然后直接挂载它们(如果是设备)或使用回环设备(如果是文件)。SquashFS 的模块化、紧凑的系统设计非常出色。对于存档目的,SquashFS 比 tarball 存档提供更大的灵活性和性能速度。

SquashFS 以 Linux 内核源代码补丁(在您的内核中启用 SquashFS 读取支持)的形式分发,mksquashfs 工具(用于创建 squash 文件系统(在文件或块设备中))和 unsquashfs 工具(用于从现有的 squash 文件系统中提取多个文件)。

最新的 SquashFS 发布树是 3.x,之前的版本是 2.x。本文档描述了这两个版本,并给出了适当的注释。例如,如果某些功能或参数在这些发布树中有所不同,则将按如下方式编写:新值 (3.x) 或旧值 (2.x)


1.2. SquashFS 概述

  • 数据、inode 和目录都被压缩

  • SquashFS 存储完整的 uid/gid(32 位)和文件创建时间

  • 支持最大 2^64 字节的文件;文件系统可以最大为 2^64 字节

  • Inode 和目录数据高度压缩,并在字节边界上打包;每个压缩的 inode 平均长度为 8 字节(确切长度因文件类型而异,即常规文件、目录、符号链接以及块/字符设备 inode 具有不同的大小)

  • SquashFS 可以使用高达 64 Kb (2.x) 和 1Mb (3.x) 的块大小。默认大小为 128Kb (3.x),这比正常的 4K 块大小实现了更高的压缩率

  • 在 2.x 版本中,引入了碎片块的概念:能够将多个小于块大小的文件连接成一个块,从而实现更高的压缩率

  • 文件重复项被检测和删除

  • 同时支持大端和小端架构;SquashFS 可以挂载在不同字节序机器上创建的文件系统


1.3. 使其清晰

现在让我们确保您更清楚地理解后续的讨论。使 SquashFS 工作的基本步骤如下:

  1. 修补和重新编译目标 Linux 内核以启用 SquashFS 支持

  2. 编译 mksquashfs unsquashfs 工具

  3. 使用 mksquashfs 创建压缩文件系统

  4. 测试:将 squash 文件系统挂载到临时位置

  5. 修改/etc/fstab或目标 Linux 系统的启动脚本,以便在需要时挂载新的 squash 文件系统


2. 准备使用 SquashFS

2.1. 获取 SquashFS

SquashFS 主站点位于 http://squashfs.sourceforge.net/ - 它包含最新版本的新闻及其更新日志,以及有关 SquashFS 的一般信息。您可以在 SourceForge 的 SquashFS 项目页面上获取最新版本。

Squashfs 也可通过 LZMA 压缩在 http://www.squashfs-lzma.org/ 上获得


2.2. 准备支持 SquashFS 的内核

为了读取 SquashFS,您需要在内核中支持它 - 就像它是reiserfsext3文件系统一样。您必须确保您的内核版本有相应的补丁。它应该位于 SquashFS 源代码树的kernel-patches/linux-2.x.y子目录中。此外,请记住,在大多数情况下,您将需要来自 kernel.org干净(原始)Linux 内核源代码。如果您的内核源代码来自发行版供应商,则它可能已经预先应用了自定义供应商补丁,并且应用 SquashFS 补丁几乎肯定不起作用,因为 SquashFS 补丁是针对原始 Linux 内核制作的。但是,某些发行版从存储库中提供了 SquashFS-kernel-modules 和 SquashFS-tools 软件包。如果您考虑使用来自发行版的这些软件包,则无需修补内核或从源代码构建 SquashFS 工具。在这种情况下,请确保从发行版存储库中获取适用于您的内核的正确模块。请注意,这样做您将获得一个简单的安装步骤,但如果您打算将 SquashFS 用于特定目的(例如,用于嵌入式系统),则无法控制内核配置参数。


2.2.1. 修补内核源代码

有了内核源代码和适当的 SquashFS 补丁,您只需执行以下操作即可(我们假设您的 Linux 内核源代码位于/usr/src/linux并且您的 SquashFS 源代码位于/usr/src/squashfs):

切换到 SquashFS 源代码目录并复制内核补丁(我们假设它名为squashfs-patch)到/usr/src/linux.

	bash# cd /usr/src/squashfs
	bash# cp linux-2.x.y/squashfs-patch /usr/src/linux

转到 linux 内核源代码目录/usr/src/linux:

	bash# cd /usr/src/linux

注意:请记住,在所有后续的内核相关过程中,我们都不会离开此目录,并且所有路径都将相对于/usr/src/linux.

现在使用 SquashFS 补丁修补源代码

	bash# patch -p1 < squashfs-patch

2.2.2. 编译 2.6.x 内核

清理并准备内核源代码

	bash# make distclean
	bash# make mrproper

使用您喜欢的方法(config/menuconfig/xconfig/gconfig)配置内核

	bash# make menuconfig

  1. File systems 部分,Miscellaneous file systems 子部分中,启用 Squashed filesystem 选项,无论是作为模块还是与内核捆绑在一起。如果您计划使用 squash 的初始 RAM 磁盘 (initrd),则仅强制要求在内核内部编译 SquashFS。

  2. 在同一子部分中,“不要” 启用 Additional option for memory-constrained system,除非您正在为嵌入式系统配置内核。

  3. 如果您想使用 squash 的初始 RAM 磁盘,请在 Device drivers 部分,Block devices 子部分中启用 Initial RAM disk support

  4. 如果您希望将来能够通过回环设备挂载 squash 文件系统,则应在 Device drivers 部分,Block devices 子部分中启用 Loopback device support

现在您可以编译内核和模块

	bash# make

2.2.3. 编译 2.4.x 内核

配置内核

	bash# make menuconfig

  1. File systems 部分,启用 Squashed filesystem 选项,无论是作为模块还是与内核捆绑在一起。如果您计划使用 squash 的初始 RAM 磁盘 (initrd),则仅强制要求在内核内部编译 SquashFS。

  2. 如果您想使用 squash 的初始 RAM 磁盘,请在 Block devices 部分启用 Initial RAM disk support

  3. 如果您希望将来能够通过回环设备挂载 squash 文件系统,则应在 Block devices 部分启用 Loopback device support

现在您可以编译内核和模块

	bash# make dep
	bash# make bzImage
	bash# make modules

2.2.4. 安装和测试内核

现在是安装启用 SquashFS 的新内核的时候了。以下说明适用于在主机上安装和启动内核。您可能需要在目标系统上安装和测试它。

我们假设内核是为 x86 架构编译的,并且压缩的内核映像位于内核树的arch/i386/boot/子目录中。现在将内核复制到/boot目录(并将其命名为bzImage-sqsh为了方便起见,如果您喜欢)

	bash# cp arch/i386/boot/bzImage /boot/bzImage-sqsh

如果您有任何内核模块,请不要忘记安装它们

	bash# make modules_install

修改您的引导加载程序配置文件以包含您的新内核并安装(更新)引导加载程序。现在您可以使用新内核重新启动。启动时,检查一切是否正常

	bash# cat /proc/filesystems

或者,如果您将 SquashFS 支持构建为内核模块

	bash# insmod squashfs
	bash# cat /proc/filesystems

如果您看到squashfs行以及其他文件系统,这意味着您已在内核中成功启用 SquashFS。


2.3. 编译 SquashFS 工具

现在您需要编译 mksquashfs - 用于创建 squash 文件系统的工具和 unsquashfs - 用于从现有 squash 文件系统中提取文件的工具。

	bash# cd /usr/src/squashfs/squashfs-tools

编译并安装工具

	bash# make
	bash# cp mksquashfs /usr/sbin
	bash# cp unsquashfs /usr/sbin

如果一切顺利,在 shell 提示符下键入 mksquashfsunsquashfs 应该会打印 “usage” 消息。


2.4. 在 Debian 上安装 SquashFS

如果您使用 Debian(或其他 Linux 发行版),您可能希望从发行版存储库中获取 SquashFS 模块和工具。对于 Debian,您必须使用以下命令安装正确的内核模块和工具

(假设您的架构是 x86)

	bash# apt-get install squashfs-modules-2.6-486  squashfs-tools

现在为 Linux 内核加载 squashfs 模块,如果已正确加载,您应该在相关列表中找到它

	bash# modprobe squashfs
	
	bash# lsmod|grep squash
	squashfs               39620  0

	

然后,如果您需要在启动时加载 squashfs 模块,则必须将其添加到 /etc/modules。

	bash# echo squashfs >> /etc/modules

请注意,在撰写本文时,Debian 软件包 (Etch. 4.0 r2) 与 squashfs 3.1 版本相关。可能不支持 3.2 版本的某些最新选项和功能。有关详细信息,请参见下一节。


3. SquashFS 工具详解

3.1. 使用 mksquashfs

mksquashfs 是用于创建新的 squash 文件系统以及将新数据追加到现有 squash 文件系统的工具。mksquashfs 的通用命令行格式是

	bash# mksquashfs source1 source2 ... destination [options]

  • source1, source2等:要添加到结果文件系统中的文件和目录,以相对和/或绝对路径给出

  • destination:常规文件(文件系统映像文件)或块设备(例如/dev/fd0/dev/hda3),您希望将 squash 文件系统放在那里

关于默认 mksquashfs 行为的说明

  • 当新文件添加到新文件系统或追加到现有文件系统时,mksquashfs 将自动重命名具有重复名称的文件:如果有两个或多个名为text的文件将出现在同一个结果目录中,则第二个文件将重命名为text_1,第三个文件重命名为text_2等等。

  • 重复的文件将被删除,因此只会有一个物理实例(在 SquashFS 2.x 中,您可以使用 -no-duplicates 选项禁用重复项的检测/删除)。

  • 如果 destination 上已存在 SquashFS 文件系统,则默认情况下,新的 source 项将追加到现有的根目录。检查下面的选项表以强制 mksquashfs 覆盖整个目标和/或更改添加新源项的方式。

  • 如果给出了单个源文件或目录,则它将成为新创建文件系统中的根目录。如果给出了两个或多个源文件和/或目录,它们都将成为新文件系统根目录中的子项。

  • 结果文件系统将填充为 4 Kb 的倍数:这是在块设备上使用的文件系统所必需的。如果您非常确定您不需要这样做,请使用 -nopad 选项禁用此操作。

有关所有可能选项的更多详细信息,请参见下一节。


3.2. 命令行选项

下表显示了 mksquashfs 的所有可能选项。

表 1. mksquashfs 工具的命令行选项

选项描述
-2.0 force mksquashfs 版本 2.1 创建版本 2.0 文件系统
-all-root-root-owned使目标文件系统中的所有文件都归 root 用户(UID=0,GID=0)所有
-always-use-fragments将所有大于块大小的文件划分为碎片(在版本 2.x 中)。这将导致更高的压缩率
-b [块大小]使用 [块大小] 文件系统块大小(2.x 的默认值为 32 Kbytes,3.x 的默认值为 128 kbytes)- 可以是 4096、8192、16384、32768、65536 或 131072
-be-le分别强制使用大端或小端文件系统
-check-data启用其他文件系统检查
-e [file1] ( [file2] ... )指定要从要创建的新文件系统中省略的文件和/或目录
-ef [file]指定一个file,其中包含要排除的文件/目录列表
-force-gid [GID]将目标文件系统中的所有组 ID 设置为 [GID](可以指定为名称或数字)
-force-uid [UID]将目标文件系统中的所有用户 ID 设置为 [UID](可以指定为名称或数字)
-info在将文件添加到文件系统时,打印文件、其原始大小和压缩率
-keep-as-directory如果源是单个目录,则强制此目录成为创建的文件系统中的子目录
-noappend如果目标文件/设备已包含 squash 文件系统,则覆盖它,而不是将新数据追加到现有文件系统
-no-duplicates不检测/删除重复的文件名
-noD-noDataCompression不压缩数据
-noF-noFragmentCompression不压缩碎片(在 2.x 中可用)
-no-fragments不生成碎片块(在 2.x 中可用,这将产生几乎与 1.x 相同的文件系统)
-noI-noInodeCompression不压缩 inode 表
-nopad不将结果文件系统填充为 4 KBytes 的倍数
-root-becomes [name]在追加到预先存在的 squash 文件系统时可以使用:它将创建一个新根目录,并且 [name] 目录将包含所有预先存在的文件/目录
-version打印版本、版权和许可消息
-recover [name]使用恢复文件 [name] 恢复文件系统数据 (3.3)
-no-recovery不创建恢复文件 (3.3)。
-no-exports不允许通过 NFS 导出文件系统 (3.x)
-no-sparse不检查稀疏文件 (3.x)
-processors [number]设置用于创建文件系统的 CPU 数量。默认情况下,将使用所有可用的处理器 (3.x)
--read-queue [size]将输入队列设置为 [size] Mb。(默认为 64 Mb)(3.x)
-write-queue [size]将输出队列设置为 [size] Mb (3.x)
-sort [sort_file]根据 [sort_file] 中的优先级对文件进行排序 (3.x)
-wildcards启用扩展的 shell 通配符以排除目录/文件(与 -e 一起使用)
-regex启用使用 POSIX 正则表达式 (3.3)

在大多数情况下,您应该保留所有压缩/块选项为默认值,因为它们允许 mksquashfs 实现最佳的压缩率。


3.3. 使用 unsquashfs

unsquashfs 是用于从 squash 文件系统中提取数据的工具。unsquashfs 的通用命令行格式是

unsquashfs [options] target [files/directories to extract]

  • target 是要提取的 squash 文件系统。

关于 unsquashfs 行为的说明

  • 如果不指定任何 destination path,unsquashfs 会将压缩的文件系统提取到 ./squashfs-root 目录中。

  • 除非指定了 -f 选项,否则该工具不会将 squash 文件系统提取到已存在的目录中。

  • 您可以在命令行中指定要提取的多个文件/目录,并且要提取的项目也可以在文件中给出,使用 -e [file] 选项。

下表显示了 unsquashfs 的所有可能选项。

表 2. unsquashfs 工具的命令行选项

选项描述
-v[ersion]打印版本、许可证和版权消息
-i[nfo]在从文件系统中提取文件时打印文件
-l[ist]列出 squash 文件系统而不提取文件
-li列出文件及其属性,如同它们被 unsquash 一样 (3.3)
-ll列出 squash 文件系统文件及其属性,无需任何提取 (3.3)
-d[estination] path指定 unsquash 项的目标路径
-f[orce]如果文件存在,则覆盖它们
-s[tat]显示文件系统的超级块信息(它可以发现文件系统版本以及用于压缩它的选项)(3.3)
-e[f] [extract file]要提取的目录或文件列表(每个条目一行)(3.3)
-r[egex]将提取名称视为 POSIX 正则表达式 (3.3)

请注意,在 3.x 版本中,您也可以提取 1.x 和 2.x squash 文件系统。


4. 创建和使用 squash 文件系统

4.1. 基本步骤

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

	bash# mksquashfs /some/dir dir.sqsh

mksquashfs 将执行 squash 操作并打印生成的 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. Squash 文件系统

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


4.2.1. 示例 1

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

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

中,使此文件系统在启动时自动挂载。从临时挂载点卸载文件系统,并使用其 fstab 条目挂载。

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

现在只需确保一切正常

	bash# ls /var/arch

4.2.2. 示例 2

假设您有两个硬盘分区,/dev/hda6(它是空的)和/dev/hda7(它比/dev/hda6大,挂载在/var/arch,包含一些数据并且已满)。现在,假设您要 squash/dev/hda7文件系统并将其移动到/dev/hda6,然后将/dev/hda7用于其他目的。我们将假设您在/etc/fstab中具有以下行(reiserfs 只是在/dev/hda7):

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

上使用的示例文件系统)。与前面的示例相同的方式

	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

如果一切顺利,卸载/dev/hda7(如果需要)并使用 dd 复制/var/arch.sqsh/dev/hda6:

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

现在更改/etc/fstab中的行,改为/dev/hda7

	/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 以检索这些文档)。


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

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

  1. 在为您的系统开发内核时,请确保启用 SquashFS 支持,以便它可以挂载 squash 文件系统

  2. 使用 mksquashfs 创建只读初始 ram 磁盘和/或根文件系统和/或其他文件系统

  3. 不要忘记将文件系统类型设置为squashfs/etc/fstab和/或系统的启动脚本中,用于挂载 squash 文件系统

软盘示例。假设您的软盘系统树位于/home/user/floppylinux,并且您想将根文件系统放在一个软盘上,将/usr放在另一个软盘上。您应该做的是

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

注意 1:您可以在此处看到我们如何使用 -e 选项来排除/usr目录用于根文件系统的映像。

注意 2:不要忘记在根磁盘的squashfs或启动脚本中指定/etc/fstab,以便在挂载/usr文件系统时使用。

在您的 3.5" 软盘驱动器中插入根磁盘(我假设您在其上安装了 lilo 或 grub,因此,此软盘上存在文件系统,并且根文件系统将位于此文件系统的/boot目录下)

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

完成后,卸载根软盘,将软盘更改为/usr磁盘,并使用 dd 传输usr文件系统

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

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

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

  1. 在目标系统的 linux 内核中启用 SquashFS

  2. 创建 squash 根文件系统

  3. 修改目标系统的/etc/fstab或启动脚本,以便在需要时挂载 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 squash,以压缩和备份您的文件,而不会失去应用更改或写入新文件的可能性。

创建ro.fssquash 文件系统和rw.fs目录。

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

使用回环设备挂载 squash 的 ro.fs 文件系统

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

挂载 unionfs 文件系统,使/mnt/home/rw.fs/home/user1位置下明显合并。

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

卸载 unionfs 和 squashfs 文件系统,并列出 /home/user1 和 /home/rw.fs 目录的内容

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

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

您可以看到新的file1是在/home/rw.fs

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

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

现在,要在系统启动时挂载您的 squashfs 用户主目录,您可以按照如下步骤进行操作

使 squashfs 和 unionfs 模块在启动时加载。

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

更改可写分支的所有者,使其与 user1 匹配。

chown user1 /home/rw.fs

将以下行添加到 `/etc/fstab` 文件,以便在启动时挂载 squashfs 和 unionfs。

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

5. 致谢

我要向以下人士表达我真诚的感谢和无比的敬意:

Artemiy I. Pavlov

我要感谢 Artemiy 耐心地回复我的邮件,允许我完成本 HOWTO 的工作。 我还要向所有参与自由软件的人表达我的感谢和敬意

Marco Cecchetti


6. 许可

本文档可以根据开放内容许可中规定的条款和条件进行使用和分发。 简而言之,这意味着您可以自由地修改和重新分发本 HOWTO,但主要条件是您需要保留作者署名和文章的版权。 许可的完整文本可在 http://www.opencontent.org/opl.shtml 获取。