| ############ |
| # xfscrash # crash testing setup for XFS |
| ############ |
| |
| *** disclaimers *** |
| |
| work-in-progress, buyer-beware, your-mileage-may-vary, this-is-a-hack |
| |
| *** what xfscrash does *** |
| |
| xfscrash allows realistic testing of XFS log recovery and XFS check/repair |
| by generating log activity on an XFS partition, then rebooting the machine |
| at a random point. When the machine comes back up, xfscrash is restarted |
| and then tests either the log recovery or xfs_repair on the dirtied |
| filesystem. All going well the process continues. |
| |
| *** getting ready for crash testing *** |
| |
| Most filesystems (ext2 included) can't withstand having the machine |
| they're running on rebooted while they're active. So the crash test |
| machine needs to have all filesystems other than the test FS mounted |
| read-only so they won't get trashed when the machine reboots. |
| |
| *** mouting FSes read-only *** |
| |
| Following is a recipe for making a redhat linux (6.2) machine with a single |
| ext2 FS mounted on root able to be booted read-only. Your Mileage May |
| Vary - don't try this on an important machine. |
| |
| The idea is to move anything that needs to be r/w into the /initrd_init |
| directory, replacing the moved directories with links to the moved ones. |
| That way the /initrd_init directory may be copied to a ramdisk, and |
| mounted over /initrd on the root FS which never gets remounted r/w. |
| |
| # go to single user |
| init 1 |
| |
| # make a mount point for the ramdisk |
| mkdir /initrd |
| |
| # link across to the /initrd_init directory for when |
| # the ramdisk isn't mounted |
| ln -s /initrd_init/dev . |
| ln -s /initrd_init/etc . |
| ln -s /initrd_init/proc . |
| ln -s /initrd_init/sbin . |
| ln -s /initrd_init/tmp . |
| ln -s /initrd_init/var . |
| |
| # make the /initrd_init directory |
| mkdir /initrd_init |
| cd /initrd_init |
| |
| |
| # move /dev |
| mv /dev . |
| ln -s /dev /initrd/dev |
| |
| # move /etc |
| mv /etc . |
| ln -s /etc /initrd/etc |
| |
| # make proc mount |
| mkdir proc |
| |
| # move /tmp |
| mkdir tmp |
| rm -rf /tmp |
| ln -s /tmp /initrd/tmp |
| |
| # link /sbin |
| ln -s /sbin . |
| |
| # setup a tree for parts of /var |
| mkdir var var/cache var/lock var/lock/console var/lock/subsys |
| mkdir var/log var/preserve var/run |
| |
| touch /var/run/utmp /var/log/utmp /var/log/wtmp |
| |
| # move parts of /var |
| rm -rf /var/cache /var/lock /var/log /var/preserve /var/run |
| ln -s /initrd/var/cache /var/cache |
| ln -s /initrd/var/lock /var/lock |
| ln -s /initrd/var/log /var/log |
| ln -s /initrd/var/preserve /var/preserve |
| ln -s /initrd/var/run /var/run |
| |
| # make a mount for /var/shm |
| mkdir var/shm |
| ln -s /var/shm /initrd/var/shm |
| |
| # move /var/spool |
| mkdir var/spool |
| mkdir var/spool/mail var/spool/anacron var/spool/at var/spool/lpd |
| mkdir var/spool/rwho var/spool/mqueue var/spool/cron |
| rm -rf /var/spool |
| ln -s /var/spool /initrd/var/spool |
| |
| # move /var/tmp |
| mkdir var/tmp |
| rm -rf /var/tmp |
| ln -s /var/tmp /initrd/var/tmp |
| |
| # trim /dev - too many inodes here - remove anything you don't need |
| # (small ramdisk has a small number of inodes) |
| rm -rf /initrd/dev/<....> |
| |
| All going well, all the directories you've made should link through |
| /initrd and into /initrd_init, and the machine should come back up |
| if you restart it. |
| |
| You want to keep the contents of /initrd_init to a minimum because |
| this stuff has to fit into the ramdisk. |
| |
| *** getting the ramdisk going *** |
| |
| See the rc.sysinit file for some details of what to do to get the |
| ro-root/ramdisk up and running. |
| |
| Once everything is going, the root FS should never be remounted to |
| r/w on boot and should be in r/o mode when the machine comes up. |
| |
| All going well, any open files have been redirected through the |
| symlinks onto the ramdisk, so you should be able to remount the |
| root FS to r/w and then remount it back to r/o. |
| |
| Since there's no r/w filesystems mounted, it should be ok to |
| reboot the machine with 'reboot -fn' and everything should come |
| back without dirty filesystems and without having to fsck. |
| |
| *** starting xfscrash *** |
| |
| The simplest way to restart xfscrash on reboot is to start it |
| in the background from rc.local. The script logs to /dev/tty1, |
| /dev/console & a logfile by default, so the output should be |
| easy to find. |
| |
| Link the xfscrash directory off an NFS mounted FS so you can make |
| changes while the machine is rebooting and so you can touch the |
| 'stop' and 'start' control files. |
| |
| To configure the system, change the parameters in the configuration |
| section of the 'xfscrash' script. |
| |
| To start the system, touch the 'start' control file and then either |
| reboot or manually run the 'xfscrash' script. |
| |
| To stop the system, touch the 'stop' control file and wait for the |
| next cycle to start when the control file will be checked and |
| the test terminated. |
| |