Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12
○Not yet marked complete on this device.
ZFS faults reach you dressed as Proxmox faults. The storage shows inactive, a
guest will not start, a backup fails, a VM is paused. The Proxmox layer is
reporting accurately and has nothing more to tell you; everything useful is one
layer down.
Four faults cover most of what you will meet, and each has a different first
command.
Fault one: the pool will not import
pvesm status shows the ZFS storage inactive. zpool list shows nothing.
Read-only / Safewhat does ZFS see, and what could it import— Read-only. zpool import with no arguments scans for importable pools and reports why each one is or is not importable — the state line and the action line are the whole diagnosis. Scanning by-id paths matters because device names are not stable across reboots or controller changes.
zpool list
zpool import
zpool import -d /dev/disk/by-id
ls -l /dev/disk/by-id | grep -v part
Read-only / Safe
$ zpool import
pool: tank
id: 10913148573287938276
state: ONLINE
status: The pool was last accessed by another system.
action: The pool can be imported using its name or numeric identifier and
the '-f' flag.
see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-EY
config:
tank ONLINE
mirror-0 ONLINE
ata-SAMSUNG_MZ7L3960_S6ABC0000000001 ONLINE
ata-SAMSUNG_MZ7L3960_S6ABC0000000002 ONLINE
Hostid mismatch — reinstall, disk move, or another live host
-f, after confirming no other system has it
FAULTED, “insufficient replicas”
Too many devices missing for the redundancy level
Find the missing devices; do not force
“may be in use from other system” with a live peer
Genuinely dual-attached
Stop. Forcing this is how you destroy a pool
Imports but hangs
Damaged pool, or a device that responds slowly
-o readonly=on, and -N to skip mounting
Fault two: the resilver has stopped moving
zpool status shows a resilver in progress with an estimate that grows every
time you look.
Read-only / Safefind the device that is holding up the resilver— Read-only. zpool status -v shows per-device error counters; zpool iostat -v shows per-device throughput and latency. The device with error counts climbing, or with latency an order of magnitude above its peers, is the one to deal with.
pool: tank
state: DEGRADED
status: One or more devices is currently being resilvered.
action: Wait for the resilver to complete.
scan: resilver in progress since Tue Aug 11 22:04:11 2026
1.42T scanned at 41.2M/s, 388G issued at 11.3M/s, 6.71T total
388G resilvered, 5.64% done, 6 days 14:22:19 to go
config:
NAME STATE READ WRITE CKSUM
tank DEGRADED 0 0 0
raidz2-0 DEGRADED 0 0 0
ata-...001 ONLINE 0 0 0
ata-...002 ONLINE 0 0 47
ata-...003 ONLINE 0 0 0
replacing-3 DEGRADED 0 0 0
old OFFLINE 0 0 0
ata-...09 ONLINE 0 0 0
Fault three: the pool is full and nothing accounts for it
zfs list shows the pool nearly full. The guests on it add up to far less.
Read-only / Safeaccount for every byte— Read-only. zfs list -o space breaks usage into the categories that explain a full pool: data, snapshots, children and reservations. This is the command that ends the argument about where the space went.
zpool list -o name,size,alloc,free,cap,frag,health
zfs list -o space -r rpool
zfs list -t snapshot -o name,used,refer -s used | tail -30
zfs get -r -o name,property,value refreservation,reservation,used,usedbysnapshots rpool | head -40
The four things that consume a ZFS pool without being obvious:
Snapshots.USEDSNAP is space held only by snapshots. A guest that deletes
100 GB frees nothing while a snapshot references it. This is the most common
answer by a wide margin.
Refreservations on zvols. A thick-provisioned zvol reserves its full size
whether or not it is written. USEDREFRESERV shows it. This is space that
exists to guarantee the guest can always write, and it is a deliberate choice —
but it is often an accidental one, inherited from a storage created without thin
provisioning.
Fragmentation and the 80% rule. ZFS performance degrades as a pool fills,
because finding contiguous free space gets harder. zpool list shows FRAG.
A pool above about 80% is one to plan capacity for, not one to keep filling.
Reservations on datasets, which do the same job as refreservations at the
dataset level and are rarer but harder to spot.
Fault four: guests are paused and the storage looks fine
A pool that hits an unrecoverable I/O error can enter a suspended state, in
which all I/O to it blocks. Guests do not error; they stop.
Read-only / Safeis the pool suspended, and what are the guests doing— Read-only. A suspended pool reports its state in zpool status; QEMU guests whose disks have blocked report io-error. Check both, because the Proxmox-level symptom and the ZFS-level cause look nothing alike.
zpool status
zpool get failmode rpool
qm list
qm status 141
journalctl -k --since "-2h" | grep -iE 'zfs|zio|I/O failure|pool.*suspended' | tail -30
Key takeaways
zpool import with no arguments is the diagnosis for a pool that will not
import: it prints the state, the reason and the recommended action.
Scan by -d /dev/disk/by-id. Device names are not stable and a pool that
“disappeared” has usually just been renamed by the kernel.
-f overrides the check that stops two hosts importing the same pool.
Confirm no other system has it — powered off, not merely shut down — before
using it. Import -o readonly=on -N first when in doubt.
A resilver whose estimate keeps growing usually means a second marginal
device returning checksum errors, or heavy client load. zpool iostat -v
distinguishes them. Do not offline a second device while redundancy is already
reduced.
zfs list -o space -r accounts for a full pool: USEDSNAP for snapshots,
USEDREFRESERV for thick zvol reservations, USEDCHILD for descendants.
A pool at 100% may be unable to accept a delete, because deleting is a write.
Destroy a snapshot or drop a refreservation instead.
A suspended pool with the default failmode=wait blocks all I/O, which
presents as an unresponsive node rather than as a storage error. zpool status
belongs early in the checklist for any hung node; recovery is to fix the device
and then zpool clear.
Checksum errors are invisible to applications because ZFS repairs them
transparently. Scrub on a schedule and alert on the counters, not only on pool
state.
Knowledge check
Knowledge check · 5 questions
Q1. A resilver on a RAIDZ2 pool reports six days remaining, where a previous resilver of the same pool took nine hours. zpool status shows CKSUM 47 on a device that is not the one being replaced. What is the finding and what should you not do?
Q2. A ZFS pool is at 100% and you cannot delete guest disks to free space — the delete itself fails. Why, and what works instead?
Q3. A node has become unresponsive: the GUI hangs for that node, qm list takes minutes, and tasks are stacking up. There is no obvious CPU or memory pressure. Which of these belong in the first minute? Select all that apply.
Q4. Because ZFS repairs checksum errors transparently from redundancy, a failing disk can accumulate errors for weeks inside an ONLINE pool with no symptom visible to any guest or application.
Q5. A rebuilt node cannot import its pool. zpool import reports the pool as ONLINE with status "The pool was last accessed by another system" and suggests -f. The disks are in a shared SAS enclosure also cabled to a second server. What now?
Passing score: 75%. Answers are checked in this browser.