Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

My goal is to have a certain directory to be available as tmpfs. There will be some modifications during server uptime in this dir and those modifications must be synced to non-tmpfs persistent dir on HDD over rsync.

After server boot the latest version from non-tmpfs persistent dir must be moved to tmpfs and rsync syncing to be started.

I'm afraid that rsync will erase non-tmpfs backup if tmpfs dir will be empty..

I'm doing it in this way right now:

  1. create tmpfs partition in /etc/fstab
  2. cat /etc/rc.local (pseudocode)

    delete "tmpfs rsync" cronjob from /var/spool/cron/crontabs if there is any

    cp -r /path/to/non-tmpfs-backup /path/to/tmpfs/dir

    append /var/spool/cron/crontabs with "tmpfs rsync" cronjob

What do you think?

share|improve this question
1  
When you need persistent data storage, tmpfs is probably the wrong file system to use. Also see serverfault.com/questions/43383/… –  joschi Jul 17 '10 at 5:57

2 Answers 2

up vote 0 down vote accepted

Create some sort of seed file deep in your non-tmpfs directory and only rsync back to non-tmpfs if it exists (meaning the "boot" copy worked), so something like:

BOOT

mount /path/tmpfs
rsync -aq --delete /path/non-tmpfs/ /path/tmpfs/

CRON

if [ -f /path/tmpfs/some/deep/location/filesgood.txt ]; then
  rsync -aq--delete /path/tmpfs/ /path/non-tmpfs/
fi

It's not perfect but if you enhance that (look for 5 "cookie" files during cron if you want to in different directories, e.g.) it should be pretty safe.

share|improve this answer

I wanted to just comment on troyengel's excellent answer above, but lack the rep on serverfault to do so.

One fix is that there should be a space between -aq and --delete.

Also, I've created a mirroring script that will check for the inited file lock in /tmpfs drive, and mirror from disk to RAM the first run, and from RAM to disk thereafter:

#!/bin/sh
if [ -f /workspace/z/some/deep/location/inited ]; then
  ionice -c2 -n7 nice -n 19 rsync -aq --delete /workspace/* $HOME/workspace 1>/dev/null
else
  ionice -c2 -n0 nice -n 19 rsync -aq --delete $HOME/workspace/* /workspace 1>/dev/null
fi

Note that your lock should be in /z/deep/location so it is always be the last file synced, to prevent data loss.

I've also included nice and ionice parameters so the initial mirroring is high priority, and mirroring from RAM to disk is lower priority.

If you are brave, use -c1 -n7 for realtime initial mirroring, and if you expect frequent idle time, you can use ionice with -c3 and no -n flag to only mirror back when the disk is not in use.

I save this script to /usr/bin/Mirror, and run it every five minutes with cron.

crontab -e

*/5 * * * * /usr/bin/Mirror

This is especially useful if you want to store your working files on an encrypted harddrive, but work on them in RAM.

If you wish to run mirror on system startup and shutdown, you can probably use /etc/inittab

id0:26:once:/usr/bin/Mirror

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.