Btrfs on Linux — Snapshots, RAID and Compression
Btrfs (B-tree File System, pronounced “butter FS”) is a copy-on-write filesystem built into the Linux kernel. It is the default in Fedora, openSUSE, and Steam Deck. Key features over ext4: snapshots, subvolumes, transparent compression, data checksums, and built-in RAID. Unlike ZFS, it requires no out-of-tree modules.
Subvolumes
A subvolume is something between a directory and a partition. It looks like a regular folder but has its own snapshots, quotas, and mount options.
# Create a Btrfs filesystem
sudo mkfs.btrfs /dev/sdb
# Mount
sudo mount /dev/sdb /mnt
# Create subvolumes
sudo btrfs subvolume create /mnt/@
sudo btrfs subvolume create /mnt/@home
sudo btrfs subvolume create /mnt/@snapshots
# List subvolumes
sudo btrfs subvolume list /mnt
Mounting Subvolumes
Each subvolume can be mounted separately:
# In /etc/fstab:
# /dev/sdb / btrfs subvol=@,compress=zstd 0 0
# /dev/sdb /home btrfs subvol=@home,compress=zstd 0 0
sudo mount -o subvol=@ /dev/sdb /
sudo mount -o subvol=@home /dev/sdb /home
This way, a system snapshot doesn’t include the home directory and vice versa.
Snapshots
Snapshots in Btrfs are point-in-time images of a subvolume. Creation is instant thanks to the copy-on-write mechanism — data is not copied until it’s modified.
# Read-only snapshot (ideal for backup)
sudo btrfs subvolume snapshot -r /mnt/@ /mnt/@snapshots/@_2026-02-06
# Writable snapshot (e.g., for testing)
sudo btrfs subvolume snapshot /mnt/@ /mnt/@snapshots/@_test
# List snapshots
sudo btrfs subvolume list -s /mnt
# Delete a snapshot
sudo btrfs subvolume delete /mnt/@snapshots/@_test
Restoring from a Snapshot
# Rename the current subvolume
sudo mv /mnt/@ /mnt/@_broken
# Create a writable snapshot from backup
sudo btrfs subvolume snapshot /mnt/@snapshots/@_2026-02-06 /mnt/@
# Reboot — system returns to the snapshot state
sudo reboot
Automatic Snapshots with Snapper
snapper is a tool from SUSE that automates snapshots — it creates them before and after updates, and removes old ones according to a retention policy:
# Installation
sudo apt install snapper # Debian/Ubuntu
sudo dnf install snapper # Fedora
# Configure for root subvolume
sudo snapper -c root create-config /
# Manual snapshot
sudo snapper -c root create --description "before upgrade"
# List snapshots
sudo snapper -c root list
# Compare changes between snapshots
sudo snapper -c root diff 1..2
Compression
Btrfs supports transparent compression — files are compressed on write and decompressed on read.
# Enable zstd compression (recommended)
sudo mount -o compress=zstd /dev/sdb /mnt
# Or in /etc/fstab:
# /dev/sdb / btrfs compress=zstd 0 0
Available algorithms:
- zstd — best balance of performance and compression (recommended)
- lzo — fastest, weakest compression
- zlib — best compression, slowest
# Check compression ratio
sudo compsize /mnt
# Example output:
# Type Perc Disk Usage Uncompressed
# TOTAL 68% 15G 22G
# zstd 68% 15G 22G
RAID in Btrfs
Btrfs has built-in RAID support — no mdadm or LVM needed:
# RAID1 (mirror) on two disks
sudo mkfs.btrfs -m raid1 -d raid1 /dev/sdb /dev/sdc
# RAID10 on four disks
sudo mkfs.btrfs -m raid10 -d raid10 /dev/sd{b,c,d,e}
# Add a disk to an existing filesystem
sudo btrfs device add /dev/sdd /mnt
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt
Warning: RAID5/6 in Btrfs has known issues and is not recommended for production. For RAID5/6, use ZFS or mdadm instead.
Btrfs vs ext4 vs ZFS
| Feature | ext4 | Btrfs | ZFS |
|---|---|---|---|
| In kernel | Yes | Yes | No (module) |
| Copy-on-write | No | Yes | Yes |
| Snapshots | No | Yes | Yes |
| Compression | No | Yes | Yes |
| Checksums | Metadata | Data + metadata | Data + metadata |
| RAID | No (mdadm) | Built-in | Built-in |
| RAM requirements | Low | Low | High (8 GB+) |
| Maturity | Very high | High | Very high |
When ext4: simple server, laptop, proven stability
When Btrfs: snapshots, compression, desktop/laptop (Fedora, openSUSE)
When ZFS: large storage, NAS servers, critical data integrity
Useful Commands
# Filesystem information
sudo btrfs filesystem show
sudo btrfs filesystem df /mnt
sudo btrfs filesystem usage /mnt
# Scrub — data integrity verification
sudo btrfs scrub start /mnt
sudo btrfs scrub status /mnt
# Defragmentation
sudo btrfs filesystem defragment -r /mnt
# Filesystem check (offline)
sudo btrfs check /dev/sdb