我有一些 SquashFS 文件,我想知道它们是如何压缩的,以便我可以大致了解它们在安装时的性能。
squashfs-tools
该包提供的唯一二进制文件是mksquashfs
和unsquashfs
,分别用于创建/附加 SquashFS 文件和提取 SquashFS 文件。
如何确定制作特定 SquashFS 文件时使用了哪种压缩方法?
答案1
unsquashfs -s
直到提交于 2009 年 8 月 7 日。这意味着如果您运行的是squashfs-tools
4.0 或更早版本,您将无法看到所使用的压缩方法。
根据这些信息,我得出了一种读取 SquashFS 4.0 超级块的方法,以确定所使用的压缩方法($SQUASHFS
SquashFS 文件的路径在哪里):
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
将检索short
,od -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
。