Subvolume layout
| Subvolume | Mount point | Mount options | Purpose |
|---|---|---|---|
@ | / | compress=zstd,space_cache=v2,noatime | Root filesystem |
@boot | /boot | compress=zstd,space_cache=v2,noatime | Kernel and initramfs |
@swap | /swap | compress=zstd,space_cache=v2,noatime,nodatacow | swap.img file |
@snapshots | /.snapshots | compress=zstd,space_cache=v2,noatime | Snapper snapshot storage |
@var_log | /var/log | compress=zstd,space_cache=v2,noatime | Log files (isolated from root) |
@home | /home | compress=zstd,space_cache=v2,noatime | User home directories |
@frigate | /media/frigate | nodatacow | Frigate NVR recordings and snapshots |
@docker | /var/lib/docker | nodatacow | Docker layer storage |
The
@swap and @docker subvolumes use nodatacow because Btrfs Copy-on-Write is counterproductive for large sequential writes and swap files.Snapper configuration
The root subvolume is configured in/etc/snapper/configs/root:
/etc/snapper/configs/root
| Setting | Value | Meaning |
|---|---|---|
TIMELINE_LIMIT_HOURLY | 6 | Keep last 6 hourly snapshots |
TIMELINE_LIMIT_DAILY | 7 | Keep last 7 daily snapshots |
TIMELINE_LIMIT_WEEKLY | 4 | Keep last 4 weekly snapshots |
TIMELINE_LIMIT_MONTHLY | 6 | Keep last 6 monthly snapshots |
TIMELINE_LIMIT_YEARLY | 2 | Keep last 2 yearly snapshots |
SPACE_LIMIT | 0.5 | Stop creating snapshots if less than 50% free |
FREE_LIMIT | 0.2 | Stop creating snapshots if less than 20% free |
Managing snapshots
List snapshots
Create a manual snapshot
View differences between snapshots
Rollback with Snapper
Replicating snapshots to SATA backup
Once a SATA disk is connected (enumerates as/dev/sdX), you can replicate snapshots for off-device backup:
Expanding the Btrfs pool with NVMe
After enabling NVMe inconfig.txt (dtparam=nvme=on), you can add it to the Btrfs pool and mirror the eMMC:
Periodic TRIM
fstrim.timer is enabled by default to run weekly TRIM on eMMC and NVMe: