コンソールアクセスが可能なSeagate Dockstarがあったので、Debian squeezeをインストールしました。読み取り専用ルートで実行するための出発点として、私はJeff Doozanによるこの優れた記事1を使用しました。基本的な戦略には、ブートごとに、必要な書き込み可能なディレクトリをtmpfsとしてマウントするスクリプトの作成が含まれます。ここでJeff 2のスクリプトを引用します(Keffs to 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
上記の行を/ sbin / init-roというスクリプトとしてターゲットrootfsに保存し、実行可能にします。
chmod 755 /sbin/init-ro
起動時にこのスクリプトを使用するには、システムのrootfsを少し準備する必要があります(すべてJeffのスクリプト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を準備したら、/ etc / fstabにrootfsを読み取り専用でマウントします(ext2を使用しているファイルシステムに置き換えるか、代わりにrootfsを使用します)。
/dev/root / ext2 noatime,ro 0 1
最後に、あなたのカーネルパラメータ(すなわち内に以下を追加する必要があり/boot/cmdline.txt実際の前にスクリプトを実行するためにRaspi上)/ sbinの/ initを。(以下は一例であり、ルートとにrootdelayパラメータ。のラインに追加されなければならない重要な部分cmdline.txtがありますinit=/sbin/init-ro
。)
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
ただし、rootfsへの書き込みアクセスが必要なソフトウェアでは、適切なtmpfsの場所をマウントするか、外部ストレージに書き込む必要があることに注意してください。