SquashFS の圧縮方法とは何ですか?

SquashFS の圧縮方法とは何ですか?

SquashFS ファイルがいくつかあるのですが、マウントされたときにどのように動作するかを大まかに把握できるように、それらがどのように圧縮されているかを知りたいです。

squashfs-toolsパッケージで提供されるバイナリはmksquashfsと のみでunsquashfs、それぞれ 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      ║
╚═══╩════════════════════╩════════════════════╝

ソース

上記のコマンドは、指定したファイルに SquashFS 4.0 スーパーブロックが含まれている場合にのみ、信頼できる出力を提供することに注意してください。ファイルにSquashFS 4.0 マジック ナンバーが含まれていない場合dd、次のコマンドは " " を出力します。Not SquashFS 4.0$SQUASHFS

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を人間が読める数値に変換しshortxargsは先頭のスペースを取り除くだけです。

SquashFS 4.0以前は、圧縮方法。


古い回答

unsquashfs-sSquashFS ファイルシステム情報を表示するためのフラグがあります。

使用例:

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

fileバージョン 5.39 以降のユーティリティは、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

また、より良い回答を探しています。あなたの OS は、問題の squashedfs を提供するために使用される圧縮をサポートしていないように見えるため、知りたいのだと思います。または、CentOS6 の unsquashfs のように、圧縮タイプを報告しないのかもしれません。

strings | head圧縮ファイルの最初の行は、 hsqs2行目はすべき 使用されている圧縮方式を示します。この方法を使用して、 が7zXZ実際に 方式であることを示すことを決定したと思います。しかし、 では、そのような幸運はありませんでした。ファイルに対して を使用して 8 進ダンプを取得し、ファイル署名をプログラムに関連付けられている署名と一致させようとするgzip必要があります。しかし、この場合も、そのような幸運はありませんでした (見つかると予想した文字列は ですが、表示されるのは だけです。od -bfile037 213037 221

関連情報