เมื่อมี Seagate Dockstar ที่มีการเข้าถึงคอนโซลฉันได้ติดตั้ง Debian บีบลงบนมัน ในฐานะที่เป็นจุดเริ่มต้นที่ทำให้รูทแบบอ่านอย่างเดียวฉันใช้บทความที่ยอดเยี่ยมนี้1โดย Jeff Doozan กลยุทธ์พื้นฐานเกี่ยวข้องกับการสร้างสคริปต์ที่ทุก ๆ การบู๊ตเมาท์ไดเร็กทอรีที่สามารถเขียนได้ที่จำเป็นเป็น tmpfs ฉันพูดสคริปต์โดย Jeff 2ที่นี่ (ความรุ่งโรจน์ถึง 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บนรูทเป้าหมายของคุณและทำให้สามารถเรียกใช้งานได้
chmod 755 /sbin/init-ro
ในการใช้สคริปต์นี้ในระหว่างการบู๊ตคุณต้องเตรียมรูทระบบเล็กน้อย (ทั้งหมดอ้างจากสคริปต์ของเจฟฟ์2 (ปรับให้เข้า$ROOT
กับตำแหน่งที่แท้จริงของรูทที่ติดตั้งของคุณ)
# 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
แต่โปรดทราบว่าสำหรับซอฟต์แวร์ใด ๆ ที่ต้องการการเข้าถึงเพื่อเขียนบนรูทคุณต้องติดตั้งตำแหน่ง tmpfs ที่เหมาะสมหรือเขียนไปยังที่จัดเก็บข้อมูลภายนอก