修订历史 | ||
---|---|---|
修订 1.9 | 2008-07-24 | 修订者 |
文本更正。 | ||
修订 1.8 | 2008-01-06 | 修订者 |
根据 SquashFS 3.3 版本进行更改。添加了一些部分。 | ||
修订 1.7 | 2005-03-25 | 修订者 |
根据 SquashFS 2.1 版本进行更改。 | ||
修订 1.6 | 2004-11-10 | 修订者 |
根据 SquashFS 2.0 版本进行更改。文本更正。 | ||
修订 1.5 | 2004-06-07 | 修订者 |
根据 SquashFS 2.0 alpha 版本进行更改。大量描述改进和澄清。拆分了针对 Linux 内核 2.6.x(新)和 2.4.x 系列的说明。 | ||
修订 1.1 | 2004-05-22 | 修订者 |
根据 SquashFS 1.3r3 版本进行更改。 | ||
修订 1.0 | 2004-02-19 | 修订者 |
初始版本,由 LDP 审核。 | ||
修订 0.2 | 2003-12-08 | 修订者 |
文本更正,添加了许可证。 | ||
修订 0.1 | 2003-11-24 | 修订者 |
初始版本。SquashFS 1.3r2 版本的说明。 |
本 HOWTO 的主页
SquashFS HOWTO 位于 http://artemio.net/projects/linuxdoc/squashfs。在那里您将始终找到该文档的最新版本,并且可以发送您的反馈。
在创建微型和嵌入式 Linux 系统时,存储设备(软盘、闪存盘等)的每个字节都非常重要,因此尽可能使用压缩。此外,出于存档目的,经常需要压缩文件系统。对于庞大的公共档案以及个人媒体档案,这至关重要。
SquashFS 将所有这些提升到一个新的水平。它是一个只读文件系统,允许您压缩整个文件系统或单个目录,将它们写入其他设备/分区或普通文件,然后直接挂载它们(如果是设备)或使用回环设备(如果是文件)。SquashFS 的模块化、紧凑的系统设计非常出色。对于存档目的,SquashFS 比 tarball 存档提供更大的灵活性和性能速度。
SquashFS 以 Linux 内核源代码补丁(在您的内核中启用 SquashFS 读取支持)的形式分发,mksquashfs 工具(用于创建 squash 文件系统(在文件或块设备中))和 unsquashfs 工具(用于从现有的 squash 文件系统中提取多个文件)。
最新的 SquashFS 发布树是 3.x,之前的版本是 2.x。本文档描述了这两个版本,并给出了适当的注释。例如,如果某些功能或参数在这些发布树中有所不同,则将按如下方式编写:新值 (3.x) 或旧值 (2.x)
数据、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 可以挂载在不同字节序机器上创建的文件系统
SquashFS 主站点位于 http://squashfs.sourceforge.net/ - 它包含最新版本的新闻及其更新日志,以及有关 SquashFS 的一般信息。您可以在 SourceForge 的 SquashFS 项目页面上获取最新版本。
Squashfs 也可通过 LZMA 压缩在 http://www.squashfs-lzma.org/ 上获得
为了读取 SquashFS,您需要在内核中支持它 - 就像它是reiserfs或ext3文件系统一样。您必须确保您的内核版本有相应的补丁。它应该位于 SquashFS 源代码树的kernel-patches/linux-2.x.y子目录中。此外,请记住,在大多数情况下,您将需要来自 kernel.org 的干净(原始)Linux 内核源代码。如果您的内核源代码来自发行版供应商,则它可能已经预先应用了自定义供应商补丁,并且应用 SquashFS 补丁几乎肯定不起作用,因为 SquashFS 补丁是针对原始 Linux 内核制作的。但是,某些发行版从存储库中提供了 SquashFS-kernel-modules 和 SquashFS-tools 软件包。如果您考虑使用来自发行版的这些软件包,则无需修补内核或从源代码构建 SquashFS 工具。在这种情况下,请确保从发行版存储库中获取适用于您的内核的正确模块。请注意,这样做您将获得一个简单的安装步骤,但如果您打算将 SquashFS 用于特定目的(例如,用于嵌入式系统),则无法控制内核配置参数。
有了内核源代码和适当的 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 |
清理并准备内核源代码
bash# make distclean bash# make mrproper |
使用您喜欢的方法(config/menuconfig/xconfig/gconfig)配置内核
bash# make menuconfig |
在 “File systems” 部分,“Miscellaneous file systems” 子部分中,启用 “Squashed filesystem” 选项,无论是作为模块还是与内核捆绑在一起。如果您计划使用 squash 的初始 RAM 磁盘 (initrd),则仅强制要求在内核内部编译 SquashFS。
在同一子部分中,“不要” 启用 “Additional option for memory-constrained system”,除非您正在为嵌入式系统配置内核。
如果您想使用 squash 的初始 RAM 磁盘,请在 “Device drivers” 部分,“Block devices” 子部分中启用 “Initial RAM disk support”。
如果您希望将来能够通过回环设备挂载 squash 文件系统,则应在 “Device drivers” 部分,“Block devices” 子部分中启用 “Loopback device support”。
现在您可以编译内核和模块
bash# make |
配置内核
bash# make menuconfig |
在 “File systems” 部分,启用 “Squashed filesystem” 选项,无论是作为模块还是与内核捆绑在一起。如果您计划使用 squash 的初始 RAM 磁盘 (initrd),则仅强制要求在内核内部编译 SquashFS。
如果您想使用 squash 的初始 RAM 磁盘,请在 “Block devices” 部分启用 “Initial RAM disk support”。
如果您希望将来能够通过回环设备挂载 squash 文件系统,则应在 “Block devices ” 部分启用 “ Loopback device support ”。
现在您可以编译内核和模块
bash# make dep bash# make bzImage bash# make modules |
现在是安装启用 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。
现在您需要编译 mksquashfs - 用于创建 squash 文件系统的工具和 unsquashfs - 用于从现有 squash 文件系统中提取文件的工具。
bash# cd /usr/src/squashfs/squashfs-tools |
编译并安装工具
bash# make bash# cp mksquashfs /usr/sbin bash# cp unsquashfs /usr/sbin |
如果一切顺利,在 shell 提示符下键入 mksquashfs 或 unsquashfs 应该会打印 “usage” 消息。
如果您使用 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 版本的某些最新选项和功能。有关详细信息,请参见下一节。
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 选项禁用此操作。
有关所有可能选项的更多详细信息,请参见下一节。
下表显示了 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 实现最佳的压缩率。
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 文件系统。
为了从单个目录(例如,/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 |
此处描述的操作对应于可以使用只读压缩文件系统的大多数情况,无论您希望它位于块设备上还是文件中。这可以是任何东西,从不经常更改的大型 FTP/HTTP 服务存档,到拥有 squash 的/usr分区以及任何类似的用途。
假设您有一个/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 |
假设您有两个硬盘分区,/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 |
通过说“微型/嵌入式”,我的意思是为从软盘、IDE/USB 闪存盘、iso9660 CD-ROM、小型硬盘驱动器等启动而构建的 Linux 系统。无论您是希望将整个根文件系统放在单个介质(单个分区、单个软盘)上,还是拥有模块化系统(多个软盘或磁盘分区),该过程几乎相同。创建此类 Linux 系统本身超出了本 HOWTO 的范围 - 有专门的 HOWTO 和指南用于此(例如 Bootdisk HOWTO 和 Linux From Scratch - 访问 www.tldp.org 以检索这些文档)。
为了使用 SquashFS 在小型磁盘上创建 Linux 系统,您只需按照创建最小系统的常用步骤操作,并在相应的点执行以下操作
在为您的系统开发内核时,请确保启用 SquashFS 支持,以便它可以挂载 squash 文件系统
使用 mksquashfs 创建只读初始 ram 磁盘和/或根文件系统和/或其他文件系统
不要忘记将文件系统类型设置为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 |
使用 SquashFS,您可以压缩将在 Live CD 中使用的大型文件系统(仅举例说明)。为此,SquashFS 也与 UnionFS 一起使用。
在目标系统的 linux 内核中启用 SquashFS
创建 squash 根文件系统
修改目标系统的/etc/fstab或启动脚本,以便在需要时挂载 squash 文件系统
如果您从正在运行的 Linux 系统创建根文件系统,请对 mksquashfs 使用 -e 选项,以排除所有伪文件系统,例如/proc, /sys(在 2.5.x 之后的 linux 内核上)和/dev(使用 DevFS 时)。此外,不要忘记添加正在使用 mksquashfs 创建的文件系统映像本身(我想您知道这些排除的原因)。
如前所述,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 |
我要向以下人士表达我真诚的感谢和无比的敬意:
Phillip Lougher - 感谢他在 squashfs 上的杰出工作,感谢他为 linux-2.4.18 创建了独有的补丁,感谢他帮助完善本 HOWTO 以及回复我的邮件
Tabatha Marshall (TLDP) - 感谢她帮助我将本 HOWTO 完成最终的 1.0 版本
The Linux Documentation Project 的所有人 - 感谢他们在所有 HOWTO 和指南方面所做的伟大工作,这些文档极大地帮助我探索和破解 Linux
TLDP 邮件列表中的所有帮助我入门的人
向所有开发开源软件的人致以无尽的感谢和敬意
Artemiy I. Pavlov
我要感谢 Artemiy 耐心地回复我的邮件,允许我完成本 HOWTO 的工作。 我还要向所有参与自由软件的人表达我的感谢和敬意
Marco Cecchetti
本文档可以根据开放内容许可中规定的条款和条件进行使用和分发。 简而言之,这意味着您可以自由地修改和重新分发本 HOWTO,但主要条件是您需要保留作者署名和文章的版权。 许可的完整文本可在 http://www.opencontent.org/opl.shtml 获取。