Risposte:
È possibile usare uno strato di filesystem union come aufs .
demo:
# 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
...
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined
Quell'opzione di mount per creare un nuovo "branch" ( br
) impilando /tmp/rammnt
(read-write) sopra /tmp/imgmnt
(sola lettura). Questo "ramo" è reso visibile come file system (lettura-scrittura) su /tmp/combined
.
(Vedi la pagina man 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 le scritture "si fermano" nel tmpfs
filesystem, non tentano di propagarsi al file di immagine montato in loop.
Avresti potuto usare una semplice directory (su un filesystem di lettura / scrittura), o eventualmente una directory sotto /dev/shm
se funzionasse per te, invece di crearne una specifica tmpfs
.
Questa tecnica (o sue varianti) è utilizzata da alcuni LiveCD di distribuzione. La voce di Wikipedia aufs ne elenca alcune.
/
, credo che stai meglio con un initrd (credo sia così per i livecd). Potresti essere in grado di farlo da uno script di init, anche se sembra complicato.
Sembra che ci siano altri 2 modi più semplici per farlo su Ubuntu (almeno le versioni successive):
I passaggi per rendere avviabile un sistema sono semplici. Ho usato questa guida in combinazione con questa guida e un sacco di ricerche sul web per capire come farlo funzionare correttamente, senza bug.
Sommario:
Correre:
sudo apt-get install fsprotect apparmor-utils
Salva questo in /etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Non penso che il nome contenga davvero, ma l'inizio __
potrebbe essere usato per scopi di ordinazione, 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 con GRUB_CMDLINE_LINUX_DEFAULT
e all'interno delle virgolette che seguono, aggiungi il parametro aufs=tmpfs
.
Bonus: Se hai bisogno di disabilitare temporaneamente il reindirizzamento, rimuovi semplicemente questo argomento dalla lista dei parametri del kernel. Probabilmente puoi farlo tenendo premuto il tasto Maiusc durante l'avvio del sistema, per mostrare il menu di GRUB; quindi premere e per modificare i parametri e cancellare il aufs=...
parametro dall'elenco.
Aggiungi queste righe a /etc/sysctl.conf
. ( Avvertenza : potenziale rischio per la sicurezza.)
kernel.yama.protected_nonaccess_hardlinks = 0
kernel.yama.protected_sticky_symlinks = 0
Esegui queste linee:
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, al riavvio, lo farai in un file system temporaneo. La parte RAM sarà a /rw
, e l'immagine del disco sarà a /ro
, ma ovviamente sarà di sola lettura.
Tuttavia, se è stato avviato un sistema temporaneo ma è necessario apportare una modifica permanente, è possibile reinstallare il /ro
file system dicendo
sudo mount -o remount,rw /ro
per renderlo scrivibile e quindi è possibile apportare qualsiasi modifica necessaria a quella directory.
Sì, da unionfs, vedi unionfs.filesystems.org . È necessario montare 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 un modulo kernel.
Puoi anche farlo a livello di dispositivo, senza un sindacato come aufs. Vedi Device Mapper snapshot-origin
.
fstab
, in modo che il mount point sia/
? (cioè il sistema si avvia da un'immagine scartabile, praticamente.)