SquashFS 压缩方法是什么?

Del*_*tik 4 linux compression terminal squashfs

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

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

如何确定用于制作特定 SquashFS 文件的压缩方法?

Del*_*tik 7

unsquashfs -s在 2009 年 8 月 7 日提交之前,没有显示使用的压缩类型的能力。这意味着如果您运行的是squashfs-tools4.0 或更早版本,您将无法看到所使用的压缩方法。

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

dd if=$SQUASHFS bs=1 count=2 skip=20 2>/dev/zero | od -An -tdI | xargs
Run Code Online (Sandbox Code Playgroud)

或者,对于那些想在行尾输入文件名的人,这里有一个函数:

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

您将获得一个数字(从 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      ?
???????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

来源

请注意,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"
Run Code Online (Sandbox Code Playgroud)

解释

在的squashfs 4.0的文件系统中,压缩方法被存储在21和22 ND字节超级块作为数据类型的shortdd bs=1 count=2 skip=20将检索shortod -An -tdI将把short变成一个人类可读的数字,xargs只是为了摆脱前导空格。

在 SquashFS 4.0 之前,只有gzip方法。


旧答案

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
Run Code Online (Sandbox Code Playgroud)

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

deltik@node51 [/tmp]# unsquashfs -s template.squashfs | awk '/^Compression/{print $2}'
gzip
Run Code Online (Sandbox Code Playgroud)