A pool name is an API. Services, replication jobs, and inventory all address storage through it — so it must only encode things that never change. The performance tier never changes. Everything else does.
The convention
Three names, used identically on every node that has that tier of storage:
A node only creates the pools it has hardware for. A
proxmox-2-style node with an HDD array gets bulk; a node with spare flash gets fast; every ZFS-boot node already has rpool.
What a pool name must never encode
The test for a candidate name: does this fact survive a hardware change?
Tier names survive all of those events. The name tells you the speed class; the dataset path below it tells you the purpose.
The payoff: identical paths everywhere
Because the pool name is the same on every node, a dataset’s full path is node-agnostic:bulk/datameans “the bulk media dataset” on whichever node currently holds it. Moving the service to another node changes zero mount configuration.- Replication targets line up by construction —
bulk/dataon the source replicates tobulk/replica/<source>/dataon the destination, and a restored replica is byte-identical at the same path it had at home. - Inventory and IaC reference one path per dataset, not one per node × dataset.
What this connects to
ZFS backup & replication
The snapshot and replication layers that ride on these pools.
VMID & network tier model
The same encode-only-what-never-changes philosophy, applied to guest identity.
Homelab
The hardware behind the pools.