I decided to install Ubuntu 9.04 to my 2GB CF card. I wanted to avoid wearing out the CF with writes, so I settled on this method. I installed the server to one partition, so /usr/local is in the root filesystem. You can create the script anywhere in the root filesystem, but i used /usr/local.
Create a /usr/local/bin/mounttmpfs.sh file with the contents below:
#!/bin/sh
rsync -a /var.perm/ /var/
mount -t tmpfs tmpfs -o mode=1777 /var
rsync -a /var.perm/ /var/
Make a soft link from it to /etc/rcS.d with:
ln –s /usr/local/bin/mounttmpfs.sh /etc/rcS.d/S23mounttmpfs.sh
This will cause it to run right after the filesystems are mounted, before any services which write to /var are running.
Add a cron.hourly script to rsync from /var to /var.perm, and you are all set!
I modified this a bit after the inital post. I changed the mounttmpfs.sh script:
#!/bin/sh
find /var/ -type f -exec rm -f {} \;
mount -t tmpfs tmpfs -o mode=1777 /var
rsync -a /var.perm/ /var/
mount -o relatime /dev/vgraid/lv_squid /var/spool/squid3
The find line is actually only needed once. I just deleted the files from the underlying (flash) filesystems, leaving the directory structure. No need to waste space. After that, I mount the /var manually, then copy the permanent files into it. Finally, since I run squid on this server, I mount the squid cache directories after /var. All the other local filesystems get loaded from the scripts in the /etc/rcS.d directory. I also have an hourly cron job which runs the following:
#!/bin/shrsync --delete-excluded --delete-after --exclude=*.pid \
--exclude=spool/squid3/??/??/* --exclude=cache/apt/archives/*.deb\
-av /var/ /var.perm/
This copies all the directory structure, and most files, from /var to the flash card. I skip the squid cache files, since they take up too much space.