Có được Seagate Dockstar với quyền truy cập bảng điều khiển, tôi đã cài đặt Debian ép lên nó. Là một điểm khởi đầu để làm cho nó chạy trên root chỉ đọc, tôi đã sử dụng bài viết tuyệt vời 1 này của Jeff Doozan. Chiến lược cơ bản liên quan đến việc tạo một tập lệnh, trên mỗi lần khởi động, gắn kết các thư mục có thể ghi cần thiết dưới dạng một tmpfs. Tôi trích dẫn kịch bản của Jeff 2 ở đây (kudos cho 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
Lưu các dòng ở trên dưới dạng tập lệnh có tên / sbin / init-ro trên rootfs đích của bạn và làm cho nó có thể thực thi được.
chmod 755 /sbin/init-ro
Để sử dụng tập lệnh này trong thời gian khởi động, bạn phải chuẩn bị rootfs hệ thống một chút (tất cả được trích dẫn từ tập lệnh 2 của Jeff (thích ứng $ROOT
với vị trí thực tế của rootfs được gắn kết của bạn).
# 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/*
Sau khi đã chuẩn bị rootfs như trên, bạn có thể gắn rootfs chỉ đọc trong / etc / fstab (thay thế ext2 bằng hệ thống tập tin bạn đang sử dụng hoặc chỉ sử dụng rootfs thay thế).
/dev/root / ext2 noatime,ro 0 1
Cuối cùng, bạn phải nối các phần sau vào tham số kernel của mình (ví dụ: trong /boot/cmdline.txt trên Raspi) để chạy tập lệnh trước thực tế / sbin / init . (sau đây chỉ là một ví dụ về các tham số root và rootdelay . phần quan trọng phải được thêm vào dòng trong cmdline.txt là init=/sbin/init-ro
.)
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
Nhưng hãy lưu ý rằng đối với bất kỳ phần mềm nào yêu cầu truy cập ghi trên rootfs, bạn phải gắn các vị trí tmpfs thích hợp hoặc ghi vào bộ nhớ ngoài.