
Ich habe einige SquashFS-Dateien und möchte wissen, wie sie komprimiert wurden, damit ich eine ungefähre Vorstellung davon habe, wie sie sich beim Mounten verhalten würden.
Die einzigen vom squashfs-tools
Paket bereitgestellten Binärdateien sind mksquashfs
und unsquashfs
, die zum Erstellen/Anhängen von SquashFS-Dateien bzw. zum Extrahieren von SquashFS-Dateien dienen.
Wie kann ich feststellen, welche Komprimierungsmethode zum Erstellen einer bestimmten SquashFS-Datei verwendet wurde?
Antwort1
unsquashfs -s
hatte keine Möglichkeit, den verwendeten Komprimierungstyp anzuzeigen, bisdieser Commit am 07. August 2009squashfs-tools
Das bedeutet, dass Sie die verwendete Komprimierungsmethode nicht sehen können, wenn Sie Version 4.0 oder älter verwenden.
Aus diesen Informationen habe ich eine Möglichkeit abgeleitet, den SquashFS 4.0-Superblock zu lesen, um die verwendete Komprimierungsmethode zu bestimmen (wo $SQUASHFS
ist der Pfad zu Ihrer SquashFS-Datei):
dd if=$SQUASHFS bs=1 count=2 skip=20 2>/dev/zero | od -An -tdI | xargs
Alternativ gibt es hier eine Funktion für diejenigen, die den Dateinamen am Ende der Zeile eingeben möchten:
sqsh_comp_method(){ dd if="$1" bs=1 count=2 skip=20 2>/dev/zero|od -An -tdI | xargs;};sqsh_comp_method
Sie erhalten eine Nummer (zwischen 1 und 6 ab SquashFS 4.4). Sie können diese Nummer mit der folgenden Tabelle abgleichen, um zu sehen, welche Komprimierungsmethode verwendet wurde:
╔═══╦════════════════════╦════════════════════╗
║ # ║ 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 ║
╚═══╩════════════════════╩════════════════════╝
(Quelle)
Beachten Sie, dass der obige dd
Befehl nur dann eine zuverlässige Ausgabe liefert, wenn die von Ihnen angegebene Datei einen SquashFS 4.0-Superblock hat. Der folgende Befehl gibt " Not SquashFS 4.0
" aus, wenn die Datei $SQUASHFS
nicht die SquashFS 4.0-Magic-Nummer hat:
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"
Erläuterung
In SquashFS 4.0-Dateisystemen wird die Komprimierungsmethode als Datentyp im 21. und 22. Byte des Superblocks gespeichert . ruftshort
die dd bs=1 count=2 skip=20
ab short
, od -An -tdI
wandelt die short
in eine für Menschen lesbare Zahl um und xargs
dient lediglich dazu, die führenden Leerzeichen zu entfernen.
Vor SquashFS 4.0 gab es nur dasgzipMethode.
Alte Antwort
unsquashfs
verfügt über das -s
Flag zum Anzeigen von SquashFS-Dateisysteminformationen.
Anwendungsbeispiel:
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
Wenn Sie nur den Komprimierungstyp ermitteln möchten, können Sie die Ausgabe durch weiterleiten awk '/^Compression/{print $2}'
. Beispiel:
deltik@node51 [/tmp]# unsquashfs -s template.squashfs | awk '/^Compression/{print $2}'
gzip
Antwort2
Das file
Dienstprogramm ab Version 5.39 unterstützt die Anzeige der Squashfs-Komprimierung. Wenn Sie file
ein Blockgerät angeben, müssen Sie ihm sagen, dass es sich nicht darum kümmern soll, dass es sich um eine spezielle Datei handelt, und dass es darin so aussehen soll, als wäre es eine Datei.
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
Antwort3
Ich suche auch nach einer besseren Antwort. Ich nehme an, Sie möchten es wissen, weil Ihr Betriebssystem die Komprimierung, die Ihnen das fragliche Squashedfs zur Verfügung stellt, anscheinend nicht unterstützt. Oder vielleicht meldet Ihr Betriebssystem den Komprimierungstyp nicht, wie das Unsquashfs unter CentOS6.
Also ich strings | head
auf der komprimierten Datei. Die erste Zeile wird sein hsqs
und die zweite Zeilesollen geben die verwendete Komprimierungsmethode an. Ich glaube, ich habe diese Methode verwendet, um festzustellen, dass 7zXZ
die Angabe, dass 7zip tatsächlich die Methode war. Mit hatte ich jedoch gzip
kein Glück. Ich muss od -b
auf die Datei anwenden, um den Oktaldump zu erhalten und zu versuchen, die Dateisignatur mit denen abzugleichen, die dem file
Programm zugeordnet sind. Aber auch hier hatte ich kein Glück (die Zeichenfolge, die ich erwartet hatte, ist, 037 213
aber ich sehe nur ) 037 221
.