Mi sono trovato a dover integrare il supporto a SquashFS nel kernel 2.6.28. SquashFS è un filesystem compresso a sola lettura. Nella versione base, esso utilizza unicamente la compressione GZIP, in quanto è l’unica supportata nativamente dal kernel linux. Per ottenere maggiori prestazioni nella compressione, è stato sviluppato un fork il quale fa uso dell’algoritmo LZMA (lo stesso usato da 7zip). Installare questa versione, però, risulta un pò complicato. Per questo ho deciso di postare questa guida, la quale si rifà ad un articolo pubblicato qui.
La versione base di SquashFS supporta unicamente compressione gzip. Per il supporto alla compressione LZMA esiste un fork su http://www.squashfs-lzma.org/ .
Da squashfs-lzma.org bisogna scaricare i seguenti pacchetti:
- squashfs 3.4
- LZMA SDK 4.57
- SquashFS-LZMA 3.4-457
Nella lista sopra riportata, e presente sul sito appena citato, vengono riportati anche come necessari (ovviamente) i sorgenti del kernel. Assumo che li abbiate già scaricati e scompattati in /usr/src/linux-2.6.28.
Una volta copiati tutti i files scaricati in una directory, ad esempio /usr/src/squashfs, avremo 3
files:
- squashfs3.4.tar.gz
- lzma457.tar.bz2
- sqlzma3.4-457.tar.bz2
Scompattiamo il primo file:
tar zxvf squashfs3.4.tar.gz
il quale creerà una directory, squashfs3.4 nella dir /usr/src/squashfs.
Quindi creiamo una directory chiamata lzma457 in /usr/src/squashfs, e vi estraiamo
i files da lzma457.tar.bz2:
mkdir lzma457 && tar -C lzma457 -jxf lzma457.tar.bz2
Quindi estraiamo sqlzma3.4 direttamente in /usr/src/squashfs:
tar xjvf sqlzma3.4-457.tar.bz2
Quindi ci spostiamo nella directory dei sorgenti del kernel:
cd /usr/src/linux-2.6.28
e applichiamo le patch, usando i comandi:
patch -p1 < /usr/src/squashfs/squashfs3.4/kernel-patches/linux-2.6.27-rc4-next/squashfs3.4-patch
patch -p1 < /usr/src/squashfs/sqlzma2k-3.4.patch
Fatto ciò diamo un make menuconfig al kernel e andiamo ad abilitare come modulo (<M>) SquashFS 3.4.
(lo troviamo sotto File systems->Miscellaneous filesystems)
Quindi spostiamoci nella directory /usr/src/squashfs/lzma457 e patchiamo i sorgenti eseguendo il comando:
patch -p1 < ../sqlzma1-457.patch
Fatto ciò, torniamo nella directory /usr/src/squashfs, ed editiamo il file Makefile. Dobbiamo adattare la variabile KVer per la nostra versione kernel:
KVer = linux-2.6.28
Quindi, linkiamo simbolicamente ai sorgenti del kernel la directory squashfs3.4/kernel-patches/ :
ln -s /usr/src/linux-2.6.28 squashfs3.4/kernel-patches/
e patchiamo:
patch -p0 < sqlzma2u-3.4.patch
Ora siamo pronti per compilare. Diamo il comando make
Se tutto è andato a buon fine, siamo pronti per copiare i moduli appena compilati sotto /lib/modules/2.6.28/:
creiamo la directory extra sotto /lib/modules/2.6.28/:
mkdir /lib/modules/2.6.28/extra
copiamo il modulo di squashfs:
cp /usr/src/linux-2.6.28/fs/squashfs/*.ko /lib/modules/2.6.28/extra/
quindi copiamo i moduli sqlzma e unlzma:
cp lzma457/C/Compress/Lzma/kmod/*.ko /lib/modules/2.6.28/extra/
infine, copiamo i tools di squashfs:
cp squashfs3.4/squashfs-tools/mksquashfs /sbin/mksquashfs.lzma
Quasi finito! Refreshiamo le dipendenze dei moduli del kernel:
depmod -ae
e proviamo a caricare il modulo squashfs:
modprobe squashfs
All done! Se proviamo ad avere la lista dei moduli caricati con lsmod, dovremmo quindi trovare, tra gli altri, squashfs, sqlzma, unlzma.
Per un’ulteriore sicurezza, proviamo a leggere la lista dei filesystems supportati dal kernel, dando cat /proc/filesystems. In fondo alla lista, dovremmo trovare “squashfs”.
Spero che questa mia esperienza con squashfs possa tornarvi utile.