Usage¶
Pushing with syncoid by hand¶
syncoid --no-privilege-elevation --no-sync-snap --sendoptions=w --compress=none \
--recursive --delete-target-snapshots \
tank/offsite joe@bas-nas:tank/friends/joe/offsite
--no-privilege-elevation: the gate refusessudo.--sendoptions=w: raw sends, so the host never sees plaintext. The gate fails any push that arrives unencrypted.--no-sync-snap: send sanoid's snapshots instead of creating syncoid's own, so the sending user needs onlysendandhold.--compress=none: raw encrypted data does not compress. The gate reports thatlzopandmbufferare missing on its side anyway, so syncoid skips them.--delete-target-snapshots: mirror your sanoid retention on the host.
The receive always runs with -u, and keeps -F when the caller asks for it, as syncoid does by default.
After missed pushes, sender retention can delete the newest snapshot both sides share; -F lets ZFS roll the destination back to an older common snapshot, discarding newer destination snapshots, so the incremental can continue.
It applies only strictly below the tenant root and needs no rights beyond the existing delegation.
The destination therefore follows the sender: keep snapshots you want to preserve on the sender, and if no common snapshot remains, send a new full backup.
Run syncoid as a non-root user with zfs allow -u <user> send,hold <dataset> on the sending side.
Restoring¶
Pull a snapshot back through the same key and unlock it at home:
ssh joe@bas-nas zfs send -w tank/friends/joe/offsite/photos@autosnap_2026-09-25_00:00:01_daily \
| zfs receive -u tank/restored/photos
zfs load-key tank/restored/photos
zfs mount tank/restored/photos
If the transfer breaks, resume it with the token your side kept:
token=$(zfs get -H -o value receive_resume_token tank/restored/photos)
ssh joe@bas-nas zfs send -t "$token" | zfs receive -s -u tank/restored/photos
List what the host keeps for you with ssh joe@bas-nas zfs list -r -t all -o name,used,creation.
Removing datasets¶
Everything below your root is yours to remove: