[comp.sys.next] Avoiding dumping /private/vm/swapfile

sahayman@iuvax.cs.indiana.edu (Steve Hayman) (08/11/90)

The man page for 'dump' suggests 
    ... Dump should have some file that it consults that contain
    inode numbers, names of files and directories, ... to not dump
    to OD/Tape.  This feature would come in especially handy
    to avoid dumping /private/vm/swapfile ... System administrators
    can get around this by writing a program that changes the
    modification time for the swapfile inode.


You may find that your 22 Mb incremental dumps consist mainly 
of a 21 Mb /private/vm/swapfile, so there is good reason to 
avoid dumping this file if you can.

Resetting the modification time on the swapfile inode is easy
enough with 'utime()' (write a C program to call utimes(), or
use  perl -e 'utime 0, 0, "/private/vm/swapfile";'  ) but this
has the side-effect of changing the inode ctime to 'now', and dump checks
both the mtime and ctime when deciding whether to dump a file.
So your swapfile is dumped even if you did reset the 'mtime'.

You need a way to reset both the mtime and the ctime to some
ancient value.  Unix provides no way that I can see to set the
ctime directly.  I considered writing a program to open the
raw disk file, find the inode, and reset the atime/ctime/mtime
to 0, but this rapidly became very ugly (and besides, I couldn't
get it to work :-).

The only quick solution I could think of is the following
little hack, "zerotime".  Warning.  Use at your own risk.
This program

	a) notes the current system time
	b) sets the system time to 0  (for a very brief period)
	c) calls 'utimes()' to set the access and modification time
	   of the desired file to 0; this has the side effect of
	   updating the inode's inode-change time (ctime)
	   to the current time, which we just set to 0;
	d) resets the system time to the time noted in 'a'.


So I put "zerotime /private/vm/swapfile" in my dump script, and
I no longer do incremental dumps of that file, and my incrementals
are much smaller.

I really don't like the idea of tinkering with the system clock like this.
If anybody has a better way to do this, please let me know; if you want
to live dangerously, feel free to use this program.

..Steve

--- cut here ---
/*
 * zerotime file ...
 * reset atime, mtime *AND* ctime to 0 for a file 
 * we are sneaky. we briefly set the time of day to 0, and then
 * call utime, then set the time of day back.
 *
 * The idea is that you put  'zerotime /private/vm/swapfile' in
 * your dump script, to avoid dumping that file.
 *
 * We really shouldn't be tinkering with the clock like this.
 *
 * Steve Hayman
 * sahayman@iuvax.cs.indiana.edu
 * 1990 08 09
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>

main(argc, argv)
int argc;
char **argv;
{
    while ( --argc ) {
	zero_time(*++argv);
    }
    exit(0);
}


zero_time ( fname )
char *fname;
{
    struct timeval now;
    struct timezone tz;
    struct timeval zero[2];


    zero[0].tv_sec = zero[0].tv_usec = zero[1].tv_sec = zero[2].tv_usec = 0;

    /*
     * note current system time; set it to 0 (briefly)
     */
    gettimeofday(&now, &tz);
    settimeofday(zero, &tz);

    /*
     * set file atime/mtime to 0
     */

    utimes(fname, zero);

    /*
     * reset system time
     */

    settimeofday(&now, &tz);
}