Btrfs defrag won't break all reflinks
Just the particular instances you point it at. So, if you have subvolume A
, and snapshots S1
and S2
of that subvolume A
, then running defrag on just subvolume A
will break the reflinks between it and the snapshots, but S1
and S2
will still share any data they were originally with each other. If you then take a third snapshot of A
, it will share data with A
, but not with S1
or S2
(because A
is no longer sharing data with S1
or S2
).
Given this behavior, you have in turn three potential cases when talking about persistent snapshots:
- You care about minimizing space used, but aren't as worried about performance.
In this case, the only option is to not run defrag at all.
- You care about performance, but not space usage. In this case, defragment everything.
- You care about both space usage and performance. In this balanced case, I would personally suggest defragmenting only the source subvolume (so only subvolume
A
in the above explanation), and doing so on a schedule that coincides with snapshot rotation. The idea is to defragment
just before you take a snapshot, and at a frequency that gives a good balance between space usage and performance. As a general rule, if you take this route, start by doing the defrag on either a monthly basis if you're doing daily or weekly snapshots, or with every fourth snapshot if not, and then adjust the interval based on how that impacts your space usage.
Source: Btrfs mailinglist, as referenced by Spacedog.
Btrfs defragment readonly snapshot
From my trial and error experience, btrfs defragmenting snapshots (to use the new zstd compression) resulted in 100% Exclusive and 0.00 bytes of shared data.
Before btrfs defragment
:
# btrfs filesystem du -s /mnt/btrfs/Backups.backupdb/d2/readonly-snapshot/
Total Exclusive Set shared Filename
1.41GiB 6.27MiB 1.41GiB /mnt/btrfs/Backups.backupdb/d2/readonly-snapshot/
After btrfs defragment
:
# btrfs filesystem du -s /mnt/btrfs/Backups.backupdb/d2/readonly-snapshot/
Total Exclusive Set shared Filename
1.42GiB 1.42GiB 0.00B /mnt/btrfs/Backups.backupdb/d2/readonly-snapshot/
Shared data goes down to 0.00B