SquashFSファイルがいくつかありますが、それらがどのように圧縮されているかを知りたいので、マウントしたときにどのように動作するかを大まかに把握できます。
squashfs-tools
パッケージによって提供されるバイナリはmksquashfs
とunsquashfs
のみで、それぞれSquashFSファイルの作成/追加とSquashFSファイルの抽出に使用されます。
特定のSquashFSファイルを作成するために使用された圧縮方法を特定するにはどうすればよいですか?
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 データ型としてのスーパーブロックのバイトshort
。 dd bs=1 count=2 skip=20
はshort
を取得し、od -An -tdI
はshort
を人間が読める形式の数値に変換し、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
また、より良い答えを探しています。お使いのOSは、問題のスカッシュドフを提供する際に使用される圧縮をサポートしていないようであるため、知りたいと思います。または、CentOS6のunsquashfsのように、圧縮タイプを報告しません。
だから私は圧縮ファイルをstrings | head
します。最初の行はhsqs
になり、2番目の行shouldは使用される圧縮方法を示します。私はこのメソッドを使用して、7Zipが実際にメソッドであることを示す7zXZ
を判別したと思います。ただし、gzip
では、そのような運はありません。ファイルでod -b
を使用して、8進ダンプを取得し、ファイルの署名をfile
プログラムに関連付けられているものと一致させようとする必要があります。ただし、この場合も、そのような運はありません(私が見つけようと思っていた文字列は、037 213
ですが、037 221
しか表示されません。