콘솔에 액세스 할 수있는 Seagate Dockstar가있는 데 데비안 스퀴즈를 설치했습니다. 읽기 전용 루트에서 실행하기위한 출발점 으로 Jeff Doozan 의이 훌륭한 기사 1 을 사용했습니다 . 기본 전략에는 매 부팅마다 필요한 쓰기 가능 디렉토리를 tmpfs로 마운트하는 스크립트를 작성하는 것이 포함됩니다. 나는 Jeff 2 의 스크립트를 여기 인용합니다 (Jeff to kudos!)
#!/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
위의 행을 대상 rootfs에 / sbin / init-ro 라는 스크립트로 저장하고 실행 가능하게 만드십시오.
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
마지막으로 실제 / sbin / init 전에 스크립트를 실행하려면 커널 매개 변수 (예 : Raspi의 /boot/cmdline.txt)에 다음을 추가 해야합니다 . (다음은 단지 일례이다 루트 와 rootdelay 파라미터. 상기 라인에 추가되어야하는 중요한 부분 cmdline.txt가 있다 .)init=/sbin/init-ro
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
그러나 rootfs에서 쓰기 액세스가 필요한 소프트웨어의 경우 적절한 tmpfs 위치를 마운트하거나 외부 스토리지에 기록해야합니다.