कंसोल एक्सेस के साथ सीगेट डॉकस्टार होने के बाद, मैंने इस पर डेबियन निचोड़ स्थापित किया। इसे रीड-ओनली रूट पर चलाने के लिए एक शुरुआती बिंदु के रूप में, मैंने जेफ डोजान द्वारा इस उत्कृष्ट लेख 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 के रूप में सहेजें और इसे निष्पादन योग्य बनाएं।
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/*
ऊपर की तरह तैयार किए गए रूटफुट होने के बाद, आप रूट-रीड्स को केवल / etc / fstab पर माउंट कर सकते हैं ( आपके द्वारा उपयोग किए जा रहे फाइलसिस्टम के साथ ext2 को प्रतिस्थापित करें या इसके बजाय रूटफ्स का उपयोग करें )।
/dev/root / ext2 noatime,ro 0 1
अंत में, आपको वास्तविक / sbin / init से पहले स्क्रिप्ट को चलाने के लिए निम्नलिखित को अपने कर्नेल पैरामीटर (जैसे / Rooti पर / inboot/cmdline.txt) में जोड़ना होगा । (निम्नलिखित बस का एक उदाहरण है जड़ और rootdelay पैरामीटर है कि लाइन में संलग्न किया करने के लिए महत्वपूर्ण हिस्सा। cmdline.txt है ।)init=/sbin/init-ro
root=/dev/mmcblk0p2 rootdelay=2 init=/sbin/init-ro
लेकिन इस बात से अवगत रहें कि किसी भी सॉफ़्टवेयर के लिए रूटफ़्स पर राइट-ऐक्सेस की आवश्यकता होती है, जिसके लिए आपको उपयुक्त tmpfs स्थानों को माउंट करना होगा या बाहरी स्टोरेज को लिखना होगा।