The Handbook

    Theme
    • Guides
        • Check a system before installing FreeBSD
        • Orient a Linux administrator on FreeBSD
        • Supported FreeBSD releases
        • Choose a FreeBSD documentation and support channel
        • Move files safely without GNU mv -t
        • Update, upgrade, or update packages?
        • Upgrade 14.4 or 15.0 to FreeBSD 15.1
        • Choose packages, ports, or poudriere
        • Choose the quarterly or latest package branch
        • Choose a FreeBSD download or package mirror
        • Make a system setting persistent
        • Configure locale, keyboard, and time zone
        • Configure a serial console for recovery
        • Choose a custom kernel, module, or loader setting
        • Run a Linux binary with the compatibility layer
        • Check desktop and laptop hardware before installation
        • Choose and check a graphics driver
        • Choose Xorg or Wayland
        • Build a maintainable desktop baseline
        • Install and check a desktop browser
        • Check laptop Wi-Fi, power, and suspend
        • Check multimedia readiness
        • Choose and configure a printing stack
        • Run Windows applications with Wine
        • Snapshot and replicate a ZFS dataset
        • Choose a filesystem and storage layout
        • Operate ZFS without losing the recovery path
        • Restore files from a ZFS snapshot
        • Read ZFS pool health and run a scrub
        • Replace a failed device in a ZFS mirror
        • Replicate a ZFS dataset over SSH
        • Change PF safely on a remote host
        • Configure a narrow WireGuard tunnel
        • Plan a FreeBSD home server
        • Choose a mail server or an outgoing relay
        • Publish a network service safely
        • Choose a jail network model
        • Choose native jails or a jail manager
        • Choose a jail or a bhyve virtual machine
        • Establish a FreeBSD security baseline
        • Choose a MAC policy
        • Audit security-relevant activity
        • Start a DTrace performance investigation
    • Integrations
        • Create a first jail with Bastille
        • Compare jail managers and OCI tooling
        • Publish a Bastille service through PF
        • Mount a ZFS dataset in a Bastille jail
        • Update and upgrade Bastille jails
        • Back up and restore a Bastille jail
        • Prepare bhyve and vm-bhyve
        • Choose NFS or Samba for file sharing
        • Choose ZFS backup automation
        • Operate a signed poudriere repository
        • Manage FreeBSD configuration with Ansible or Salt
        • Run Motion with webcamd on FreeBSD
        • Design a reverse proxy, certificates, and monitoring
    • FAQ
      • Troubleshooting
          • Recover an interrupted freebsd-update run
          • Resolve a package repository or ABI mismatch
          • Diagnose the FreeBSD boot path
          • Recover with a ZFS boot environment
          • Diagnose DNS, routing, and firewall paths
          • Diagnose network mbuf exhaustion
          • Bind a service to a low port without running it as root
          • Diagnose audio output or input
          • Diagnose webcamd, cuse, and a webcam
          • Fix USB device permissions without opening every device
      • About this handbook
      • Synopsis
      • Confirm the source and destination
      • Create and inspect a snapshot
      • Estimate the stream
      • Receive the full snapshot
      • Send the next snapshot incrementally
      • Make the copy a backup
      • Primary references

      Snapshot and replicate a ZFS dataset

      Last reviewed
      13 August 2026
      Applies to
      15.1-RELEASE, 15.0-RELEASE, 14.4-RELEASE

      Synopsis #

      A ZFS snapshot is a read-only point-in-time view of a dataset. It provides a convenient local recovery point, but it is not a backup while it remains on the same pool. Replication with zfs send and zfs receive copies the snapshot to a separate pool or host.

      This procedure uses tank/data as the source dataset and backup/tank-data as a new destination dataset. Replace both names deliberately. A mistaken destination can overwrite or expose data when later commands are added to the workflow.

      Confirm the source and destination #

      List pools, the source dataset, and available space before creating anything:

      $ zpool list
      $ zfs list -o name,used,available,mountpoint tank/data
      $ zfs list -o name,used,available,mountpoint backup
      

      The destination pool should be physically and operationally independent of the source. A second dataset on the same pool is another copy, not protection from pool failure, theft, or loss of the host.

      Confirm that the intended destination dataset does not already exist:

      $ zfs list backup/tank-data
      

      The expected result for this first full receive is dataset does not exist. If it exists, stop and decide whether it is an earlier replica that requires an incremental stream.

      Create and inspect a snapshot #

      Use a name that identifies the purpose or date:

      # zfs snapshot tank/data@manual-2026-08-13
      $ zfs list -t snapshot tank/data@manual-2026-08-13
      

      The snapshot initially consumes little additional space. Its USED value grows as blocks referenced by the snapshot are changed or deleted in the live dataset.

      When the dataset’s snapdir property permits it, individual files can be inspected through the hidden .zfs/snapshot directory:

      $ ls /tank/data/.zfs/snapshot/manual-2026-08-13/
      

      Copying an individual file out of this directory is safer than rolling back the entire dataset. A rollback can discard newer data and is outside this procedure.

      Estimate the stream #

      Use a dry run to estimate the full stream before transmitting it:

      # zfs send -nPv tank/data@manual-2026-08-13
      

      Compare the estimate with the free space on the destination. Compression and pool layout can make source usage and destination allocation differ.

      Receive the full snapshot #

      Pipe the stream into a new, unmounted destination dataset:

      # zfs send -v tank/data@manual-2026-08-13 | zfs receive -u backup/tank-data
      

      -u leaves the received dataset unmounted. This prevents a backup copy from unexpectedly appearing over an existing path. Assign and verify a mount point separately if the replica must be browsed.

      Confirm that both sides contain the named snapshot:

      $ zfs list -t snapshot tank/data@manual-2026-08-13
      $ zfs list -t snapshot backup/tank-data@manual-2026-08-13
      

      A successful command and matching snapshot names confirm that ZFS accepted the stream. They do not replace periodic restore tests, pool health checks, or off-site copies.

      Send the next snapshot incrementally #

      Create a second snapshot after data changes:

      # zfs snapshot tank/data@manual-2026-08-20
      # zfs send -nPv -i tank/data@manual-2026-08-13 tank/data@manual-2026-08-20
      

      The first snapshot must still exist on both sides. Send only the difference between the two snapshots:

      # zfs send -v -i tank/data@manual-2026-08-13 tank/data@manual-2026-08-20 | zfs receive -u backup/tank-data
      

      Do not destroy the common snapshot until the next incremental receive has completed and the retention policy permits its removal. A missing common snapshot breaks that incremental chain.

      Make the copy a backup #

      A maintained backup process also needs:

      • automatic snapshots with an explicit retention policy;
      • a destination on another failure domain, preferably another host or site;
      • monitoring for failed or interrupted sends;
      • capacity alerts on both pools;
      • regular scrubs and review of zpool status;
      • restore tests that verify files, permissions, and application consistency.

      Databases and other stateful services may require application-aware quiescing or snapshot hooks. A crash-consistent filesystem snapshot does not guarantee application-level consistency.

      Primary references #

      • FreeBSD Handbook: ZFS snapshots
      • FreeBSD Handbook: ZFS replication
      • zfs-snapshot(8)
      • zfs-send(8)
      • zfs-receive(8)
      • zpool-status(8)

      Independent documentation. Not affiliated with or endorsed by the FreeBSD Project or the FreeBSD Foundation.

      Report a bug
      • Synopsis
      • Confirm the source and destination
      • Create and inspect a snapshot
      • Estimate the stream
      • Receive the full snapshot
      • Send the next snapshot incrementally
      • Make the copy a backup
      • Primary references