If you run a self-hosted server on ZFS, the single most important thing you can do to protect your data is take regular snapshots — and make sure those snapshots get replicated offsite. ZFS itself provides the building blocks: zfs snapshot, zfs send, and zfs receive. But managing retention policies, scheduling, and remote replication by hand quickly becomes unmanageable.
This guide compares three open-source tools that automate ZFS snapshot lifecycle management: Sanoid, ZnapZend, and Syncoid. Each takes a different approach to the same problem, and understanding their differences will help you pick the right one for your infrastructure.
For readers evaluating broader backup strategies, our Restic vs Borg vs Kopia comparison covers file-level backup tools that complement ZFS snapshot management. If you are setting up a NAS from scratch, the self-hosted NAS solutions guide covers TrueNAS (which bundles Sanoid/Syncoid by default) alongside OpenMediaVault and Rockstor.
Why ZFS Snapshots Matter for Self-Hosted Infrastructure
ZFS snapshots are instantaneous, space-efficient, read-only copies of a filesystem at a point in time. Unlike traditional backups, they are:
- Near-zero overhead — snapshots use copy-on-write; only changed blocks consume additional space
- Instantaneous — creating a snapshot takes milliseconds regardless of dataset size
- Crash-consistent — no need to stop services or flush buffers before snapshotting
- Rollback-ready — restore individual files or entire datasets in seconds
However, snapshots alone are not a backup strategy. They live on the same pool as the original data. If the pool fails, all snapshots go with it. You need replication — sending snapshots to a separate system or offsite location. That is where these three tools come in: they automate both the snapshot lifecycle (creation and pruning) and the replication to remote targets.
Tool Overview at a Glance
| Feature | Sanoid | ZnapZend | Syncoid |
|---|---|---|---|
| Primary purpose | Snapshot management + policy engine | Snapshot + replication combined | Replication-only (remote send/recv) |
| Repository | jimsalterjrs/sanoid | oetiker/znapzend | Part of Sanoid repo |
| GitHub stars | 3,738 | 672 | Bundled with Sanoid |
| Language | Perl | Perl | Perl |
| Last updated | Feb 2026 | Apr 2026 | Feb 2026 |
| Config format | TOML (/etc/sanoid/sanoid.conf) | ZFS properties (dataset-level) | CLI arguments |
| Scheduling | systemd timer or cron | Built-in daemon | cron or manual |
| Encryption in transit | Via SSH (same as ZFS send) | Via SSH with mbuffer support | Via SSH |
| Remote replication | Via Syncoid (separate tool) | Built-in | Yes (the core function) |
| Docker support | No official image | Official Dockerfile | No official image |
| Best for | Policy-driven local snapshot management | All-in-one snapshot + remote replication | Fast remote replication between ZFS hosts |
Sanoid: Policy-Driven Snapshot Management
Sanoid is the most widely adopted ZFS snapshot management tool in the open-source community. Its core strength is a simple, human-readable TOML configuration file that defines retention policies per dataset — and even per-dataset overrides of those policies.
How Sanoid Works
Sanoid runs as a cron job (typically every minute). On each invocation, it:
- Reads
/etc/sanoid/sanoid.conf - Checks each configured dataset against its assigned template
- Creates new snapshots if needed (hourly, daily, weekly, monthly, yearly)
- Prunes old snapshots that exceed retention limits
- Optionally runs Syncoid to replicate snapshots to remote hosts
Sanoid Installation on Debian/Ubuntu
| |
Sanoid Configuration Example
The configuration file at /etc/sanoid/sanoid.conf uses templates that datasets inherit:
| |
Sanoid’s TOML config is easy to read and modify. The template system means you define policies once and apply them to dozens of datasets, with per-dataset overrides when needed.
Replication with Syncoid
Sanoid does not handle remote replication itself. Instead, it works alongside Syncoid — which ships in the same repository. Syncoid performs efficient zfs send | zfs receive over SSH:
| |
Syncoid automatically determines which snapshots already exist on the target and only sends incremental differences. It also supports mbuffer for smoother streaming over high-latency links.
ZnapZend: All-in-One Snapshot and Replication
ZnapZend takes a fundamentally different approach. Instead of a separate config file, it stores backup policies directly as ZFS dataset properties. This means the backup configuration travels with the dataset — if you clone or move a filesystem, its backup policy comes with it.
How ZnapZend Works
ZnapZend runs as a daemon (znapzend) that continuously monitors configured datasets. Each dataset has properties like:
znapzend:enable— turn backup on or offznapzend:plan— a predefined retention plan (e.g.,1month=>1d,1week=>1h,1day=>15min)znapzend:dst_0— the first destination (local or remote)znapzend:dst_1— an optional second destination (for offsite)
ZnapZend Installation
ZnapZend can be installed from packages or built from source. For Docker environments, an official image is available:
| |
ZnapZend Docker Setup
| |
Note that ZFS requires privileged access and host device mounts, so running ZnapZend in Docker requires careful volume and device configuration. For most production setups, installing directly on the host is simpler.
ZnapZend Configuration
ZnapZend uses its znapzendzetup CLI to configure dataset properties:
| |
The plan syntax is compact: retention_count=>retention_interval. The example above keeps snapshots for 1 year (1 per month), 3 months (1 per week), 4 weeks (1 per day), 7 days (1 every 4 hours), and 1 day (1 every 15 minutes).
You can also add a second destination for offsite replication:
| |
Direct Feature Comparison
Retention Policy Management
| Aspect | Sanoid | ZnapZend |
|---|---|---|
| Config location | Central TOML file | ZFS dataset properties |
| Template system | Yes — reusable templates | Plans with interval syntax |
| Per-dataset overrides | Yes — inline in config | Yes — set property per dataset |
| Config backup | File can be versioned in git | Properties stored in ZFS metadata |
| Ease of audit | Single file to review | Must query each dataset |
Sanoid’s central config file is easier to review at a glance — you can see every dataset’s policy in one file. ZnapZend’s property-based approach means you need to query each dataset individually (zfs get all <dataset>), but the configuration is inherently portable with the dataset.
Replication Capabilities
| Aspect | Syncoid (Sanoid) | ZnapZend |
|---|---|---|
| Incremental sends | Yes | Yes |
| Compression | lz4, gzip, zstd | Via mbuffer |
| Encryption | Via SSH | Via SSH |
| Multiple destinations | Run multiple syncoid commands | Built-in (dst_0, dst_1) |
| Bandwidth limiting | Via mbuffer | Via mbuffer |
| Pre/post hooks | No | Limited |
| Resume interrupted sends | Yes | Yes |
ZnapZend has a slight edge for multi-destination setups since it natively supports a primary and secondary target. With Syncoid, you need to run separate replication commands for each destination.
Monitoring and Health Checks
| Aspect | Sanoid | ZnapZend |
|---|---|---|
| Pool health checks | Yes — warns on degraded pools | No |
| Snapshot monitoring | Yes — checks snapshot count vs expected | Yes — tracks last successful send |
| Syslog integration | Yes | Yes |
| Prometheus metrics | Third-party exporters exist | ccremer/znapzend-exporter |
| Email alerts | Via cron output | Via syslog |
Which Tool Should You Choose?
Choose Sanoid (+ Syncoid) if:
- You want a centralized, auditable config file that is easy to version control
- You need flexible, template-based retention policies with per-dataset overrides
- You are running TrueNAS Core or Scale — Sanoid/Syncoid comes pre-installed
- You want the most battle-tested tool with the largest user community (3,700+ stars)
- Your primary concern is local snapshot management with occasional replication
Choose ZnapZend if:
- You want an all-in-one daemon that handles both snapshots and replication
- You prefer configuration stored as ZFS properties that travel with the dataset
- You need built-in multi-destination replication (primary + offsite)
- You want an official Docker image for containerized deployments
- You like the compact retention plan syntax (
1year=>1month,3month=>1week)
Choose Syncoid standalone if:
- You only need fast, efficient remote replication without snapshot management
- You already have a separate snapshot scheduler (e.g., a custom cron job)
- You want the lightest possible tool — just send/receive over SSH
- You need one-shot replication scripts for ad-hoc data migration
Recommended Architecture
For most self-hosted setups, we recommend this architecture:
| |
Run Sanoid on your primary server to manage local snapshots. Use Syncoid on a cron schedule (e.g., every 6 hours) to replicate to your backup server. If you need a tertiary offsite copy, consider adding ZnapZend on the backup server to push to a cloud or third location.
For readers interested in Kubernetes-native backup approaches, the Velero vs Stash vs Volsync guide covers container-level backup orchestration that complements ZFS-level protection.
FAQ
What is the difference between Sanoid and Syncoid?
Sanoid and Syncoid are separate tools that ship in the same repository. Sanoid manages the local snapshot lifecycle — it creates snapshots on a schedule and prunes them based on retention policies defined in a TOML config file. Syncoid handles replication — it sends ZFS snapshots from one system to another over SSH. They are designed to work together but can also be used independently. You can use Syncoid without Sanoid (if you manage snapshots manually), and you can use Sanoid without Syncoid (if you only need local snapshots).
Can I use ZnapZend and Sanoid on the same system?
Technically yes, but it is not recommended. Both tools create and manage snapshots, and running both against the same datasets will lead to conflicts — duplicate snapshots, unexpected pruning, and potential data loss. Pick one tool and stick with it across your infrastructure. If you have existing Sanoid configurations, migrating to ZnapZend (or vice versa) requires careful planning to avoid losing snapshot history during the transition.
Does ZFS snapshot replication encrypt data in transit?
Yes. Both Sanoid/Syncoid and ZnapZend use SSH to tunnel zfs send output to the remote host. This means all data is encrypted in transit using SSH’s built-in encryption. For added security, you can use SSH key-based authentication with restricted keys (using command="zfs receive ..." in authorized_keys) to limit what the backup server can do on the source system.
How much disk space do ZFS snapshots consume?
ZFS snapshots are space-efficient. When you create a snapshot, it initially consumes zero additional space — it simply marks the current state of all blocks as “referenced.” As data changes, only the modified blocks consume additional space (the old versions are retained for the snapshot). A typical server with moderate write activity might use 5-15% of pool capacity for a 30-day snapshot retention. Monitoring with zfs list -t snapshot shows the REFER and USED columns for each snapshot, helping you identify which datasets generate the most snapshot overhead.
Can I restore individual files from a ZFS snapshot?
Yes. ZFS snapshots are mounted read-only under .zfs/snapshot/<snapshot-name>/ within the dataset. You can browse this hidden directory and copy files out normally:
| |
No zfs rollback is needed for individual file recovery — just browse and copy.
Is ZnapZend’s Docker image production-ready?
The official ZnapZend Docker image (oetiker/znapzend) works, but running ZFS tools in containers requires careful configuration. You need --privileged, host device mounts (/dev/zfs), and SSH keys mounted into the container. For production use, installing directly on the host OS is generally simpler and more reliable. Docker makes sense for testing or for environments where you must containerize everything, but the extra complexity rarely justifies it for a backup daemon that needs deep system access anyway.