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
apt-get remove --purge xserver-common lightdm insserv -r x11-common
apt-get autoremove --purge
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 ...
... 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 ...
insserv -r bootlogs insserv -r sudo insserv -r alsa-utils insserv -r console-setup insserv -r fake-hwclock
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
... elevator=deadline rootwait ro
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).