Имея Seagate Dockstar с консольным доступом, я установил на нее Debian squeeze. В качестве отправной точки, чтобы заставить его работать на root только для чтения, я использовал эту прекрасную статью 1 Джеффа Дузана. Основная стратегия включает в себя создание сценария, который при каждой загрузке монтирует необходимые директории для записи в виде tmpfs. Я цитирую сценарий Джеффа 2 здесь (слава Джеффу!)
#!/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
Сохраните строки выше как скрипт с именем /sbin/init-ro на целевых rootfs и сделайте его исполняемым.
chmod 755 /sbin/init-ro
Чтобы использовать этот сценарий во время загрузки, вам нужно немного подготовить системные rootfs (все цитируются из сценария Джеффа 2 (адаптировать $ROOT
к фактическому расположению ваших смонтированных rootfs).
# 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/*
После того, как rootfs подготовлены, как описано выше, вы можете смонтировать rootfs только для чтения в /etc /fstab (замените ext2 той файловой системой, которую вы используете, или просто используйте вместо нее rootfs ).
/dev/root / ext2 noatime,ro 0 1
Наконец, вы должны добавить следующее к параметрам вашего ядра (то есть в /boot/cmdline.txt в Raspi), чтобы запустить скрипт до фактического /sbin/init. (Ниже приведен только пример параметров root и rootdelay. Важная часть, которую необходимо добавить к строке в cmdline.txt, - это init=/sbin/init-ro
.)
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
Но имейте в виду, что для любого программного обеспечения, требующего доступа для записи в rootfs, вы должны смонтировать соответствующие местоположения tmpfs или выполнить запись во внешнее хранилище.