SUMMARY: faster full restore?

From: Rich Schultz (
Date: Wed Feb 17 1993 - 04:41:37 CST

Original request:

> I have heard that Backup Copilot includes a version of restore that can do
> a full restore faster than the stock restore, by telling the kernel not to
> do synchronous writes of filesystem metadata. I don't have Backup
> Copilot, but I am running 4.1.3, which includes all the kernel support for
> Backup Copilot, so in theory I should be able to turn on this feature with
> some system call and save myself some time restoring a large disk. Does
> anyone know how?


Yes, you can do it. Several people, including the original author, sent me a
program to turn the feature on and off. It was previously posted to
comp.sys.sun.admin, apparently when my back was turned.

Many thanks to:

    Casper Dik <>
    Postmaster <>
    Christopher Davis <>
    Peter Gray <>

Rich Schultz

 * Written by Peter Gray, University of Wollongong
 * This programs turns on/off delayed I/O on a filesystem.
 * Usage: fastfs filesystem fast|slow|status
 * Note that it is intended for use with restore(8)
 * to speed up full filesystem restores. Remember
 * that if a filesystem is running with delayed I/O
 * enabled when the system crashes it can result in
 * the fsck being unable to "fix" the filesystem on reboot
 * without manual intervention.
 * Typical use is
 * fastfs /home fast
 * cd /home; restore rf /dev/rst5
 * fastfs /home slow
 * The above gives about a 500% increase in the speed of
 * the restore.
 * Its also good for /tmp giving most of the benefits of tmpfs
 * without the problems.
 * In rc.local
 * fastfs /tmp fast
 * but you may need to add fsck -y /tmp into /etc/rc.boot
 * before the real fsck to ensure the machine always boots
 * (I have not done this yet).

#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <sys/filio.h>
#include <errno.h>
#include <string.h>

extern char *sys_errlist[];

main(argc, argv)
int argc;
char **argv;
        int fd;
        int flag;
        if (geteuid() != 0)
                fprintf(stderr,"%s: Must run as root.\n", argv[0]);

        if (argc != 3)
                fprintf(stderr,"Usage: %s path {fast|slow|status}\n",argv[0]);
        if ((fd = open(argv[1], O_RDONLY)) < 0)
                fprintf(stderr,"%s: Unable to open \"%s\"\n%s\n", argv[0], argv[1], sys_errlist[errno]);
        if (!strcasecmp(argv[2], "status"))
                if (ioctl(fd, FIODIOS, &flag) != 0)
                        fprintf(stderr,"%s: ioctl failed%s\n", argv[0], sys_errlist[errno]);
                if (flag == 0) printf("%s is slow.\n", argv[1]);
                else printf("%s is fast\n", argv[1]);
        flag = (strcasecmp(argv[2], "fast") == 0) ? 1 : 0;
        if (ioctl(fd, FIODIO, &flag) != 0)
                fprintf(stderr,"%s: ioctl failed\n%s\n", argv[0], sys_errlist[errno]);
        printf("%s is now %s\n",argv[1], flag ? "fast" : "slow");


This archive was generated by hypermail 2.1.2 : Fri Sep 28 2001 - 23:07:29 CDT