Es posible usar una capa de sistema de archivos de unión como aufs.
Demostración:
Crear una imagen del sistema de archivos
# 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
...
Montarlo, llenarlo
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
Montarlo como solo lectura
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
Un pequeño sistema de archivos RAM
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
Combina ambos
# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined
Esa opción de montaje para crear una nueva "rama" (br
) apilando /tmp/rammnt
(lectura-escritura) encima de /tmp/imgmnt
(solo lectura). Esta "rama" se hace visible como un sistema de archivos (de lectura y escritura) en /tmp/combined
.
(Consulte la página del manual de aufs(5) para obtener todos los detalles).
Ahora que todo está hecho, esto es lo que tienes:
# 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
Entonces escribe "stop" en el tmpfs
sistema de archivos, no intentan propagarse de nuevo al archivo de imagen montado en bucle.
Podría haber usado un directorio simple (en un sistema de archivos de lectura/escritura), o posiblemente un directorio bajo /dev/shm
si eso funciona para usted, en lugar de crear un tmpfs
específico por eso.
Esta técnica (o variaciones de la misma) es utilizada por alguna distribución LiveCD. La entrada de Wikipedia aufs enumera algunos.
Actualizar:
Parece que hay otras 2 formas más sencillas de hacer esto en Ubuntu (al menos en las versiones posteriores):
-
sudo apt-get install overlayroot
seguido de estableceroverlayroot="tmpfs:swap=1,recurse=0"
en/etc/overlayroot.local.conf
. -
sudo apt-get install fsprotect
seguido de pasarfsprotect
como parámetro del kernel
¡Finalmente descubrí cómo hacer esto con el sistema de archivos raíz (en Ubuntu 11.04)!
Los pasos para hacer que un sistema sea de arranque son simples. Usé esta guía en combinación con esta guía y un montón de búsquedas en la web para descubrir cómo hacer que funcione correctamente, sin errores.
Resumen:
-
Ejecutar:
sudo apt-get install fsprotect apparmor-utils
-
Guarda esto en
/etc/initramfs-tools/scripts/init-bottom/__rootaufs
. No creo que el nombre realmente importe, pero el principio__
podría usarse para realizar pedidos, por lo que si cambia el nombre, es posible que desee mantener los guiones bajos. (Esta es una copia de este archivo).#!/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
-
En
/etc/default/grub
, busque la línea que comienza conGRUB_CMDLINE_LINUX_DEFAULT
, y dentro de las comillas que siguen, agregue el parámetroaufs=tmpfs
.Bonificación: Si necesita apagar de vez en cuando la redirección temporalmente, simplemente elimine este argumento de la lista de parámetros del kernel. Probablemente pueda hacer esto manteniendo presionada la tecla Shift cuando el sistema se está iniciando, para mostrar el menú de GRUB; luego presione e para editar los parámetros, y simplemente borre el
aufs=...
parámetro de la lista. -
Agregue estas líneas a
/etc/sysctl.conf
. (Advertencia :Riesgo potencial de seguridad.)kernel.yama.protected_nonaccess_hardlinks = 0 kernel.yama.protected_sticky_symlinks = 0
-
Ejecute estas líneas:
sudo aa-complain dhclient3 sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs sudo update-initramfs -k all -u sudo update-grub
Si todo salió bien, cuando reinicie, lo hará en un sistema de archivos temporal. La parte de RAM estará en /rw
, y la imagen del disco estará en /ro
, pero por supuesto será de solo lectura.
Sin embargo, si ha arrancado en un sistema temporal pero necesita hacer un cambio permanente, puede volver a montar el /ro
sistema de archivos diciendo
sudo mount -o remount,rw /ro
para que se pueda escribir, y luego puede hacer las modificaciones necesarias en ese directorio.
Sí, por unionfs, consulte unionfs.filesystems.org. Ha montado el primer sistema de archivos de solo lectura y como segundo sistema de archivos RAM de lectura y escritura a través de unionfs.
En Ubuntu puede encontrar el paquete unionfs-fuse, que es otra implementación de las mismas cosas, pero en el espacio del usuario, no como un módulo del kernel.