Nachdem ich einen Seagate Dockstar mit Konsolenzugriff hatte, installierte ich Debian Squeeze darauf. Als Ausgangspunkt für die Ausführung auf schreibgeschütztem Root habe ich diesen hervorragenden Artikel 1 von Jeff Doozan verwendet. Die grundlegende Strategie besteht darin, ein Skript zu erstellen, das bei jedem Start die erforderlichen beschreibbaren Verzeichnisse als tmpfs bereitstellt. Ich zitiere hier das Drehbuch von Jeff 2 (ein großes Lob an 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
Speichern Sie die obigen Zeilen als Skript mit dem Namen / sbin / init-ro auf Ihrem Ziel-Rootfs und machen Sie es ausführbar.
chmod 755 /sbin/init-ro
Um dieses Skript während des Startvorgangs verwenden zu können, müssen Sie die System-Rootfs ein wenig vorbereiten (alle aus Jeffs Skript 2 zitiert ( $ROOT
an den tatsächlichen Speicherort Ihrer gemounteten Rootfs anpassen).
# 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/*
Nachdem Sie die Rootfs wie oben vorbereitet haben, können Sie die Rootfs schreibgeschützt in / etc / fstab einbinden (ersetzen Sie ext2 durch das von Ihnen verwendete Dateisystem oder verwenden Sie stattdessen einfach rootfs ).
/dev/root / ext2 noatime,ro 0 1
Schließlich müssen Sie Folgendes an Ihre Kernel-Parameter anhängen (dh in /boot/cmdline.txt auf Raspi), um das Skript vor dem eigentlichen / sbin / init auszuführen . (Das Folgende ist nur ein Beispiel für Root- und Rootdelay- Parameter. Der wichtige Teil, der an die Zeile in cmdline.txt angehängt werden muss, ist init=/sbin/init-ro
.)
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
Beachten Sie jedoch, dass Sie für jede Software, die Schreibzugriff auf die Rootfs erfordert, die entsprechenden tmpfs-Speicherorte bereitstellen oder in einen externen Speicher schreiben müssen.