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/SanoidREADME
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_scriptis 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
openhue
330.3kControl Philips Hue lights and scenes via the OpenHue CLI.
sag
330.3kElevenLabs text-to-speech with mac-style say UX.
weather
330.3kGet current weather and forecasts via wttr.in or Open-Meteo
cc-switch
31.8kA cross-platform desktop All-in-One assistant tool for Claude Code, Codex, OpenCode, openclaw & Gemini CLI.
