Habiendo tenido un Seagate Dockstar con acceso a la consola, instalé Debian squeeze en él. Como punto de partida para que se ejecute en la raíz de solo lectura, utilicé este excelente artículo 1 de Jeff Doozan. La estrategia básica consiste en crear un script que, en cada arranque, monte los directorios de escritura necesarios como tmpfs. Cito el guión de Jeff 2 aquí (¡felicitaciones a Jeff!)
#!/bin/bash
DIRS="/tmp /var/log /var/run /var/lock /var/tmp /var/lib/urandom /var/lib/dhcp /etc/network/run"
for DIR in $DIRS; do
echo "Mounting $DIR as tmpfs"
mount -n -t tmpfs tmpfs $DIR
if [ -d "$DIR-saved" ]; then
echo "Restoring $DIR-saved to $DIR"
tar -C "$DIR-saved" -cf - ./ | tar -C "$DIR" -xpf -
fi
done
echo "nameserver 4.2.2.1" > /var/tmp/resolv.conf
touch /var/lib/dhcp/dhcpd.leases
exec /sbin/init
Guarde las líneas anteriores como un script llamado / sbin / init-ro en su rootfs objetivo y hágalo ejecutable.
chmod 755 /sbin/init-ro
Para usar este script durante el arranque, debe preparar un poco los rootfs del sistema (todo citado del script 2 de Jeff (adaptarse $ROOT
a la ubicación real de sus rootfs montados).
# Configure dhcp-client to write resolv.conf to /tmp instead of /etc
sed -i 's/\/etc\/resolv.conf/\/var\/tmp\/resolv.conf/' $ROOT/sbin/dhclient-script > /dev/null 2>&1
rm $ROOT/etc/resolv.conf
ln -s /var/tmp/resolv.conf $ROOT/etc/resolv.conf
# make /etc/network/run/ a symlink to /tmp/network/
rm -rf $ROOT/etc/network/run
ln -s /var/tmp/network $ROOT/etc/network/run
# Fixes from http://wiki.debian.org/ReadonlyRoot
rm $ROOT/etc/blkid.tab > /dev/null 2>&1
ln -s /dev/null $ROOT/etc/blkid.tab
rm $ROOT/etc/mtab > /dev/null 2>&1
ln -s /proc/mounts $ROOT/etc/mtab
rm $ROOT/etc/rcS.d/S12udev-mtab
rm -rf $ROOT/var/log/*
Después de tener los rootfs preparados como anteriormente, puede montar los rootfs de solo lectura en / etc / fstab (reemplace ext2 con el sistema de archivos que está usando o simplemente use rootfs en su lugar).
/dev/root / ext2 noatime,ro 0 1
Finalmente, debe agregar lo siguiente a los parámetros de su núcleo (es decir, en /boot/cmdline.txt en Raspi) para ejecutar el script antes del actual / sbin / init . (el siguiente es solo un ejemplo de los parámetros root y rootdelay . la parte importante que debe agregarse a la línea en cmdline.txt es init=/sbin/init-ro
).
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
Pero tenga en cuenta que para cualquier software que requiera acceso de escritura en los rootfs, debe montar las ubicaciones tmpfs apropiadas o escribir en el almacenamiento externo.