
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 ║
╚═══╩════════════════════╩════════════════════╝
(ソース)
上記のコマンドは、指定したファイルに 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
は を取得し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
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
圧縮ファイルの最初の行は、 hsqs
2行目はすべき 使用されている圧縮方式を示します。この方法を使用して、 が7zXZ
実際に 方式であることを示すことを決定したと思います。しかし、 では、そのような幸運はありませんでした。ファイルに対して を使用して 8 進ダンプを取得し、ファイル署名をプログラムに関連付けられている署名と一致させようとするgzip
必要があります。しかし、この場合も、そのような幸運はありませんでした (見つかると予想した文字列は ですが、表示されるのは だけです。od -b
file
037 213
037 221