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
      • Record the status before changing it
      • Start one scrub deliberately
      • Verify the result
      • Do not treat a scrub as a backup
      • Investigate recurring counters
      • Primary references

      Read ZFS pool health and run a scrub

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

      Synopsis #

      zpool status reports pool topology, device state, scan history, and known data errors. A scrub reads allocated data, verifies checksums, and uses available redundancy to repair damaged copies. It cannot repair data for which no valid redundant copy exists.

      A pool can remain ONLINE while recording checksum errors or permanent file damage. Read the complete status rather than reducing it to the state word.

      Record the status before changing it #

      List pools and capture detailed status with full provider paths:

      $ zpool list
      $ zpool status -P
      $ zpool status -v
      

      Interpret the sections separately:

      • state describes pool availability;
      • status and action explain the current condition;
      • scan reports a scrub or resilver and its result;
      • the topology table records read, write, and checksum counters;
      • errors lists known permanent data errors.

      Do not clear counters before preserving this evidence. Device identity, controller messages, SMART data, and /var/run/dmesg.boot may be needed to distinguish a disk fault from a cable, backplane, power, or controller problem.

      Start one scrub deliberately #

      If no resilver or scrub is active and the pool is stable enough to read, start a scrub:

      # zpool scrub tank
      $ zpool status tank
      

      On supported releases, wait for completion when a maintenance script needs a synchronous boundary:

      # zpool scrub -w tank
      

      A scrub competes for device I/O. Monitor workload latency and pool progress, but do not repeatedly stop and restart it merely because it takes time.

      Verify the result #

      After completion, read the full status again:

      $ zpool status -v tank
      

      A healthy result records a completed scrub with zero errors and ends with errors: No known data errors. If blocks were repaired, investigate the affected device or path even when redundancy restored the data.

      Permanent errors require recovery from an intact snapshot or backup. Removing the error record does not restore the file. The current FreeBSD ZFS chapter documents corrective receive for a matching intact snapshot, but that operation has strict dataset and snapshot requirements and should not be improvised.

      Do not treat a scrub as a backup #

      A scrub validates the copies already present in a pool. It does not recover deleted files, provide an earlier application state, or survive loss of the host. Pair regular scrubs with snapshots, independent replication, capacity alerts, and restore tests.

      The snapshot and replication guide covers the first independent-copy workflow.

      Investigate recurring counters #

      When counters continue to rise:

      1. Preserve zpool status -P -v and system logs.
      2. Identify the physical device from serial and enclosure information.
      3. Check cables, power, controller, and backplane alongside drive health.
      4. Confirm that an independent backup is current.
      5. Follow a replacement procedure appropriate to the recorded vdev topology.

      Do not offline or detach a provider until the remaining topology and redundancy have been explicitly checked.

      Primary references #

      • FreeBSD Handbook: ZFS data integrity
      • zpool-status(8)
      • zpool-scrub(8)
      • zpool-clear(8)

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

      Report a bug
      • Synopsis
      • Record the status before changing it
      • Start one scrub deliberately
      • Verify the result
      • Do not treat a scrub as a backup
      • Investigate recurring counters
      • Primary references