Per creare un file system compresso a partire da una singola directory (si assuma, /some/dir), e scriverlo su un file regolare (producendo così un file-immagine del file system), basta dire una sola frase magica:
bash# mksquashfs /some/dir dir.sqsh
Il programma mksquashfs eseguirà la compressione, stamperà il numero di inode, le dimensioni dei dati scritti e il rapporto di compressione medio. Ora, si avrà la directory /some/dir sul file-immagine dir.sqsh, e si potrà quindi usare il comando mount per montarlo utilizzando un dispositivo di loopback:
bash# mkdir /mnt/dir bash# mount dir.sqsh /mnt/dir -t squashfs -o loop
Per verificare che si abbia quanto atteso:
bash# ls /mnt/dir
Se si vuole scrivere il file system direttamente su un dispositivo (ad esempio il proprio floppy su /dev/fd0):
bash# mksquashfs /some/dir /dev/fd0
Eseguire poi il mount del dispositivo:
bash# mount /dev/fd0 /mnt/floppy -t squashfs
Quindi verificare se tutto è andato a buon fine:
bash# ls /mnt/floppy
Le operazioni qui descritte corrispondono alla maggior parte dei casi di utilizzo di un file system compresso in sola lettura, sia che si voglia utilizzarlo su un dispositivo a blocchi che su un file. Potrebbe trattarsi di qualsiasi cosa, da grandi archivi di server FTP/HTTP, il cui contenuto non viene modificato spesso, all'utilizzo di una partizione /usr compressa o altre cose simili.
Si supponga di avere una directory /var/arch con molti file e che si voglia trasformarla in un file system compresso, conservandola nella propria partizione di root come un file (si tratta di un file-immagine del file system da montare mediante un dispositivo di loopback). Le operazioni necessarie sono le seguenti:
Comprimere la directory, quindi montarla mediante loopback per controllo:
bash# mksquashfs /var/arch /var/arch.sqsh bash# mkdir /mnt/tmp bash# mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop bash# ls /mnt/tmp
Se tutto è come ci si aspetta, montare il file system all'avvio automaticamente aggiungendo questa riga al proprio file /etc/fstab:
/var/arch.sqsh /var/arch squashfs ro,defaults 0 0
Smontare il file system dal punto di mount temporaneo e montarlo utilizzando la relativa voce in fstab :
bash# umount /mnt/tmp bash# mount /var/arch
Ora, per assicurarsi che tutto è andato bene
bash# ls /var/arch
Si assuma di avere due partizioni del disco rigido, /dev/hda6 (che è vuota) e /dev/hda7 (più grande di /dev/hda6, montata su /var/arch, che contiene dati ed è piena). Ora, si consideri di voler comprimere il file system su /dev/hda7 e spostarlo su /dev/hda6, al fine di utilizzare poi la partizione /dev/hda7 per qualche altro scopo. Si supponga che sul file /etc/fstab (reiserfs è solo un file system di esempio utilizzato su /dev/hda7) si abbia la seguente riga:
/dev/hda7 /var/arch reiserfs defaults 0 0
Allo stesso modo dell'esempio precedente:
bash# mksquashfs /var/arch /var/arch.sqsh bash# mkdir /mnt/tmp bash# mount /var/arch.sqsh /mnt/tmp -t squashfs -o loop bash# ls /mnt/tmp
Se tutto è andato bene, smontare /dev/hda7 (se necessario) e usare dd per copiare /var/arch.sqsh su /dev/hda6:
bash# umount /dev/hda7 bash# dd if=/var/arch.sqsh of=/dev/hda6
Ora cambiare la riga su /etc/fstab per la partizione /dev/hda7 in:
/dev/hda6 /var/arch squashfs ro,defaults 0 0
Montare il nuovo file system e verificare se tutto è andato bene:
bash# mount /var/arch bash# ls /var/arch
Non dimenticare di cancellare il file-immagine non più necessario:
bash# rm /var/arch.sqsh
Per sistemi "minimali/integrati", si vuole intendere sistemi Linux fatti per essere avviati da floppy disk, flash disk IDE/USB, CD-ROM iso9660, hard drive di piccole dimensioni e simili. Sia che si voglia il proprio file system di root interamente su un singolo media (una singola partizione, o un singolo floppy), oppure un sistema modulare (diversi floppy o partizioni), il procedimento è quasi lo stesso. La creazione di tali sistemi Linux è al di fuori della finalità di questo HOWTO - per questo esistono HOWTO e guide dedicati (come il Bootdisk HOWTO e Linux From Scratch - visita www.tldp.org per ottenere questi documenti).
Al fine di usare SquashFS per la creazione di sistemi Linux su piccoli dischi, si dovranno seguire i soliti passi per la creazione di un sistema minimale, eseguendo le seguenti procedure nei punti indicati:
Nella preparazione di un kernel per il proprio sistema, assicurarsi di abilitare il supporto per SquashFS, in modo da poter montare i relativi file system.
Utilizzare mksquashfs per creare ram disk iniziali in sola lettura o altri file system.
Non dimenticare di impostare il tipo di file system squashfs nel file /etc/fstab e gli script di avvio del proprio sistema per montare i file system compressi.
Esempio per Floppy. Si assuma di avere un punto di mount del floppy su /home/user/floppylinux e di voler porre il file system di root su un floppy disk e la directory /usr su un altro. Quello che si dovrebbe fare è:
bash# cd /home/user bash# mksquashfs floppylinux root.sqsh -e usr bash# mksquashfs floppylinux/usr usr.sqsh
Nota 1: si può vedere qui l'utilizzo dell'opzione -e per omettere la directory /usr dal file system di root.
Nota 2: non dimenticare di specificare squashfs nel file /etc/fstab del proprio disco di root o negli script di avvio per montare il file system /usr.
Inserire un disco di root nel propria porta floppy da 3.5" (si considera che su questo floppy siano presenti lilo o grub, che vi sia un file system, e che il file system di root SquashFS venga collocato sotto la directory /boot di quest'ultimo):
bash# mount /mnt/floppy bash# cp root.sqsh /mnt/floppy/boot
Fatto ciò, smontare il floppy di root, cambiare floppy disk per /usr ed usare dd per trasferire il relativo file system:
bash# dd if=usr.sqsh of=/dev/fd0
Con SquashFS è possibile comprimere file system di grandi dimensioni, per esempio da utilizzare in Live-CD. A questo scopo SquashFS è anche utilizzato insieme a UnionFS.
Abilitare SquashFS nel kernel Linux del sistema in oggetto
Creare un file system di root compresso
Modificare il file /etc/fstab o gli script di avvio del sistema in oggetto per montare il file system compresso quando necessario.
Se si crea un file system di root a partire da un sistema Linux in esecuzione, utilizzare l'opzione -e di mksquashfs per omettere tutti gli pseudo-filesystem come /proc, /sys (su un kernel linux successivo al rilascio 2.5.x) e /dev (quando si usa DevFS). Inoltre, non dimenticare di aggiungere il file-immagine, che è stato creato con mksquashfs (si suppongono note le ragioni di queste esclusioni).
Come accennato, un altro utilizzo interessante di SquashFS è insieme al file system Unionfs, che fornisce semantica copy-on-write per i file system in sola lettura, migliorando le possibilità . (Per Unionfs si veda http://www.filesystems.org/project-unionfs.html, il sito del progetto)
Per fare un esempio, si potrebbe voler comprimere la propria directory utente (home/user1), per creare una copia compressa dei propri file senza perdere la possibilità di eseguire cambiamenti o scrivere nuovi file.
Creare il file system compresso ro.fs e la directory rw.fs.
bash# mksquashfs /home/user1 ro.fs bash# mkdir /home/rw.fs
Montare il file system compresso ro.fs utilizzando un dispositivo di loopback.
bash# mount -t squashfs ro.fs /mnt -o loop
Montare il file system Unionfs, che rende /mnt e /home/rw.fs apparentemente fusi sotto il punto di mount /home/user1
bash# cd /home bash# mount -t unionfs -o dirs=rw.fs=rw:/mnt=ro unionfs user1
Come si vede, ora è possibile creare nuovi file in /home/user1.
bash# cd /home/user1 bash# touch file1 bash# ls
smontare il file system Unionfs e SquashFS ed elencare il contenuto delle directory /home/user1 e /home/rw.fs.
bash# cd .. bash# umount /home/user1 bash# umount /mnt bash# ls /home/user1 bash# ls /home/rw.fs
Come si nota, il nuovo file1 è stato creato in /home/rw.fs che è il ramo scrivibile del file system unificato.
Quando si voglia aggiungere i nuovi file creati al file system SquashFS stabile e compresso, si potranno accodare a quello esistente.
bash# mksquashfs /home/rw.fs /home/ro.fs
Ora, per montare la directory utente compressa all'avvio del sistema, si può fare come segue:
Far caricare i moduli del kernel squashfs e unionfs all'avvio.
bash# echo squashfs >> /etc/modules bash# echo unionfs >> /etc/modules
Cambiare il proprietario del ramo scrivibile, in modo che corrisponda all'utente.
chown user1 /home/rw.fs
Aggiungere queste righe al file /etc/fstab per montare SquashFS and UnionFS all'avvio.
... /home/ro.fs /mnt squashfs loop 0 0 unionfs /home/user1 unionfs dirs=/home/rw.fs=rw:/mnt=ro 0 0