4. Creare ed utilizzare file system compressi

4.1. Passi base

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

4.2. Compressione dei file system

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.

4.2.1. Esempio 1

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

4.2.2. Esempio 2

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

4.3. Creazione di sistemi mininimali/integrati

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).

4.3.1. File system SquashFS su floppy/flash/hard disk

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:

  1. 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.

  2. Utilizzare mksquashfs per creare ram disk iniziali in sola lettura o altri file system.

  3. 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

4.3.2. File system compressi su CD-ROM

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.

  1. Abilitare SquashFS nel kernel Linux del sistema in oggetto

  2. Creare un file system di root compresso

  3. 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).

4.4. Rendere il file system scrivibile

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