SquashFS 压缩方法是什么?

SquashFS 压缩方法是什么?

我有一些 SquashFS 文件,我想知道它们是如何压缩的,以便我可以大致了解它们在安装时的性能。

squashfs-tools该包提供的唯一二进制文件是mksquashfsunsquashfs,分别用于创建/附加 SquashFS 文件和提取 SquashFS 文件。

如何确定制作特定 SquashFS 文件时使用了哪种压缩方法?

答案1

unsquashfs -s直到提交于 2009 年 8 月 7 日。这意味着如果您运行的是squashfs-tools4.0 或更早版本,您将无法看到所使用的压缩方法。

根据这些信息,我得出了一种读取 SquashFS 4.0 超级块的方法,以确定所使用的压缩方法($SQUASHFSSquashFS 文件的路径在哪里):

dd if=$SQUASHFS bs=1 count=2 skip=20 2>/dev/zero | od -An -tdI | xargs

另外,对于那些想要在行尾输入文件名的人来说,这里有一个函数:

sqsh_comp_method(){ dd if="$1" bs=1 count=2 skip=20 2>/dev/zero|od -An -tdI | xargs;};sqsh_comp_method

您将获得一个数字(自 SquashFS 4.4 起,该数字介于 1 和 6 之间)。您可以将该数字与下表进行匹配,以查看所使用的压缩方法:

╔═══╦════════════════════╦════════════════════╗
║ # ║ Compression Method ║ Compatible Version ║
╠═══╬════════════════════╬════════════════════╣
║ 1 ║ gzip               ║ 1.0 and newer      ║
║ 2 ║ lzma               ║ 4.1 and newer      ║
║ 3 ║ lzo                ║ 4.1 and newer      ║
║ 4 ║ xz                 ║ 4.2 and newer      ║
║ 5 ║ lz4                ║ 4.3 and newer      ║
║ 6 ║ zstd               ║ 4.4 and newer      ║
╚═══╩════════════════════╩════════════════════╝

来源

dd请注意,仅当您指定的文件具有 SquashFS 4.0 超级块时,上述命令才会提供可靠的输出。Not SquashFS 4.0如果文件$SQUASHFS没有 SquashFS 4.0 幻数,则以下命令将输出“ ”:

if [[ "$(dd if="$SQUASHFS" bs=1 count=4 skip=28 2>/dev/zero | xxd -p)" != "04000000" ]] ; then echo -n "Not " ; fi ; echo "SquashFS 4.0"

解释

在 SquashFS 4.0 文件系统中,压缩方法以数据类型的形式存储在超级块的21和 22 个字节short中。 dd bs=1 count=2 skip=20将检索shortod -An -tdI将转换short为人类可读的数字,并且xargs只是为了摆脱前导空格。

在 SquashFS 4.0 之前,只有压缩方法。


旧答案

unsquashfs具有-s显示 SquashFS 文件系统信息的标志。

使用示例:

deltik@node51 [/tmp]# unsquashfs -s template.squashfs
Found a valid SQUASHFS 4:0 superblock on template.squashfs.
Creation or last append time Thu Apr 30 23:07:23 2015
Filesystem size 47225242.44 Kbytes (46118.40 Mbytes)
Compression gzip
Block size 131072
Filesystem is exportable via NFS
Inodes are compressed
Data is compressed
Fragments are compressed
Always_use_fragments option is not specified
Xattrs are compressed
Duplicates are removed
Number of fragments 23629
Number of inodes 437076
Number of ids 1

如果你只想要识别压缩类型,你可以通过管道传输输出awk '/^Compression/{print $2}'。例如:

deltik@node51 [/tmp]# unsquashfs -s template.squashfs | awk '/^Compression/{print $2}'
gzip

答案2

5.39 及以上版本的实用程序file支持显示 squashfs 压缩。如果给出file一个块设备,则需要告诉它不要在意它是一个特殊文件,而是像文件一样查看内部。

file --special-files /dev/mmcblk0p1
/dev/mmcblk0p1: Squashfs filesystem, little endian, version 4.0, zlib compressed, 817826784 bytes, 27633 inodes, blocksize: 131072 bytes, created: Mon Nov 29 20:51:12 2021

答案3

也在寻找更好的答案。我假设您想知道,因为您的操作系统似乎不支持为您提供相关 squashedfs 时使用的压缩。或者可能像 CentOS6 上的 unsquashfs 一样,您的操作系统没有报告压缩类型。

所以我 strings | head在压缩文件中。第一行将是hsqs,第二行应该 指示使用的压缩方法。我相信我使用这种方法来确定7zXZ指示 7zip 实际上是该方法。但是,gzip没有这样的运气。我必须od -b在文件上使用以获取八进制转储并尝试将文件签名与与file程序相关的签名进行匹配。但是,同样没有这样的运气(我期望找到的字符串是037 213但我只看到037 221

相关内容