Avendo avuto un Seagate Dockstar con accesso alla console, ho installato Debian squeeze su di esso. Come punto di partenza per farlo funzionare su root di sola lettura, ho usato questo eccellente articolo 1 di Jeff Doozan. La strategia di base prevede la creazione di uno script che, ad ogni avvio, monta le directory scrivibili necessarie come tmpfs. Cito la sceneggiatura di Jeff 2 qui (complimenti 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
Salvare le righe sopra come uno script chiamato / sbin / init-ro sui rootfs di destinazione e renderlo eseguibile.
chmod 755 /sbin/init-ro
Per utilizzare questo script durante l'avvio, è necessario preparare un po 'i rootfs di sistema (tutti citati dallo script 2 di Jeff (adattarsi $ROOT
alla posizione effettiva dei rootfs montati).
# 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/*
Dopo aver preparato i rootfs come sopra, puoi montare i rootfs in sola lettura in / etc / fstab (sostituisci ext2 con il filesystem che stai usando o usa invece rootfs ).
/dev/root / ext2 noatime,ro 0 1
Infine, devi aggiungere quanto segue ai parametri del tuo kernel (cioè in /boot/cmdline.txt su Raspi) per eseguire lo script prima dell'effettivo / sbin / init . (il seguente è solo un esempio di parametri root e rootdelay . la parte importante che deve essere aggiunta alla riga in cmdline.txt è init=/sbin/init-ro
.)
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
Tuttavia, tenere presente che per qualsiasi software che richiede l'accesso in scrittura sui rootfs è necessario montare le posizioni tmpfs appropriate o scrivere su un archivio esterno.