How to Manage ZFS Datasets, Snapshots, and Replication on Ubuntu Server
Learning how to manage ZFS datasets, snapshots, and replication on Ubuntu Server gives you one of the most powerful storage management tools available on Linux. ZFS combines a volume manager and filesystem into a single layer. It handles data integrity, compression, and point-in-time snapshots natively. Whether you’re protecting a production server or setting up a home NAS, ZFS delivers features that other filesystems simply can’t match. This tutorial walks you through creating and managing datasets, taking and rolling back snapshots, and replicating data to a remote server. By the end, you’ll have a solid working knowledge of ZFS storage management on Ubuntu.
Prerequisites for Managing ZFS Datasets and Snapshots
Before you start, make sure you meet these requirements.
Required software and access:
- Ubuntu Server 20.04 or 22.04 (fresh or existing install)
- Root or sudo access
- At least one spare disk or partition for your ZFS pool
- SSH access to a second server (for replication steps)
- Basic familiarity with the Linux command line
Estimated time: 45–60 minutes
First, install ZFS on your Ubuntu server. Run the following commands:
sudo apt update
sudo apt install zfsutils-linux -y
Verify the installation succeeded with:
zfs --version
You should see output showing the ZFS version number. If you don’t, reboot and try again. Ubuntu 20.04 and later ship with ZFS kernel modules built in, so installation is usually smooth. For full details on ZFS support in Ubuntu, check the official Ubuntu ZFS documentation.
Step-by-Step Guide to ZFS Datasets, Snapshots, and Replication
You might also find this useful: How to Deploy and Expose Applications on Kubernetes Using Deployments, Services, and Ingress
Step 1: Create a ZFS Storage Pool
Before you create datasets, you need a pool. Replace /dev/sdb with your actual disk.
sudo zpool create mypool /dev/sdb
Verify the pool is online:
sudo zpool status mypool
You should see state: ONLINE in the output.
Step 2: Create ZFS Datasets
Datasets are the building blocks of ZFS. Think of them as smart directories with their own properties. Create a dataset inside your pool:
sudo zfs create mypool/data
Create a nested dataset for backups:
sudo zfs create mypool/data/backups
List all datasets to confirm:
sudo zfs list
You’ll see each dataset with its used space, available space, and mount point.
Step 3: Set Dataset Properties
ZFS lets you set properties per dataset. Enable compression to save disk space:
sudo zfs set compression=lz4 mypool/data
Set a quota to limit how much space a dataset can use:
sudo zfs set quota=50G mypool/data/backups
Check current properties with:
sudo zfs get all mypool/data
Step 4: Take a ZFS Snapshot
Snapshots capture the state of a dataset at a specific moment. They’re read-only and take almost no space initially. Create a snapshot with this syntax:
sudo zfs snapshot mypool/data@snapshot-2024-01-15
List all snapshots:
sudo zfs list -t snapshot
You can take multiple snapshots over time. Each one only stores the changes since the last snapshot.
Step 5: Roll Back to a Snapshot
If something goes wrong, rolling back is fast and simple. This command reverts the dataset to the snapshot state:
sudo zfs rollback mypool/data@snapshot-2024-01-15
Be careful here. Rolling back destroys any snapshots taken after the one you’re restoring. If you want to keep later snapshots, use -r to recursively roll back, but understand you’ll lose those intermediate snapshots.
Step 6: Access Files from a Snapshot
You don’t always need a full rollback. ZFS exposes snapshots in a hidden directory. Browse snapshot contents directly:
ls /mypool/data/.zfs/snapshots/snapshot-2024-01-15/
Copy individual files out of a snapshot without affecting the live dataset. This is useful for recovering a single deleted file.
Step 7: Delete Old Snapshots
Snapshots accumulate over time and eventually consume disk space. Remove a snapshot you no longer need:
sudo zfs destroy mypool/data@snapshot-2024-01-15
To automate snapshot creation and deletion, look at tools like Sanoid, which handles snapshot policies on ZFS systems.
Step 8: Replicate ZFS Data to a Remote Server
ZFS replication uses zfs send and zfs receive to stream snapshot data to another server. This is one of the most powerful features in ZFS.
First, create a snapshot to send:
sudo zfs snapshot mypool/data@replication-2024-01-15
Send the snapshot to a remote server over SSH. Replace user@remotehost and remotepool/data with your actual values:
sudo zfs send mypool/data@replication-2024-01-15 | ssh user@remotehost sudo zfs receive remotepool/data
For incremental replication (only sending changes), use the -i flag:
sudo zfs send -i mypool/data@replication-2024-01-15 mypool/data@replication-2024-01-16 | ssh user@remotehost sudo zfs receive remotepool/data
Incremental sends are much faster. They only transfer the difference between two snapshots.
Troubleshooting Common ZFS Issues on Ubuntu
Problem: Pool won’t import after reboot
Run sudo zpool import to see available pools. Then import by name:
sudo zpool import mypool
Problem: Dataset is busy and can’t be destroyed
Something is using the dataset. Find what’s accessing it:
sudo fuser -m /mypool/data
Kill the process or unmount the dataset first, then retry the destroy command.
Problem: Replication fails with permission denied
The remote user needs permission to run zfs receive. You can grant this with ZFS delegation:
sudo zfs allow -u remoteuser receive,mount,create remotepool
Problem: Snapshot rollback says “more recent snapshots exist”
You need to add the -r flag to destroy later snapshots during rollback:
sudo zfs rollback -r mypool/data@snapshot-2024-01-15
Warning: Always verify your pool health before and after major operations. Run sudo zpool scrub mypool regularly. This checks all data for errors and corrects them automatically.
Conclusion
You now know how to manage ZFS datasets, snapshots, and replication on Ubuntu Server from start to finish. You created a storage pool, organized data with datasets, protected it with snapshots, and replicated it to a remote host. These skills form the foundation of a solid backup and storage strategy on Linux. From here, consider automating your snapshot schedules with cron jobs or Sanoid. You might also explore ZFS RAID configurations like RAIDZ for additional redundancy. Knowing how to manage ZFS datasets, snapshots, and replication on Ubuntu Server puts you in full control of your data. Keep testing your snapshots and replicas regularly. A backup you haven’t tested is a backup you can’t trust.
