web-dev-qa-db-ja.com

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

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

squashfs-toolsパッケージによって提供されるバイナリはmksquashfsunsquashfsのみで、それぞれSquashFSファイルの作成/追加とSquashFSファイルの抽出に使用されます。

特定のSquashFSファイルを作成するために使用された圧縮方法を特定するにはどうすればよいですか?

3
Deltik

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コマンドは、指定したファイルにSquashFS4.0スーパーブロックが含まれている場合にのみ信頼できる出力を提供することに注意してください。次のコマンドは、ファイルNot SquashFS 4.0にSquashFS4.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に保存されます。st および22nd データ型としてのスーパーブロックのバイトshortdd bs=1 count=2 skip=20shortを取得し、od -An -tdIshortを人間が読める形式の数値に変換し、xargsは単に先頭のスペース。

SquashFS 4.0より前は、gzipメソッドしかありませんでした。


古い答え

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

使用例:

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
6
Deltik

また、より良い答えを探しています。お使いのOSは、問題のスカッシュドフを提供する際に使用される圧縮をサポートしていないようであるため、知りたいと思います。または、CentOS6のunsquashfsのように、圧縮タイプを報告しません。

だから私は圧縮ファイルをstrings | headします。最初の行はhsqsになり、2番目の行shouldは使用される圧縮方法を示します。私はこのメソッドを使用して、7Zipが実際にメソッドであることを示す7zXZを判別したと思います。ただし、gzipでは、そのような運はありません。ファイルでod -bを使用して、8進ダンプを取得し、ファイルの署名をfileプログラムに関連付けられているものと一致させようとする必要があります。ただし、この場合も、そのような運はありません(私が見つけようと思っていた文字列は、037 213ですが、037 221しか表示されません。

0
Otheus