SquashFS
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 22.04 Jammy Jellyfish
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
squashfs ist ein Linux-Dateisystem, welches seit Ende März 2009 direkt vom Linux-Kernel unterstützt wird. squashfs ist ein komprimiertes Dateisystem, welches nur lesenden Zugriff bietet und sich komplett in einer Datei befindet. Eine Datei mit einem SquashFS-Dateisystem ist also, vereinfacht gesagt, wie ein komprimiertes Tar-Archiv, nur als Dateisystem. SquashFS ist wie alle anderen Dateisysteme auch über mount einhängbar und unterstützt Dateiattribute etc. wie z.B. ext auch. SquashFS unterstützt verschiedene Kompressionsmethoden und führt standardmäßig eine Deduplizierung von Dateien durch, die in das Dateisystem gepackt werden.
Ein eingehängtes SquashFS-Dateisystem wird nicht entpackt, sondern bleibt stets komprimiert. Beim Laden / Öffnen von Dateien aus dem Dateisystem werden die jeweils benötigten Dateien zur Laufzeit, also beim Zugriff darauf, vom Kernelmodul für SquashFS entpackt und dann ins RAM geschrieben.
SquashFS kann z.B. dann praktisch sein, wenn man eine größere Menge archivierter Dateien hat, auf die man aber trotzdem noch lesend Zugreifen möchte. Hier hat SquashFS gegenüber gepackten Archiven den Vorteil, dass auf die Dateien über das SquashFS-Dateisystem zugegriffen werden kann, man das Archiv aber jedes Mal erst entpacken müsste. SquashFS kommt auch bei snap zum Einsatz. snap-Pakete sind auch ein SquashFS-Dateisystem. Des Weiteren kommt SquashFS auch auf Embeddedgeräten mit Linux als Betriebssystem zum Einsatz, wenn es darum geht, Speicherplatz für Programme und Daten zu sparen, indem man diese in ein SquashFS-Dateisystem verpackt. Außerdem kommt SquashFS auch auf Live- / Installationsmedien von Linux-Distributionen zum Einsatz, so auch bei Ubuntu.
Installation¶
Das Kernelmodul zum Lesen aus einem SquashFS Dateisystem ist in dem von Ubuntu verwendeten Kernel enthalten. Die Hilfsprogramme zum Anlegen, Entpacken etc. des Dateisystems sind im Paket
squashfs-tools
Befehl zum Installieren der Pakete:
sudo apt-get install squashfs-tools
Oder mit apturl installieren, Link: apt://squashfs-tools
enthalten[1]. Dieses ist bei Ubuntu normalerweise bereits installiert.
Nutzung¶
Ein SquashFS Dateisystem kann wie jedes andere Dateisystem auch über den Befehl mount eingebunden werden. Beim Parameter -t
für den Typ des Dateisystems muss squashfs
angegeben werden. Beispiel:
sudo mount -t squashfs /home/otto/data.sqfs /media/otto/data
Hier würde das in der Datei data.sqfs SquashFS Dateisystem nach /media/otto/data eingehängt. Standardmäßig werden dabei die Optionen ro,relatime,errors=continue
gesetzt. Nach dem einhängen kann dann auf die Dateien im Dateisystem lesend zugegriffen werden.
mksquashfs - Dateisystem erstellen¶
Zum Erstellen eines SquashFS-Dateisystems dient der Befehl mksquashfs
. Die allgemeine Syntax lautet:
mksquashfs EINGABEDATEIEN AUSGABEDATEI [OPTIONEN]
EINGABEDATEIEN
können ein oder mehrere Dateien und / oder Verzeichnisse sein. Die Verzeichnisstruktur bleibt dabei erhalten, Dateiattribute bleiben ebenfalls erhalten. AUSGABEDATEI
ist die Datei, die das SquashFS-Dateisystem enthält. Man kann für die Datei die Endung .sqfs benutzen, dies ist aber keine Pflicht. Wichtig ist, dass mögliche Optionen nach EINGABEDATEIEN
und AUSGABEDATEI
angegeben werden, sonst wird der Befehl nicht ausgeführt.
Beispiel:
mksquashfs /home/otto/code codefs.sqfs
Hier würde die Dateien und Unterverzeichnisse von /home/otto/code in ein SquashFS-Dateisystem in der Datei codefs.sqfs gepackt. Die Ausgabe des Befehls sieht z.B. so aus:
Parallel mksquashfs: Using 16 processors Creating 4.0 filesystem on codefs.sqfs, block size 131072. [======================================================================================================================================================================================/] 31962/31962 100% Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 131072 compressed data, compressed metadata, compressed fragments, compressed xattrs, compressed ids duplicates are removed Filesystem size 118736.15 Kbytes (115.95 Mbytes) 27.47% of uncompressed filesystem size (432248.41 Kbytes) Inode table size 356267 bytes (347.92 Kbytes) 28.29% of uncompressed inode table size (1259559 bytes) Directory table size 330007 bytes (322.27 Kbytes) 33.94% of uncompressed directory table size (972373 bytes) Number of duplicate files found 8401 Number of inodes 39148 Number of files 31352 Number of fragments 1608 Number of symbolic links 28 Number of device nodes 0 Number of fifo nodes 0 Number of socket nodes 0 Number of directories 7768 Number of ids (unique uids + gids) 1 Number of uids 1 otto (1000) Number of gids 1 otto (1000)
mksquashfs
kennt, wie andere Dateisysteme auch, eine Vielzahl von Optionen, inklusive solcher zum Einstellen der Blockgröße oder Ausschließen bestimmter Teile des Dateisystems von der Komprimierung, die alle in der Man-Page oder beim Aufruf von mksquasfs -h
erklärt sind.
Möchte man einen anderen Kompressionsalgorithmus als zlib 🇬🇧 verwenden, muss man die Option -comp ALGORITHMUS
angeben. Mögliche Kompressionsalgorithmen sind:
Kompressionalgorithmen für mksquashfs | |
Abkürzung | Algorithmus |
gzip | zlib Algorithmus, der auch von z.B. von gzip verwendet wird. Defaultwert für -comp |
lzma | Lempel-Ziv-Markow-Algorithmus |
lzo | Lempel-Ziv-Oberhumer Algorithmus |
lz4 | LZ4 Algorithmus |
xz | xz Algorithmus |
zstd | Zstandard Algorithmus |
Solange man nicht spezieller Anforderungen / Anwendungsfälle hat kann man den Standardalgorithmus zlib verwenden. Einige Algorithmen kennen auch noch zusätzliche Parameter zum Kompressionsgrad. Diese sind ebenfalls in der Man-Page von mksquashfs erklärt.
unsquashfs - Dateisystem entpacken¶
Zum Entpacken eines SquashFS Dateisystems dient der Befehl unsquashfs
. Die allgemeine Syntax lauter:
unsquashfs [OPTIONEN] SQUASHFS_DATEI
Standardmäßig wird das Dateisystem dann in den Ordern squashfs-root entpackt, der auch direkt anlegt wird. Ist der Ordner schon vorhanden, erhält man ein Fehlermeldung und die Ausführung des Befehls wird abgebrochen.
Möchte man das Ausgabeverzeichnis, in das entpackt wird, selber bestimmt, fügt man die Option -d AUSGABEVERZEICHNIS
hinzu.
Informationen zu einem einem SquashFS-Dateisystem erhält man mit folgendem Befehl
unsquashfs -s DATEI.sqfs
Die Ausgabe sieht dann z.B. so aus:
Found a valid SQUASHFS 4:0 superblock on DATEI.sqfs. Creation or last append time Thu Dec 15 19:59:32 2022 Filesystem size 239426092 bytes (233814.54 Kbytes / 228.33 Mbytes) Compression zstd Block size 131072 Filesystem is exportable via NFS Inodes are compressed Data is compressed Uids/Gids (Id table) are compressed Fragments are compressed Always-use-fragments option is not specified Xattrs are compressed Duplicates are removed Number of fragments 1608 Number of inodes 39148 Number of ids 1 Number of xattr ids 0
Möchte man sich den Inhalt einer Datei mit einem SquashFS Dateisystem anzeigen lassen, ohne das Dateisystem zu einzuhängen oder zu entpacken, kann man den Befehl
unsquashfs -l SQAUASHFS_DATEI.sqfs
aufrufen. Dann werden auf die Standardausgabe alle Datei inklusive Pfad relativ zum Wurzelverzeichnis des SquashFS-Dateisystems ausgegeben. Nutzt man die Option -ll
, erhält man eine Ausgabe analog zu ls -la:, d.h. es werden auch Dateirechte, Eigentümer, Gruppe, Größe usw. ausgegeben.
unsquashfs kennt auch noch eine Vielzahl von weiteren Optionen, die in der Man-Page oder beim Aufruf von unsquasfs -h
erklärt sind.
sqfscat¶
Mit dem Befehl sqfscat
kann man sich eine Datei aus einem SquashFS-Dateisystem ausgeben lassen, ohne das Dateisystem einzuhängen oder zu entpacken. Beispiel:
sqfscat codefs.sqfs releases.csv
Versucht man mittels sqfscat eine Datei aus einem SqaushFS Dateisystem auszugeben, die es nicht gibt, wie z.B:
sqfscat codefs.sqfs gibtesnicht.txt
erhält man die Fehlermeldung:
cat: no matches for /gibtesnicht.txt
sqfstar¶
sqfstar
ist ein Hilfsprogramm, mit dessen Hilfe man ein tar-Archiv in ein SquashFS-Dateisystem packen kann. Der Aufruf ist wie folgt:
cat ARCHIV.tar | sqfstar AUSGABEDATEI [OPTIONEN]
Das tar-Archiv wird also mittels cat auf die Standardausgabe ausgegeben, sqfstar liest von der Standardeingabe und generiert das SquashFS-Dateisystem. Die Optionen für sqfstar sind fast identisch mit denen von mksquashfs und können über sqfstar -h
ausgegeben werden.
squashfs und du¶
Wenn man das Programm du zur Bestimmung des belegten Platzes auf ein eingehängtes SqaushFS-Dateisystem anwendet, dann gibt du nicht dir Größe der SquashFS-Datei aus, sondern du sieht die Größe aller Dateien darin, als wenn diese komplett Entpackt vorliegen würden. Wie in der Einleitung bereits erklärt bleiben die Daten auf Laufwerk stets komprimiert.
Beispiel: Die Größe des Firefox snap - welches ja auch ein SqaushFS-Dateisystem ist - in der Version 2154 kann wie folgt bestimmt werden:
du -h /var/lib/snapd/snaps/firefox_2154.snap
238M firefox_2154.snap
Bestimmt man dagegen die Größe aller Dateien unterhalb des Einhängepunkts des snaps, erhält man folgendes Ergebnis:
du -hs /snap/firefox/2154
#
626M /snap/firefox/2154
Links¶
Intern¶
Dateisystem Übersichtsartikel rund ums Thema Dateisysteme
Extern¶
Kerneldokumantion 🇬🇧 zu SquashFS
SquashFS-Tools Projekteseite bei Github
SquashFS Eintrag bei Wikipedia, inklusive kurzer technischer Erklärung