These are policy-driven snapshot management and replication tools which use OpenZFS for underlying next-gen storage. (Btrfs support plans are shelved unless and until btrfs becomes reliable.)
Go to file
jimsalterjrs 368a9fe78e default to not manually specifying an SSH cipher 2017-11-08 11:02:39 -05:00
debian me as maintainer, zfs | zfsutils-linux deps 2017-11-08 10:12:41 -05:00
CHANGELIST change die to warn when sanoid can't remove a snap 2017-09-14 09:58:03 -04:00
FREEBSD.readme 1.4.7 - whoops, forgot to git add FREEBSD.readme 2016-06-13 11:48:57 -04:00
INSTALL Update INSTALL 2017-10-04 12:11:24 -05:00
LICENSE Initial commit 2014-11-17 09:34:31 -05:00
README.md Updated readme as appropriate 2017-10-12 14:55:17 +01:00
VERSION change die to warn when sanoid can't remove a snap 2017-09-14 09:58:03 -04:00
findoid 1.4.7 reverted shebangs to Linux style, added -F to zfs receive, dyked out set readonly behavior to mitigate upstream bugs in mount/unmount 2016-06-13 11:42:17 -04:00
sanoid Fix warning when cache file doesn't exist 2017-10-16 10:24:24 +01:00
sanoid.conf add "ignore" template 2017-08-09 12:24:37 -04:00
sanoid.defaults.conf Remove semicolons from defaults file 2017-10-03 14:23:29 +01:00
sanoid.spec Update rpm changelog 2017-08-31 12:23:18 +01:00
sleepymutex 1.4.5 changed shebang to '#!/usr/bin/env perl' for enhanced FreeBSD compatibility 2016-05-23 12:35:11 -04:00
syncoid default to not manually specifying an SSH cipher 2017-11-08 11:02:39 -05:00

README.md

sanoid logo

Sanoid is a policy-driven snapshot management tool for ZFS filesystems. When combined with the Linux KVM hypervisor, you can use it to make your systems functionally immortal.

sanoid rollback demo
(Real time demo: rolling back a full-scale cryptomalware infection in seconds!)

More prosaically, you can use Sanoid to create, automatically thin, and monitor snapshots and pool health from a single eminently human-readable TOML config file at /etc/sanoid/sanoid.conf. (Sanoid also requires a "defaults" file located at /etc/sanoid/sanoid.defaults.conf, which is not user-editable.) A typical Sanoid system would have a single cron job:

* * * * * /usr/local/bin/sanoid --cron

And its /etc/sanoid/sanoid.conf might look something like this:

[data/home]
	use_template = production
[data/images]
	use_template = production
	recursive = yes
	process_children_only = yes
[data/images/win7]
	hourly = 4

#############################
# templates below this line #
#############################

[template_production]
        hourly = 36
        daily = 30
        monthly = 3
        yearly = 0
        autosnap = yes
        autoprune = yes

Which would be enough to tell sanoid to take and keep 36 hourly snapshots, 30 dailies, 3 monthlies, and no yearlies for all datasets under data/images (but not data/images itself, since process_children_only is set). Except in the case of data/images/win7-spice, which follows the same template (since it's a child of data/images) but only keeps 4 hourlies for whatever reason.

Sanoid Command Line Options
  • --cron

    This will process your sanoid.conf file, create snapshots, then purge expired ones.

  • --configdir

    Specify a location for the config file named sanoid.conf. Defaults to /etc/sanoid

  • --take-snapshots

    This will process your sanoid.conf file, create snapshots, but it will NOT purge expired ones. (Note that snapshots taken are atomic in an individual dataset context, not a global context - snapshots of pool/dataset1 and pool/dataset2 will each be internally consistent and atomic, but one may be a few filesystem transactions "newer" than the other.)

  • --prune-snapshots

    This will process your sanoid.conf file, it will NOT create snapshots, but it will purge expired ones.

  • --monitor-snapshots

    This option is designed to be run by a Nagios monitoring system. It reports on the health of your snapshots.

  • --monitor-health

    This option is designed to be run by a Nagios monitoring system. It reports on the health of the zpool your filesystems are on. It only monitors filesystems that are configured in the sanoid.conf file.

  • --force-update

    This clears out sanoid's zfs snapshot listing cache. This is normally not needed.

  • --version

    This prints the version number, and exits.

  • --quiet

    Supress non-error output.

  • --verbose

    This prints additional information during the sanoid run.

  • --debug

    This prints out quite alot of additional information during a sanoid run, and is normally not needed.


Syncoid

Sanoid also includes a replication tool, syncoid, which facilitates the asynchronous incremental replication of ZFS filesystems. A typical syncoid command might look like this:

syncoid data/images/vm backup/images/vm

Which would replicate the specified ZFS filesystem (aka dataset) from the data pool to the backup pool on the local system, or

syncoid data/images/vm root@remotehost:backup/images/vm

Which would push-replicate the specified ZFS filesystem from the local host to remotehost over an SSH tunnel, or

syncoid root@remotehost:data/images/vm backup/images/vm

Which would pull-replicate the filesystem from the remote host to the local system over an SSH tunnel.

Syncoid supports recursive replication (replication of a dataset and all its child datasets) and uses mbuffer buffering, lzop compression, and pv progress bars if the utilities are available on the systems used.

Syncoid Command Line Options
  • [source]

    This is the source dataset. It can be either local or remote.

  • [destination]

    This is the destination dataset. It can be either local or remote.

  • -r --recursive

    This will also transfer child datasets.

  • --compress

    Currently accepted options: gzip, pigz-fast, pigz-slow, lzo (default) & none. If the selected compression method is unavailable on the source and destination, no compression will be used.

  • --source-bwlimit <limit t|g|m|k>

    This is the bandwidth limit imposed upon the source. This is mainly used if the target does not have mbuffer installed, but bandwidth limites are desired.

  • --target-bw-limit <limit t|g|m|k>

    This is the bandwidth limit imposed upon the target. This is mainly used if the source does not have mbuffer installed, but bandwidth limites are desired.

  • --no-command-checks

    Do not check the existance of commands before attempting the transfer. It assumes all programs are available. This should never be used.

  • --no-stream

    This argument tells syncoid to use -i incrementals, not -I. This updates the target with the newest snapshot from the source, without replicating the intermediate snapshots in between. (If used for an initial synchronization, will do a full replication from newest snapshot and exit immediately, rather than starting with the oldest and then doing an immediate -i to the newest.)

  • --no-sync-snap

    This argument tells syncoid to restrict itself to existing snapshots, instead of creating a semi-ephemeral syncoid snapshot at execution time. Especially useful in multi-target (A->B, A->C) replication schemes, where you might otherwise accumulate a large number of foreign syncoid snapshots.

  • --dumpsnaps

    This prints a list of snapshots during the run.

  • --sshport

    Allow sync to/from boxes running SSH on non-standard ports.

  • --sshkey

    Use specified identity file as per ssh -i.

  • --quiet

    Supress non-error output.

  • --debug

    This prints out quite alot of additional information during a sanoid run, and is normally not needed.

  • --version

    Print the version and exit.

  • --monitor-version

    This doesn't do anything right now.

Note that the sync snapshots syncoid creates are not atomic in a global context: sync snapshots of pool/dataset1 and pool/dataset2 will each be internally consistent, but one may be a few filesystem transactions "newer" than the other. (This does not affect the consistency of snapshots already taken in other ways, which syncoid replicates in the overall stream unless --no-stream is specified. So if you want to manually zfs snapshot -R pool@1 before replicating with syncoid, the global atomicity of pool/dataset1@1 and pool/dataset2@1 will still be intact.)