How to Configure Btrfs Subvolumes, Zstandard Compression, and Snapper on Ubuntu

Standard Linux filesystem deployments running on ext4 require manual partition resizing, lack native block-level deduplication, and offer no rollback defense if a bad kernel update or package upgrade breaks system bootability. Btrfs (B-tree File System) is an advanced copy-on-write (CoW) filesystem integrated into the mainline Linux kernel that delivers dynamic subvolume partitioning, transparent Zstandard (zstd) file compression, and instantaneous read-only snapshots. Pairing Btrfs with openSUSE’s Snapper utility provides Ubuntu workstations and servers with automated pre-and-post APT rollback checkpoints.

Btrfs Subvolumes Architecture and Mount Hierarchy

Unlike rigid physical partitions, Btrfs subvolumes behave like distinct mountable filesystems sharing a single dynamic storage pool:

Subvolume Name Standard Mountpoint Operational Role & Snapshot Strategy
@ (Root) / Operating system binaries, libraries, and kernel modules; snapshotted automatically before APT updates
@home /home User files, documents, and downloads; isolated from OS rollbacks to prevent user data loss
@var_log /var/log System and audit logs; excluded from rollbacks so post-incident forensic logs survive rollbacks
@snapshots /.snapshots Dedicated container holding Snapper metadata trees and read-only point-in-time images

Installing Btrfs Utilities and Formatting Storage

Install user-space management packages on Ubuntu:

# Install Btrfs user-space tools
sudo apt update && sudo apt install -y btrfs-progs

# Create a Btrfs filesystem with label 'data' on a dedicated drive
sudo mkfs.btrfs -L data -f /dev/disk/by-id/nvme-eui.0123456789abcdef

Creating Subvolumes and Enabling Transparent zstd Compression

Mount the top-level subvolume temporarily to create clean hierarchical child subvolumes:

# Mount root pool to temporary staging location
sudo mkdir -p /mnt/btrfs-root
sudo mount /dev/disk/by-id/nvme-eui.0123456789abcdef /mnt/btrfs-root

# Create subvolumes
sudo btrfs subvolume create /mnt/btrfs-root/@data
sudo btrfs subvolume create /mnt/btrfs-root/@backups

# Unmount staging directory
sudo umount /mnt/btrfs-root

Configure persistent mounts in /etc/fstab using optimal performance flags and transparent zstd compression:

# Add to /etc/fstab
LABEL=data  /mnt/data     btrfs  defaults,noatime,compress=zstd:3,subvol=@data     0  0
LABEL=data  /mnt/backups  btrfs  defaults,noatime,compress=zstd:3,subvol=@backups  0  0
# Mount all declared filesystems
sudo mkdir -p /mnt/data /mnt/backups
sudo mount -a

# Inspect compression status and subvolume properties
sudo btrfs filesystem df /mnt/data

Installing and Configuring Snapper for Automated Snapshots

Snapper provides enterprise snapshot management and ties into APT package triggers:

# Install snapper and the APT integration hook
sudo apt install -y snapper btrfs-compsize

# Initialize a Snapper configuration profile for your dataset
sudo snapper -c data create-config /mnt/data

Fine-tune retention policies in /etc/snapper/configs/data:

# Edit /etc/snapper/configs/data
TIMELINE_CREATE="yes"
TIMELINE_CLEANUP="yes"

# Retention limits
TIMELINE_LIMIT_HOURLY="12"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="4"
TIMELINE_LIMIT_MONTHLY="3"
TIMELINE_LIMIT_YEARLY="0"

Enable Snapper automated systemd timers:

sudo systemctl enable --now snapper-timeline.timer
sudo systemctl enable --now snapper-cleanup.timer

Manual Snapshots, Diffs, and Rollbacks

Manage point-in-time states before executing risky administrative tasks:

# Create a pre-maintenance snapshot
sudo snapper -c data create -d "Before DB Schema Migration" -t single

# List all tracked snapshots
sudo snapper -c data list

# Compare differences between snapshot 1 and snapshot 2
sudo snapper -c data status 1..2

# Inspect file contents inside read-only snapshot directory
ls -la /mnt/data/.snapshots/1/snapshot/

Filesystem Maintenance: Scrubbing and Balancing Btrfs

Schedule periodic scrub routines to verify data checksums against silent bit corruption:

# Initiate online background integrity scrub
sudo btrfs scrub start /mnt/data

# Check scrub status
sudo btrfs scrub status /mnt/data

# Balance unallocated block groups to reclaim free space
sudo btrfs balance start -dusage=50 /mnt/data

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.