In embedded applications it is often a requirement, that the device must be able to sustain a power cycle almost any time.
Unfortunately this is not something which modern operating systems (including GNU/Linux) like very much.
Fortunately in Linux there are workarounds. While there are specialized filesystems like f2fs, the most simple approach is still to just run the OS from a read-only root filesystem.
So here is the solution I made for my brewing hardware.
We bootup our fresh raspbian image install available at http://downloads.raspberrypi.org.
On the HDMI console expand the filesystem and setup i18n (german keyboard in my case).
All steps starting from here can now be done via ssh as well as the HDMI console.
- Remove some stuff which is not needed or unsuitable for readonly operation:
apt-get remove --purge wolfram-engine triggerhappy
apt-get remove --purge cron anacron logrotate dbus dphys-swapfile
Remove X-Server and related stuff:
apt-get remove --purge xserver-common lightdm
insserv -r x11-common
auto-remove some X11 related libs
apt-get autoremove --purge
Install busybox syslog instead of rsyslog
The reason for doing this is because we do not want logfiles, but we want to be able to do some debugging (read logfiles). busybox-syslogd does not write logfiles but logs to a ring-buffer in memory which can be displayed using the logread command:
apt-get install busybox-syslogd
dpkg --purge rsyslog
The following steps are important, because we do not want any filesystem checks on our headless system at all!
- Comment do_start in /etc/init.d/checkroot.sh
- Comment do_start in /etc/init.d/checkfs.sh
...
case "$1" in
start|"")
#do_start
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
# No-op
;;
*)
echo "Usage: checkfs.sh [start|stop]" >&2
exit 3
;;
esac
...
Comment Operations in /etc/init.d/checkroot-bootclean.sh
...
case "$1" in
start|"")
# Clean /tmp, /lib/init/rw, /run and /run/lock. Remove the
# .clean files to force initial cleaning. This is intended
# to
# allow cleaning of directories masked by mounts while the
# system was previously running, which would otherwise
# prevent
# them being cleaned.
#rm -f /tmp/.clean /lib/init/rw/.clean /run/.clean /run/lock/.clean
#clean_all
exit $?
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
# No-op
;;
*)
echo "Usage: checkroot-bootclean.sh [start|stop]" >&2
exit 3
;;
esac
...
Comment swaponagain ’swapfile‘ in /etc/init.d/mountall.sh
Remove a couple of startup scripts:
insserv -r bootlogs
insserv -r sudo
insserv -r alsa-utils
insserv -r console-setup
insserv -r fake-hwclock
Change /etc/fstab as follows:
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults,ro 0 2
/dev/mmcblk0p2 / ext4 defaults,ro 0 1
tmpfs /tmp tmpfs defaults 0 0
append ro in /boot/cmdline.txt:
... elevator=deadline rootwait ro
Make dhclient write its leases file to /tmp instead of /var/lib/dhcp/:
rm -rf /var/lib/dhcp/
ln -s /tmp /var/lib/dhcp
That’s it, have fun with your read-only Raspbian. As far as my brewing software is concerned, there is automated remount-rw/ro support included (see sample configfile).
Neueste Kommentare