SquashFS als hochkompaktes Alternativdateisystem (zu NFS)

SquashFS ist ein Spezialdateisystem eigentlich entwickelt für Embedded Devices,
welches nur RO genutzt werden kann (reicht für das OpenSLX-Projekt ja völlig aus, da sich die Clients ja nicht in die Quere kommen sollen - ausserdem gibt es kein triviales Network Block Device, welches Schreibvorgänge sauber auf dem Server koordiniert). Das Dateisystem kann eine maximale Grösse von 4GByte erreichen, d.h. das Ausgangs-Filesystem sollte die 10GByte nicht weit überschreiten (damit hat man aber schon eine ziemlich vollständige SUSE oder man mountet mehrere Teile, wie das für Erweiterungskomponenten, wie VMware (Player mit Images anderer OS) jetzt schon passiert).

Das verwendete Beispiel-Hauptdateisystem (ca. 6.8GByte) wurde mit mksquashfs auf ca. 2.7GByte zusammengequetscht. Spätere Änderungen sind nicht trivial über das Tool mksquashfs möglich, lediglich Hinzufügungen sind einfach möglich. Man kann die Prozedur ja immer nachts laufen lassen, um aktuelle Änderungen aus dem Stage1 einzupflegen... Das Tool brauchte im Initial-Lauf eine knappe halbe Stunde auf einem Dual-Opteron-System mit schneller SCSI-Platte.

Eine 2.7GByte Datei auf dem Server würde bedeuten, dass man ein komplettes SUSE mit einem 4GByte-Hauptspeicher-Server komplett aus dem RAM bedienen koennen müsste: Damit sollte ein Server quasi "beliebig" skalieren ...

SquashFS ist kein direkter Ersatz von NFS (es weiss nix von Netzwerken) arbeitet aber ohne Probleme mit den erschiedenen Network Block Devices Homepage des ursprünglichen Network Block Devices, wie es im Kernel enthalten ist zusammen. Interessant werden könnte in Zukunft auch ein potenzieller NBD-Ersatz.

SquashFS benutzen

Will man nun ein SquashFS generieren (am besten eine Datei, eine Partition oder LVM-Share ginge auch), sieht das so aus:

mksquashfs /Quellverzeichnis01 /Quellverzeichnis02 ... Zieldatei -e Datei_Exclude

Beispiel:

mksquashfs proc dev sys Zieldatei

SqashFS lädt man von der o.g. Sourceforge-Seite und muss es anschliessend in den vorbereiteten Kernelsource patchen (wobei die Version des Patches zur Kernel-Release passen sollte):

linux01:/usr/src/linux # make cloneconfig modules_prepare
linux01:/usr/src/linux # patch -p1 < ~/fs/squashfs3.1/linux-2.6.<kernel-ver>/squashfs3.1-patch 
linux01:/usr/src/linux # make menuconfig
linux01:/usr/src/linux # make fs/squashfs/squashfs.ko
linux01:/usr/src/linux # mkdir /lib/modules/linux-2.6.<kernel-ver>/kernel/fs/squashfs
linux01:/usr/src/linux # cp fs/squashfs/squashfs.ko /lib/modules/linux-2.6.<kernel-ver>/kernel/fs/squashfs
linux01:/usr/src/linux # depmod -a

Ein Problem ist derzeit die Umstellung von SquashFS3.X auf Version 3.3: Hier ändern sich das Kernelmodul und mksquashfs.
Dazu noch unterstützen die zu exportierenden Systeme verschiedene mksquashfs-Versionen je nach Jahr der Erscheinung, wobei die neueren Versionen nicht zurückkompatibel sind. Es werden derzeit folgende Versionen benötigt:

ubuntu-10.04 (lucid lynx) -- squashfs-tools-4
ubuntu-9.10 (karmic koala) -- squashfs-tools-4
ubuntu-9.04 (jauntyjackalope) -- squashfs-tools-3.3

Suse-11.3 -- squashfs-tools-4
Suse-11.2 -- squashfs-tools-3.99
Suse-11.0 -- squashfs-tools-3.2
Debian GNU/Linux 5.0.4 (lenny) (132.230.4.2 Server) -- squashfs-tools-3.1

Je nach Target der Exportierung soll die entsprechende mksquashfs-Version eingesetzt werden.

squashfs wird von dem Script FileSystem unter:

~/openslx/installer/OpenSLX/OSExport/FileSystem

aufgerufen. Dieser Script soll angepasst werden, damit vor der Exportierung
die richtige Wahl getroffen wird, welche Version des mksquashfs-Moduls aufgerufen werden soll. Dabei wird der Pfad zu dem Modul angegeben. Derzeit befinden sich die neueren
mksquashfs-Versionen unter:
/opt/openslx/share/squashfs

Mit dem Aufruf des "neuen" mksquashfs ist noch nicht die ganze Umstellung abgeschlossen, denn es bestehen Änderungen bei dem Kommandoaufruf der späteren als 3.1 mksquashfs Versionen. Diese Änderungen betreffen das Filtrieren der zu kompressierenden Dateien. Deshalb muss das Filter-File umgeschrieben werden.