[[Vorlage(Getestet, jammy)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis()]] 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 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 {{{#!vorlage Paketinstallation 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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:Man-Page] oder beim Aufruf von `mksquasfs -h`erklärt sind. Möchte man einen anderen Kompressionsalgorithmus als [https://zlib.net/ zlib] {en} verwenden, muss man die Option `-comp ALGORITHMUS` angeben. Mögliche Kompressionsalgorithmen sind: ##Anker wird für einen Link aus der Einleitung benötigt [[Anker(kompressionsmethoden)]] {{{#!vorlage Tabelle <-2 tableclass="zebra_start3" rowclass="titel" :>Kompressionalgorithmen für mksquashfs +++ Abkürzung <:>Algorithmus +++ `gzip` [wikipeida:zlib:] Algorithmus, der auch von z.B. von [:gzip:] verwendet wird. Defaultwert für `-comp` +++ `lzma` [wikipedia:Lempel-Ziv-Markow-Algorithmus:] +++ `lzo` [wikipedia:Lempel-Ziv-Oberhumer:] Algorithmus +++ `lz4` [wikipedia:LZ4:] Algorithmus +++ `xz` [wikipedia:xz:] Algorithmus +++ `zstd` [wikipedia: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: {{{#!vorlage Befehl 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 {{{#!vorlage 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 {{{#!vorlage 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: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: {{{#!vorlage Befehl sqfscat codefs.sqfs releases.csv }}} Versucht man mittels sqfscat eine Datei aus einem SqaushFS Dateisystem auszugeben, die es nicht gibt, wie z.B: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl du -hs /snap/firefox/2154 }}}# {{{ 626M /snap/firefox/2154 }}} = Links = == Intern == * [:Dateisystem:] {Übersicht} Übersichtsartikel rund ums Thema Dateisysteme == Extern == * [https://docs.kernel.org/filesystems/squashfs.html Kerneldokumantion] {en} zu SquashFS * [github:plougher/squashfs-tools:SquashFS-Tools Projekteseite] bei Github * [wikipedia:SquashFS:] Eintrag bei Wikipedia, inklusive kurzer technischer Erklärung #tag: System, Dateisystem