Ayant eu un Seagate Dockstar avec accès à la console, j'ai installé Debian squeeze dessus. Comme point de départ pour le faire fonctionner en lecture seule, j'ai utilisé cet excellent article 1 par Jeff Doozan. La stratégie de base consiste à créer un script qui, à chaque démarrage, monte les répertoires nécessaires en écriture comme un tmpfs. Je cite le script de Jeff 2 ici (bravo à 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
Sauvegarder les lignes ci-dessus comme un script appelé /sbin/init-ro sur votre rootfs cible et le rendre exécutable.
chmod 755 /sbin/init-ro
Afin d'utiliser ce script pendant le démarrage, vous devez préparer un peu le système rootfs (tout est cité à partir du script de Jeff). 2 (adapter $ROOT
à l'emplacement réel de votre rootfs monté).
# 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/*
Après avoir préparé le rootfs comme ci-dessus, vous pouvez monter le rootfs en lecture seule dans /etc/fstab (remplacez ext2 avec le système de fichiers que vous utilisez ou utilisez simplement rootfs à la place).
/dev/root / ext2 noatime,ro 0 1
Enfin, vous devez ajouter ce qui suit à vos paramètres de noyau (c'est-à-dire dans /boot/cmdline.txt sur Raspi) afin d'exécuter le script avant l'exécution proprement dite. /sbin/init . (ce qui suit n'est qu'un exemple de racine et délai d'enracinement La partie importante qui doit être annexée à la ligne dans les paramètres de l'entreprise. cmdline.txt es init=/sbin/init-ro
.)
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
Mais soyez conscient que pour tout logiciel nécessitant un accès en écriture sur le rootfs, vous devez monter les emplacements tmpfs appropriés ou écrire sur un stockage externe.