Now that I’ve got my ALIX system up and running Lenny, it’s time to tweak the configuration. One of the things I liked best about the Voyage distribution is its use of tmpfs for the directories that receive a lot of writes to minimize the IO on the compact flash (CF) card. The reason for doing this is there’s a maximum number of write cycles that can be made to the CF card. Not that I’ve actually worn out a CF card before but I don’t intend to either.
I want to have /tmp
, /var/run
, /var/lock
and /var/log
mounted as tmpfs. There’s a few resources out there that provide scripts and methods for doing this but I’m not a big fan of any of them (see references section below). Debian has almost all of the necessary machinery to perform this task with minimal custom scripting. We’ll be be mucking around in the /etc/init.d
and /etc/rcS
directories but as little as possible.
/var/run and /var/lock
A significant portion of what we want can be achieved using the features of the mountkernfs.sh script. There are two variables called RAMRUN
and RAMLOCK
that control whether or not /var/run
and /var/lock
are mounted as tmpfs respectively. These variables are set in /etc/default/rcS
and the mount points are created in the /etc/init.d/mountkernfs.sh
script if the associated variable is set to “yes”.
There does seem to be a small bug in this script however. It does not import the variables it needs from /etc/defaults/rcS
. I’m pretty sure this is a bug and can be fixed with a very small patch
--- ./mountkernfs.sh.old 2010-01-02 22:32:44.000000000 -0500 +++ ./mountkernfs.sh 2010-01-02 22:33:09.000000000 -0500 @@ -18,6 +18,7 @@ . /lib/init/mount-functions.sh [ -f /etc/default/tmpfs ] && . /etc/default/tmpfs +[ -f /etc/default/rcS ] && . /etc/default/rcS do_start () { #
/tmp and /var/log
After this we’re half way to achieving our goal. It would be nice if the /var/log
directory could be mounted as easily but most people will tell you that having log files reside on non-persistent storage is a very bad idea. If something goes wrong and your system goes down you won’t be able to analyze your log files. This is a very real concern which we will address shortly. First the remaining two mount points need to be mounted through /etc/fstab
with the following two entries:
tmpfs /tmp tmpfs defaults,noexec,nosuid,mode=1777 0 0 tmpfs /var/log tmpfs defaults,noexec,nosuid,nodev,mode=755 0 0
This solves the issue of mounting /tmp
but /var/log
requires a little more work. Debian (and LInux in general I think) expects that some files and directories will exist in the logging directory. To account for this, after the mount scripts run we want to create the necessary file structure. I’ve done this by creating a tar archive of the expected structure and extract it to the newly mounted tmpfs /var/log
directory on each system boot. The following script: logskel.sh.gz does exactly this:
PATH=/sbin:/bin . /lib/init/vars.sh . /lib/lsb/init-functions # get configuration info for this script [ -e /etc/default/log-skel ] && . /etc/default/log-skel case "$1" in start|"") log_begin_msg $@ # select defaults if the configured options don't make sense [[ ! -f $SKEL ]] && SKEL=/lib/init/log-skel.tar.gz [[ ! -d $LOG_DIR ]] && LOG_DIR=/var/log /bin/tar -zxf ${SKEL} -C ${LOG_DIR} 2>&1 > /dev/null log_end_msg $? ;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2 exit 3 ;; stop) # No-op ;; *) echo "Usage: $NAME [start|stop]" >&2 exit 3 ;; esac
You’ll need to put the archive that’s being extracted into /lib/init
or specify a different location through the /etc/default/log-skel
file. I’m using this structure on a system with very few daemons running: log-skel.tar.gz. You may want to build one specific to your systems needs. The above script should be run after all file systems are mounted. On a Lenny system this is done by linking the script to /etc/rcS.d/S36log-skel.sh
Persistent logging of “serious” errors
Finally we still want to log “serious” error messages from syslog to persistent storage so they aren’t lost if the system reboots. This is a single rsyslog rule that can be put in the rsyslog.conf file directly or a separate file in the /etc/rsyslog.d
directory. I chose the latter: persistent.conf
*.err /var/persistent.log
Now cross your fingers and reboot. Any messages you see during boot indicating missing log files can be fixed by adding the file to the template archive we extract in the init script above. After a successful reboot you should be able to see that these four directories are tmpfs mount points by executing the mount
command. This is the full output on my ALIX system.
/dev/hda2 on / type ext2 (rw,errors=remount-ro) tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755) proc on /proc type proc (rw,noexec,nosuid,nodev) sysfs on /sys type sysfs (rw,noexec,nosuid,nodev) varrun on /var/run type tmpfs (rw,nosuid,mode=0755) varlock on /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777) procbususb on /proc/bus/usb type usbfs (rw) udev on /dev type tmpfs (rw,mode=0755) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev) devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620) tmpfs on /tmp type tmpfs (rw,mode=1777) tmpfs on /var/log type tmpfs (rw,noexec,nosuid,nodev,mode=755)
We’re interested in lines 5, 6, 11 and 12. Success!
References
- Gentoo forums discussion on the topic:http://forums.gentoo.org/viewtopic-t-371889-start-0-postdays-0-postorder-asc-highlight-tmpfs.html?sid=11f032f299c91dcefcb1ec5b279851da
- Debian forums adaptation: http://forums.debian.net/viewtopic.php?t=16450
Keep posting stuff like this i really like it
LikeLike
Hey glad you liked the post. I had a lot of fun setting up this ALIX board. Hopefully I’ll get back to cooking up projects like this one after the semester ends.
LikeLike
This is the thing that is complete mystery for my self. So it is really good that we can found so helpful resources like yours.
LikeLike
Good tip. Thanks 😀 With regards to /var/log, what I did was to copy the current /var/log to /var/log.0 and mount /var/log as tmpfs. I rsync -az /var/log.0/* /var/log/ on startup using a custom script and rsync -az –delete-after /var/log/* /var/log.0/ d/var/log during shutdown and it seems to work. The reason was that some packages create additional folders in /var/log at times and its hard to keep track of them.
LikeLike