È possibile utilizzare un layer di file system union come aufs.
Demo:
Crea un'immagine del filesystem
# dd if=/dev/zero of=/tmp/image bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.0028428 s, 369 MB/s
# mke2fs /tmp/image
...
Montalo, popolalo
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
Montalo in sola lettura
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
Un piccolo filesystem RAM
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
Combina entrambi
# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined
Quell'opzione di montaggio per creare un nuovo "ramo" (br
) impilando /tmp/rammnt
(lettura-scrittura) sopra /tmp/imgmnt
(sola lettura). Questo "ramo" è reso visibile come filesystem (lettura-scrittura) su /tmp/combined
.
(Vedi la pagina man di aufs(5) per tutti i dettagli.)
Ora tutto ciò che è fatto, ecco cosa hai:
# ls /tmp/combined
hello.txt lost+found
# cat /tmp/combined/hello.txt
hello
# echo bye > /tmp/combined/hello.txt
# cat /tmp/combined/hello.txt
bye
# cat imgmnt/hello.txt
hello
# cat rammnt/hello.txt
bye
Quindi scrive "stop" nel tmpfs
filesystem, non tentano di propagarsi nuovamente al file immagine montato in loop.
Avresti potuto usare una semplice directory (su un filesystem di lettura/scrittura), o possibilmente una directory sotto /dev/shm
se funziona per te, invece di creare uno specifico tmpfs
per questo.
Questa tecnica (o sue varianti) è utilizzata da alcune distribuzioni di LiveCD. La voce Wikipedia aufs ne elenca alcuni.
Aggiornamento:
Sembra che ci siano altri 2 modi più semplici per farlo su Ubuntu (almeno le versioni successive):
-
sudo apt-get install overlayroot
seguito dall'impostazioneoverlayroot="tmpfs:swap=1,recurse=0"
in/etc/overlayroot.local.conf
. -
sudo apt-get install fsprotect
seguito dal superamento difsprotect
come parametro del kernel
Finalmente ho capito come farlo con il filesystem di root (in Ubuntu 11.04)!
I passaggi per rendere avviabile un sistema sono semplici. Ho usato questa guida in combinazione con questa guida e una serie di ricerche sul web per capire come farlo funzionare correttamente, senza bug.
Sommario:
-
Esegui:
sudo apt-get install fsprotect apparmor-utils
-
Salva questo in
/etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Non penso che il nome sia importante, ma l'inizio__
potrebbe essere utilizzato per scopi di ordinamento, quindi se cambi il nome, potresti voler mantenere i caratteri di sottolineatura. (Questa è una copia di questo file.)#!/bin/sh -e case $1 in prereqs) exit 0 ;; esac for x in $(cat /proc/cmdline); do case $x in root=*) ROOTNAME=${x#root=} ;; aufs=*) UNION=${x#aufs=} case $UNION in LABEL=*) UNION="/dev/disk/by-label/${UNION#LABEL=}" ;; UUID=*) UNION="/dev/disk/by-uuid/${UNION#UUID=}" ;; esac ;; esac done if [ -z "$UNION" ]; then exit 0 fi # make the mount points on the init root file system mkdir /aufs /ro /rw # mount read-write file system if [ "$UNION" = "tmpfs" ]; then mount -t tmpfs rw /rw -o noatime,mode=0755 else mount $UNION /rw -o noatime fi # move real root out of the way mount --move ${rootmnt} /ro mount -t aufs aufs /aufs -o noatime,dirs=/rw:/ro=ro # test for mount points on union file system [ -d /aufs/ro ] || mkdir /aufs/ro [ -d /aufs/rw ] || mkdir /aufs/rw mount --move /ro /aufs/ro mount --move /rw /aufs/rw # strip fstab off of root partition grep -v $ROOTNAME /aufs/ro/etc/fstab > /aufs/etc/fstab mount --move /aufs /root exit 0
-
In
/etc/default/grub
, trova la riga che inizia conGRUB_CMDLINE_LINUX_DEFAULT
, e tra le virgolette che seguono, aggiungi il parametroaufs=tmpfs
.Bonus: Se hai bisogno di disattivare occasionalmente il reindirizzamento temporaneamente, è sufficiente rimuovere questo argomento dall'elenco dei parametri del kernel. Probabilmente puoi farlo tenendo premuto il tasto Maiusc durante l'avvio del sistema, per mostrare il menu di GRUB; quindi premi e per modificare i parametri, e basta cancellare il
aufs=...
parametro dall'elenco. -
Aggiungi queste righe a
/etc/sysctl.conf
. (Attenzione :Potenziale rischio per la sicurezza.)kernel.yama.protected_nonaccess_hardlinks = 0 kernel.yama.protected_sticky_symlinks = 0
-
Esegui queste righe:
sudo aa-complain dhclient3 sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs sudo update-initramfs -k all -u sudo update-grub
Se tutto è andato bene, quando riavvierai, lo farai in un file system temporaneo. La parte RAM sarà a /rw
e l'immagine del disco sarà in /ro
, ma ovviamente sarà di sola lettura.
Tuttavia, se hai eseguito l'avvio in un sistema temporaneo ma hai bisogno di apportare modifiche permanenti, puoi rimontare il /ro
file system dicendo
sudo mount -o remount,rw /ro
per renderlo scrivibile, e quindi puoi apportare tutte le modifiche necessarie a quella directory.
Sì, per unionfs, vedi unionfs.filesystems.org. Hai montato il primo filesystem di sola lettura e come secondo filesystem RAM di lettura-scrittura tramite unionfs.
In Ubuntu puoi trovare il pacchetto unionfs-fuse, che è un'altra implementazione delle stesse cose, ma nello spazio utente, non come modulo del kernel.