Was war die Komprimierungsmethode von SquashFS?

Was war die Komprimierungsmethode von SquashFS?

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-toolsPaket bereitgestellten Binärdateien sind mksquashfsund 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 -shatte keine Möglichkeit, den verwendeten Komprimierungstyp anzuzeigen, bisdieser Commit am 07. August 2009squashfs-toolsDas 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 $SQUASHFSist 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 ddBefehl 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 $SQUASHFSnicht 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=20ab short, od -An -tdIwandelt die shortin eine für Menschen lesbare Zahl um und xargsdient lediglich dazu, die führenden Leerzeichen zu entfernen.

Vor SquashFS 4.0 gab es nur dasgzipMethode.


Alte Antwort

unsquashfsverfügt über das -sFlag 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 fileDienstprogramm ab Version 5.39 unterstützt die Anzeige der Squashfs-Komprimierung. Wenn Sie fileein 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 | headauf der komprimierten Datei. Die erste Zeile wird sein hsqsund die zweite Zeilesollen geben die verwendete Komprimierungsmethode an. Ich glaube, ich habe diese Methode verwendet, um festzustellen, dass 7zXZdie Angabe, dass 7zip tatsächlich die Methode war. Mit hatte ich jedoch gzipkein Glück. Ich muss od -bauf die Datei anwenden, um den Oktaldump zu erhalten und zu versuchen, die Dateisignatur mit denen abzugleichen, die dem fileProgramm zugeordnet sind. Aber auch hier hatte ich kein Glück (die Zeichenfolge, die ich erwartet hatte, ist, 037 213aber ich sehe nur ) 037 221.

verwandte Informationen