ZFS snapshots on Ubuntu 20.04 may appear empty or missing due to misconfigured scheduling services, incorrect dataset targeting, or permission issues preventing the creation of snapshot records. This guide provides concrete diagnostic steps to verify if snapshots exist, how to correctly configure automated backup tools like
zfs-auto-snapshot, and methods to resolve common configuration errors that lead to data visibility problems.
Verifying Snapshot Existence
Before troubleshooting automation, you must confirm whether snapshots are actually being created. The command
zfs list -t snapshot displays all existing snapshots across all pools. If this returns no output, the system is not creating snapshots at all, indicating a service failure rather than a display issue. You can also check a specific pool by running
zfs list -t snapshot -r pool_name.
It is crucial to distinguish between an empty snapshot and a missing one. A snapshot with zero visible files might be corrupted or improperly mounted, whereas a completely missing snapshot means the creation process failed entirely. Always verify the health of your ZFS pool using
zpool status to ensure there are no underlying I/O errors that could prevent snapshot metadata from being written.
Configuring Automated Snapshots
Most users on Ubuntu 20.04 rely on the
zfs-auto-snapshot package for scheduled backups. This tool uses systemd timers and cron jobs to trigger snapshots. If snapshots are missing, the first step is to check if the service is active. Run
systemctl status zfs-auto-snapshot.timer to see if the timer is enabled and running. If it is inactive, enable it with
systemctl enable --now zfs-auto-snapshot.timer.
The behavior of these snapshots is controlled by properties set on individual datasets. You can view current settings with
zfs get auto-snapshot. Common values include
enabled,
disabled, or specific schedules like
mhourly (minute hourly) or
daily. If a dataset has auto-snapshotting disabled, no snapshots will be created regardless of the global timer status. Enable it per dataset using
zfs set auto-snapshot@mhourly=true pool/dataset.
For more granular control, you can install the
zfs-auto-snapshot package which provides various presets. These presets define how many snapshots to keep and when to create them. Review the configuration in
/etc/default/zfs-auto-snapshot to ensure the desired frequency matches your operational needs. Remember that changes to these defaults require restarting the timer service to take effect.
Debugging Service Failures
If the timer is active but no snapshots appear, check the logs for errors. The systemd journal is the primary source of truth here. Use
journalctl -u zfs-auto-snapshot.timer to view recent events. Look for lines indicating execution failures, permission denied errors, or ZFS command errors. A common issue is insufficient permissions; the service runs as root, but if user quotas or ACLs interfere, the operation may fail silently.
Another frequent cause is disk space exhaustion. While ZFS handles space efficiently, a full pool cannot accept new metadata. Check available space with
df -h or
zpool list. If the pool is near capacity, consider cleaning up old snapshots manually using
zfs destroy pool/dataset@snapshot_name before retrying automation. Additionally, verify that the
zfs binary is accessible and functional by running
zfs version.
You can also test the snapshot creation manually to isolate the issue. Run
zfs snapshot pool/dataset@manual_test directly in the terminal. If this succeeds, the problem lies within the automated service configuration. If it fails, the error message will provide specific details about why ZFS refused the operation, such as invalid characters in the name or conflicting snapshot names.
Restoring Visibility of Existing Data
Sometimes snapshots exist but are not visible in standard file browsers because they are stored in a special hidden directory. On Ubuntu, snapshots are typically located at
.zfs/snapshot within the mount point. Navigate to your dataset root and run
ls -la .zfs/snapshot to list all available snapshots. This method confirms that the data is intact even if the
zfs list command seems unreliable due to caching issues.
If you suspect corruption or inconsistency, do not attempt to force-create snapshots immediately. Instead, perform a scrub to check data integrity. Run
zpool scrub pool_name and monitor its progress. A scrub verifies all data blocks against their checksums. If errors are found, they must be resolved before trusting any snapshot operations, as corrupt data can render snapshots useless or dangerous to restore from. For deeper recovery scenarios involving damaged metadata, refer to our guide on
Correcting ZFS Data Error with Old Snapshot without Completely Recreating New Snapshot.
Alternative Backup Strategies
If ZFS-native snapshots continue to fail due to hardware limitations or complex network requirements, consider alternative backup methods. You can export the dataset and use tools like
rsync or
btrfs-send equivalents for other filesystems. However, ZFS offers superior consistency guarantees. Before abandoning ZFS snapshots, ensure that your storage backend supports the required features. If you need to expand your storage capacity to accommodate more snapshots, adding a new disk is a straightforward process. Learn how to
Add a New Disk to an Available Zpool in Ubuntu to increase your pool's resilience and storage headroom.
Frequently Asked Questions
Why does my ZFS snapshot show zero size?
A snapshot showing zero size is normal because ZFS only stores changed blocks since the previous snapshot. If no data was modified after the last snapshot, the new snapshot consumes negligible additional space. This indicates efficient copy-on-write behavior rather than data loss.
How do I manually delete a problematic snapshot?
Use the command
zfs destroy pool/dataset@snapshot_name to remove a specific snapshot. If the snapshot is locked or busy, ensure no processes are accessing it via the
.zfs/snapshot directory. You may need to unmount the dataset temporarily to force removal if necessary.
Can I schedule snapshots without installing extra packages?
Yes, you can use standard Linux cron jobs combined with the
zfs snapshot command. Create a script that iterates through your datasets and calls
zfs snapshot with appropriate naming conventions. This approach gives you full control over timing and retention policies without relying on systemd timers.
What causes "dataset is busy" errors during snapshot creation?
This error occurs when open file descriptors hold references to the dataset. Applications like databases or editors often cause this. Close the applications or restart the services holding the files. Alternatively, use
fuser -m /mount/point to identify and terminate processes blocking the operation.
Is it safe to disable auto-snapshotting on production servers?
Disabling auto-snapshots removes your immediate protection against accidental deletions or rapid corruption. It is generally unsafe for production environments unless you have another robust backup strategy in place. Consider implementing external replication instead if native snapshots are not feasible due to resource constraints.