嗨,我很高兴地宣布 Squashfs 工具 4.5 的发布。该版本标志着 Squashfs 开发开始 20 周年,并且有大量的新功能:查找样式操作、tar 文件读取、cpio 样式输入、Sqfscat 等。发布可以从 Sourceforge 或 GitHub 下载。 https://sourceforge.net/projects/squashfs/files/latest/download https://github.com/plougher/squashfs-tools/archive/refs/tags/4.5.tar.gz带有更改摘要的自述文件如下.Phillip 更改摘要(以及以下部分)-------------------------------------------------1。 Mksquashfs 的重大改进======================================1.1 Mksquashfs 现在支持“操作”。这些以“查找”为模型,允许在每个文件的基础上更改压缩、碎片打包、文件排除和文件属性(请参阅第 4 节)。1.2 新的 sqfstar 命令将从 tar 存档创建 Squashfs 映像(请参阅第 5 节).1.3 Mksquashfs 中源路径名的 Tar 样式处理。如果指定了选项,Mksquashfs 将不会剥离前导目录(参见第 6 节)。1.4 Mksquashfs 中源路径名的 Cpio 样式处理。如果指定了这个选项,文件将从标准输入读入。不会剥离任何前导目录(参见第 7 节)。1.5 用于限制 Mksquashfs 使用的 CPU 和 I/O 数量的新选项(参见第 8 节)。1.6 支持时间戳的新伪文件定义(参见第 9 节)。1.7 新伪创建文件引用(硬链接)(见第 10 节)的文件定义。1.8 创建套接字/FIFO 的新伪文件定义(见第 11 节)。1.9 Mksquashfs 现在不允许指定源目录(指定为 - ),所有来自伪文件定义的输入(参见第 12 节)。1.10 新的伪文件“R”定义,它允许使用存储在伪文件中的数据创建常规文件(参见下面的 2.5)。2。 Unsquashfs 的重大改进======================================2.1 新的 Sqfscat 命令将文件的内容输出到标准输出(参见第 13 节)。2.2 如果指定了 -follow-symlinks 或 -missing-symlinks 选项(参见第 14 节),则解压缩文件中现在遵循符号链接。2.3 除了“提取”之外,Unsquashfs 现在还支持“排除”文件文件(见第 15 节)。2.4 添加了最大深度遍历选项(见第 16 节)。2.5 Unsquashfs 现在可以输出代表输入 Squashfs 文件系统的“伪文件”。这可以改变并作为 Mksquashfs 的输入提供,以重新生成文件系统而无需解包(参见第 17 节)。3。小改进和错误修复===================================3.1 进度条现在显示和更新,同时正在扫描输入(要压缩的块将增加)。这意味着在大型(或读取缓慢)输入源上,Mksquashfs 不会挂起无所事事。3.2 Mksquashfs 中的新 -one-file-system 选项,它告诉 Mksquashfs 在扫描源时不要跨越文件系统边界。3.3 新 - Mksquashfs 中的 no-hardlinks 选项,这使得 Mksquashfs 将硬链接文件视为重复文件。3.4 Mksquashfs 和 Unsquashfs 中的新 -help 选项输出到标准输出,而不是标准错误。3.5 Mksquashfs 中的新 -root-uid 选项,允许要设置的根目录的 uid。3.6 Mksquashfs 中新的 -root-gid 选项,允许设置根目录的 gid。3.7 Mksquashfs 中新的 -root-time 选项,允许根目录的时间3.8 将 -no-exit-code 选项添加到 Unsquashfs 使其不输出错误退出代码。3.9 Unsquashfs 中的退出代码已更改以区分非致命错误(退出 2)和致命错误(退出代码为1).3.10 Mksquashfs 追加时,现在写入recove ry 文件到主目录 ($HOME),而不是当前目录。添加了一个新选项 -recovery-path <name>,它指定将 <name> 用作恢复文件目录。3.11 在 Unsquashfs“-stat”输出中添加 Xattr id 计数。3.12 Unsquashfs“写入外部目录”漏洞利用fixed.3.13 Unsquashfs writer线程中的错误处理fixed.3.14修复了在Mksquashfs.3.15中止追加时无法截断目标文件的问题。3.15防止Mksquashfs读取目标文件作为input.4。 Mksquashfs 操作介绍==================================新的 Mksquashfs 操作代码允许执行“操作”如果一个或多个“测试”成功,则生成一个文件。如果您熟悉“find”命令,那么操作类似于“-print”,而测试类似于说“-name”或“-type”。为了说明这一点,举两个具体的例子很有用.example 1:片段动作% mksquashfs /home/phillip/github github.sqsh -action"fragment(cfiles) @ name(*.[ch])" -action "fragment(ofiles) @name(*.o)"这个例子定义了两个“片段动作”,它们控制片段内文件的打包。具体来说,它创建了一个名为“cfiles”的特殊片段,它打包了与通配符名称“*.[ch]”匹配的文件。它还创建了另一个称为“ofiles”的特殊片段,它打包了与通配符名称“*.o”匹配的文件。生产特殊片段只打包匹配一系列测试的文件,可以产生更好的压缩和/或 I/O 性能,因为它可以优化相似性或访问模式。但它也会产生更差的压缩,所以你应该经常测试效果。此外,你应该能够看到一个动作定义被拆分为“@”之前的一个动作函数,以及@之后的一个或多个测试函数。此处需要引用以防止 shell 对其进行解释。此外,“@”前后的间距不是必需的,此处使用以增加可读性。示例 2:未压缩的 action% mksquashfs /home/phillip backup.sqsh -action "uncompressed @ (name(*.jpg) || name(*.mpg) ) || ( name(*.img) && filesize(+1G) )"这是一个更复杂的例子。它告诉 Mksquashfs 不要尝试压缩与通配符名称“*.jpg”和“*.mpg”匹配的任何文件。但它也告诉 Mksquashfs 不要尝试压缩与通配符名称“*.img”匹配并且也是 1 的文件千兆字节或更大。此示例介绍了可以使用逻辑运算符 && (and), || 组合测试的事实(或)和! (不是),并且可以加括号。有关语法和额外信息,请参阅 ACTIONS-README 文件。 5。用于从 tar 存档创建映像的新 Sqfstar 命令================================================================================================================================================================================================================================================================================================================================================================================================================================================================== ================当 Mksquashfs 以“sqfstar”(命名为“sqfstar”,或者通过硬链接或符号链接)运行时,将从标准输入(stdin)读取 tar 存档,并创建来自它的 Squashfs 图像。语法:sqfstar [options] image [list of exclude dirs/files]其中 <image> 是输出 Squashfs 文件系统。tar 存档应该是未压缩的(通过压缩的解压缩器进行管道传输)。Sqfstar 支持 V7, ustar、bsdtar (libarchive)、GNU tar 和 PAX 扩展。支持稀疏文件扩展,包括“旧的 GNU 格式,类型 S”和 PAX 格式,版本 0.0、0.1 和当前的 1.0.Sqfstar 支持扩展属性,并识别SCHILY xattrPAX 扩展(由 GNU tar 使用)和 LIBARCHIVE xattr PAX 扩展(由 bsdtar 使用)。可以排除文件和目录,并且支持锚定和非锚定排除文件(请参阅 USAGE 文件中的第 3.5.2 节和稍后举例)。默认支持通配符(通配符)。如果 Sqfstar 链接不可用,Sqfstar 也可以通过运行“mksquashfs source dest -tar”调用。5.1 使用示例--------------- ---% sqfstar image.sqfs < archive.tar 使用默认值(gzip 压缩,128K 块)从archive.tar 创建一个Squashfs 映像。% sqfstar -comp xz -b 1M image.sqfs < archive.tar 和以前一样,但是使用 XZ 压缩和 1Mbyte 块大小。% zcat archive.tgz | sqfstar image.sqfs 从 gzip 压缩的 tar 存档创建一个 Squashfs 镜像。% sqfstar -root-uid 0 -root-gid 0 image.sqfs < archive.tar Tar 文件不提供根目录的定义,默认为使运行 Sqfstar 的用户拥有/组拥有目录。上面的命令将所有权/组所有权设置为 root.% sqfstar -root-mode 0755 image.sqfs < archive.tar 根目录的默认权限为 0777 (rwxrwxrwx)。上述命令将权限设置为 0755 (rwxr-xr-x).% sqfstar image.sqsh dir1/file1 dir2/file2 < archive.tar 创建一个 Squashfs 镜像但排除文件“file1”和“file2”.% sqfstar image .sqsh "... *.[ch]" < archive.tar 创建一个 Squashfs 图像,但排除存档中任何位置匹配 "*.[ch]" 的任何文件。5.2 Sqfstar 选项列表--------- ---------------以下是 Sqfstar.Filesystem 构建选项支持的完整选项列表:-comp <comp> select <comp> compressionCompressors available:gzip (default)-b < block_size> 将数据块设置为 <block_size>。默认 128 Kbytes 可选的后缀 K 或 M 可以分别指定 Kbytes 或 Mbytes-可重现的可重现构建映像(默认)-不可重现的不可重现构建映像-mkfs-time <time> 将 mkfs 时间设置为 <time > 这是一个无符号的 int-fstime <time> 同义词 mkfs-time-all-time <time> 将所有 inode 时间设置为 <time> 这是一个无符号的 int-exports 使文件系统可通过 NFS-no-sparse don' 导出t 检测稀疏文件-no-xattrs 不存储扩展属性-xattrs 存储扩展属性(默认)-noI 不压缩 inode 表-noId 不压缩 uid/gid 表(由 -noI 暗示)-noD 不压缩数据块-noF 不压缩片段块-noX 不压缩扩展属性-no-fragments 不使用片段-no-tailends 不要将尾端打包成片段-no-duplicates 不执行重复检查-no-hardlinks 做不是硬链接文件,而是存储duplicates-all-root 使所有文件归root-root-time <time> s et root directory time to <time>-root-mode <mode> 设置根目录权限为八进制 <mode>-root-uid <uid> 设置根目录所有者为 <uid>-root-gid <gid> 设置根目录组to <gid>-force-uid <uid> 将所有文件 uid 设置为 <uid>-force-gid <gid> 将所有文件 gid 设置为 <gid>-nopad 不要将文件系统填充为 4KFilesystem 过滤器选项的倍数:-ef <exclude_file> 排除目录/文件列表。每行一个-regex 允许在excludeirs/filesSqfstar 运行时选项中使用POSIX 正则表达式:-version 打印版本、许可证和版权消息-强制Sqfstar 写入块设备或file-exit-on-error 将通常忽略的错误视为Fatal-quiet no verbose output-info 打印写入文件系统的文件-no-progress 不显示进度条-progress 在使用 -info 选项时显示进度条-throttle <percentage> 通过给定的 I/O 输入速率节流百分比。这可用于减少 Mksquashfs 的 I/O 和 CPU 消耗 -limit <percentage> 将 I/O 输入速率限制为给定的百分比。这可用于减少 Mksquashfs 的 I/O 和 CPU 消耗(替代-throttle)-processors <number> 使用 <number> 个处理器。默认将使用 number ofprocessors available-mem <size> 使用 <size> 物理内存。当前设置为 4096M 可选的后缀 K、M 或 G 可以分别指定 Kbytes、Mbytes 或 Gbytes 其他选项:-root-owned 替代名称 -all-root-offset <offset> 在 < 开头跳过 <offset> 字节dest>。可选地,可以给出 K、M 或 G 的后缀以分别指定 Kbytes、Mbytes 或 Gbytes。默认为 0 字节。-o <offset> 同义词 -offset-noInodeCompression 的同义词 -noI-noIdTableCompression 的替代名称 -noId -noDataCompression 的替代名称 -noD-noFragmentCompression 的替代名称 -noF-noXattrCompression 的替代名称 -noX-help 将此选项文本输出到 stdout-h 将此选项文本输出到 stdout-Xhelp 打印所选压缩器的压缩器选项6。 Mksquashfs 中源路径名的 Tar 样式处理 ============================================================================================================================================================================================================================================================================================================================================================================================================== ==============Mksquashfs 总是去除命令行上给出的任何源路径名的前导目录。例如给定命令行% mksquashfs dir-a/dir-b/dir-c /file1 dir-A/dir-B/file2 sqfsMksquashfs 将剥离前导目录,并将 file1 和 file2 放入同一根目录。如果 file1 和 file2 是目录,它将把目录放在同一个根目录中,但是,如果只指定一个目录,它将把该目录的内容放在根目录中。显然,很多时候这就是你想要的。但是,如果这不是您想要的,那么让 Mksquashfs 做一些不同的事情可能会变得非常困难。很多人不喜欢这样,并且更喜欢 Mksquashfs 的行为类似于“tar”,它不会剥离主要目录。这允许您从提供的文件的路径名创建目录层次结构。在上面的示例中,tar 存档将包含路径名“dir-a/dir-b/dir-c/file1”和“dir-A/dir-B/file2”。如果给出选项,Mksquashfs 现在将像 tar 一样-no-strip 或 -tarstyle.7。 Mksquashfs 中源路径名的 cpio 风格处理============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== ==============Mksquashfs 现在允许您将要添加到文件系统的文件集通过管道传输到 (stdin) 中的标准(如果提供了 -cpiostyle 选项)。与 cpio 一样,目录是不递归扫描,并添加了它们的内容。必须明确指定要添加到文件系统的所有文件。通常,要添加的文件列表将通过 find 或类似实用程序生成。例如 % find /home/phillip/squashfs-tools | mksquashfs - img.sqfs -cpiostyle 将创建一个包含 squashfs-tools 及其子目录中所有内容的图像。请注意,“-”在 Mksquashfs 中作为源路径名给出,表示没有命令行源。以下将仅添加以 .c、.h 和 .o.% 结尾的文件 find /home/phillip/squashfs-tools -name "*.[cho]" | mksquashfs -img.sqfs -cpiostyle8。用于限制 CPU 和 I/O Mksquashfs 使用的新选项======================================== ==============人们有时会抱怨 Mksquashfs 使用过多的 CPU 和过多的 I/O,并且会使计算机变得非常缓慢或过热,并将处理器选项设置为 1通常没有太大的影响。这样做的原因是因为 Mksquashfs 试图尽可能快地运行,因为这通常是人们想要的。因此,它是高度并行化的,并产生多个压缩线程(对于块和片段),默认情况下,每个内核产生一个这些压缩线程。此外,它还具有单独的读取器和写入器线程以及大缓存以确保我/O 吞吐量最大化并与压缩线程并行执行(称为预读和后写)。这意味着即使设置了“-processors 1”选项,仍然有很多并行处理正在执行,因为最小线程集是单块压缩线程、单片段压缩线程以及读取器和写入器线程。不幸的是,这些线程仍然可以轻松地最大化单个核心,因此它永远不会空闲。在多核机器上,“-processors 1”选项通常会产生大约 130-180% 的 CPU 负载。采用的解决方案是添加一个 I/O“节流阀”,它将调节执行的 I/O 数量,最终,消耗多少CPU。 Thisthrottle 可以设置为 0 - 100,并添加以下两个选项。-throttle <percentage> 具有将阅读器节流 X% 的语义。百分比越高,读取器线程的吞吐量降低的越大。-limit <percentage> 具有相反的含义,将输出限制为 X%。百分比越高,读取器线程的吞吐量越大。9。带有时间戳的新伪文件定义============================================ ==之前支持的伪文件定义不允许设置文件时间。添加了新的扩展伪文件定义,它采用 <time> 时间戳。通过使用大写类型字符将这些与之前的定义区分开来。例如,“D”定义与之前的“d”定义相同(它创建一个目录),但它需要一个<time>时间戳。扩展定义的列表是:filename D time mode uid gidfilename M time mode uid gidfilename B time mode uid gid major minorfilename C time mode uid gid major minorfilename F time mode uid gid commandfilename S time mode uid gid symlink<time> 可以是无符号十进制整数(表示自 1970-01-01 01 纪元以来的秒数: 00 UTC),或一个“日期字符串”,从纪元开始解析并转换为整数,通过调用“日期”。因为大多数日期字符串都有空格,它们需要被引用,如果在命令行中输入,这些引号需要通过反斜杠保护,例如 % mksquashfs x x.sqsh -p "file D \"1 jan 1980\" 0777 phillip phillip"显然可以使用任何“date”接受的有效字符串,例如“昨天”,“上周”等 10。新的伪文件定义来创建文件引用(硬链接)======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== ==============================现有的“f”伪定义允许从命令的输出创建一个常规文件(或shell)。通常用于引用源目录外的文件,通过执行“cat”,例如README f 0555 0 0 cat /home/phillip/latest-version/README因为这是一个相当频繁使用的定义,新的更快的“文件引用”或硬链接(在文件系统术语中,文件引用是硬链接)已添加名为“l”的伪定义。README l /home/phillip/latest-version/READMEWill create a reference to "/home /phillip/latest-version/README”,显然将使用时间戳/模式和所有权。该定义还用于创建对源目录中文件的其他引用。例如,如果“phillip/latest/README”是一个被添加到文件系统的文件,那么README l phillip/latest/README将创建一个硬链接(并增加inode上的nlink计数)。在这两种情况下,文件的路径被引用的是系统文件系统路径,可以是绝对路径(以 / 为前缀),也可以是相对于当前工作目录。还有一个额外的“L”伪定义,它堵住了上述“l”定义的漏洞。 'l' 伪定义不能创建由伪定义创建的文件的引用或硬链接,因为根据定义它们不存在于系统文件系统中。使用 'L' 引用的文件应该是一个伪文件,在这种情况下,路径是取自正在创建的 Squashfs 文件系统的根目录,egchar-dev c 0555 0 0 1 2link L char-dev 将创建一个名为“link”的硬链接到前面伪定义创建的名为“char-dev”的字符设备.11.用于创建套接字/Fifos 的新伪文件定义========================================== ============== 添加了两个允许创建套接字和 Fifosto 的新定义,它们是:filename i mode uid gid [s|f]filename I time mode uid gid [s| f]'i' 定义不带时间值,而 'I' 定义带时间值。要创建 Unix 域套接字,应使用 's',iefilename i 0777 root root sand to create ..... .