SkillAgentSearch skills...

Sanoid

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.)

Install / Use

/learn @jimsalterjrs/Sanoid
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

<table align="center"> <tr> <td border="1" width="750"> <p align="center"> <img src="http://www.openoid.net/wp-content/themes/openoid/images/sanoid_logo.png" alt="sanoid logo" title="sanoid logo"> </p> <img src="https://openoid.net/gplv3-127x51.png" width=127 height=51 align="right"> <p align="left">Sanoid is provided to you completely free and libre, now and in perpetuity, via the GPL v3.0 license. If you find the project useful, please consider either a recurring or one-time donation at <a href="https://www.patreon.com/PracticalZFS" target="_blank">Patreon</a> or <a href="https://www.paypal.com/donate/?hosted_button_id=5BLPNV86D4S9N" target="_blank">PayPal</a>—your contributions will support both this project and the Practical ZFS <a href="https://discourse.practicalzfs.com/" target="_blank">forum</a>. </p> </td> </tr> </table>

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 <a href="https://openoid.net/transcend" target="_blank">functionally immortal</a> via automated snapshot management and over-the-air replication.

<p align="center"><a href="https://youtu.be/ZgowLNBsu00" target="_blank"><img src="http://www.openoid.net/sanoid_video_launcher.png" alt="sanoid rollback demo" title="sanoid rollback demo"></a><br clear="all"><sup>(Real time demo: rolling back a full-scale cryptomalware infection in seconds!)</sup></p>

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 but see INSTALL.md for more details:

* * * * * TZ=UTC /usr/local/bin/sanoid --cron

Note: Using UTC as timezone is recommended to prevent problems with daylight saving times

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]
        frequently = 0
        hourly = 36
        daily = 30
        weekly = 4
        monthly = 3
        yearly = 0
        autosnap = yes
        autoprune = yes

Which would be enough to tell sanoid to take and keep 36 hourly snapshots, 30 dailies, 4 weeklies, 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, which follows the same template (since it's a child of data/images) but only keeps 4 hourlies for whatever reason.

For more full details on sanoid.conf settings see Wiki page.

Note: Be aware that if you don't specify some interval options the defaults will be used (from /etc/sanoid/sanoid.defaults.conf)

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

  • --cache-dir

    Specify a directory to store the zfs snapshot cache. Defaults to /var/cache/sanoid

  • --run-dir

    Specify a directory for temporary files such as lock files. Defaults to /var/run/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, <i>not</i> 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.

  • --monitor-capacity

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

  • --force-update

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

  • --cache-ttl=SECONDS

    Set custom cache expire time in seconds (default: 20 minutes).

  • --version

    This prints the version number, and exits.

  • --quiet

    Suppress non-error output.

  • --verbose

    This prints additional information during the sanoid run.

  • --debug

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

  • --readonly

    Skip creation/deletion of snapshots (Simulate).

  • --help

    Show help message.

Sanoid script hooks

There are three script types which can optionally be executed at various stages in the lifecycle of a snapshot.

Note that snapshots related script are triggered only if you have autosnap = yes and pruning scripts are triggered only if you have autoprune = yes.

pre_snapshot_script

Will be executed before the snapshot(s) of a single dataset are taken. The following environment variables are passed:

| Env vars | Description | | ----------------- | ----------- | | SANOID_SCRIPT | The type of script being executed, one of pre, post, or prune. Allows for one script to be used for multiple tasks | | SANOID_TARGET | DEPRECATED The dataset about to be snapshot (only the first dataset will be provided) | | SANOID_TARGETS | Comma separated list of all datasets to be snapshotted (currently only a single dataset, multiple datasets will be possible later with atomic groups) | | SANOID_SNAPNAME | DEPRECATED The name of the snapshot that will be taken (only the first name will be provided, does not include the dataset name) | | SANOID_SNAPNAMES | Comma separated list of all snapshot names that will be taken (does not include the dataset name) | | SANOID_TYPES | Comma separated list of all snapshot types to be taken (yearly, monthly, weekly, daily, hourly, frequently) |

If the script returns a non-zero exit code, the snapshot(s) will not be taken unless no_inconsistent_snapshot is false.

post_snapshot_script

Will be executed when:

  • The pre-snapshot script succeeded or
  • The pre-snapshot script failed and force_post_snapshot_script is true.

| Env vars | Description | | -------------------- | ----------- | | SANOID_SCRIPT | as above | | SANOID_TARGET | DEPRECATED as above | | SANOID_TARGETS | as above | | SANOID_SNAPNAME | DEPRECATED as above | | SANOID_SNAPNAMES | as above | | SANOID_TYPES | as above | | SANOID_PRE_FAILURE | This will indicate if the pre-snapshot script failed |

pruning_script

Will be executed after a snapshot is successfully deleted. The following environment variables will be passed:

| Env vars | Description | | ----------------- | ----------- | | SANOID_SCRIPT | as above | | SANOID_TARGET | as above | | SANOID_SNAPNAME | as above |

example

sanoid.conf:

...
[sanoid-test-0]
	use_template = production
	recursive = yes
	pre_snapshot_script = /tmp/debug.sh
	post_snapshot_script = /tmp/debug.sh
	pruning_script = /tmp/debug.sh
...

verbose sanoid output:

...
executing pre_snapshot_script '/tmp/debug.sh' on dataset 'sanoid-test-0'
taking snapshot sanoid-test-0@autosnap_2020-02-12_14:49:33_yearly
taking snapshot sanoid-test-0@autosnap_2020-02-12_14:49:33_monthly
taking snapshot sanoid-test-0@autosnap_2020-02-12_14:49:33_daily
taking snapshot sanoid-test-0@autosnap_2020-02-12_14:49:33_hourly
executing post_snapshot_script '/tmp/debug.sh' on dataset 'sanoid-test-0'
...

pre script env variables:

SANOID_SCRIPT=pre
SANOID_TARGET=sanoid-test-0/b/bb
SANOID_TARGETS=sanoid-test-0/b/bb
SANOID_SNAPNAME=autosnap_2020-02-12_14:49:32_yearly
SANOID_SNAPNAMES=autosnap_2020-02-12_14:49:32_yearly,autosnap_2020-02-12_14:49:32_monthly,autosnap_2020-02-12_14:49:32_daily,autosnap_2020-02-12_14:49:32_hourly
SANOID_TYPES=yearly,monthly,daily,hourly

post script env variables:

SANOID_SCRIPT=post
SANOID_TARGET=sanoid-test-0/b/bb
SANOID_TARGETS=sanoid-test-0/b/bb
SANOID_SNAPNAME=autosnap_2020-02-12_14:49:32_yearly
SANOID_SNAPNAMES=autosnap_2020-02-12_14:49:32_yearly,autosnap_2020-02-12_14:49:32_monthly,autosnap_2020-02-12_14:49:32_daily,autosnap_2020-02-12_14:49:32_hourly
SANOID_TYPES=yearly,monthly,daily,hourly
SANOID_PRE_FAILURE=0

Syncoid

Sanoid also includes a replication tool, syncoid, which facilitates the asynchronous increment

Related Skills

View on GitHub
GitHub Stars3.7k
CategoryCustomer
Updated2d ago
Forks339

Languages

Perl

Security Score

100/100

Audited on Mar 20, 2026

No findings