Since Fedora 33 1, BTRFS is the filesystem you get out of the box when you install Fedora. From Fedora 34 2 we’ve got block level compression out of the box too. So, with BTRFS getting lots of attention and use, I went looking through my previous investigations and optimizations to make the most out of the file system.

Snapper

Snapper is mature and well documented 3 so I’m not going to go into much detail about what it is and what it does. As a summary, it wraps functionality to create, introspect, revert and remove BTRFS snapshots. In combination with python3-dnf-plugin-snapper, it makes snapshots before and after the installation of new packages.

Install the packages

dnf install snapper python3-dnf-plugin-snapper

Create a snapper config:

snapper -c root create-config /

Make adjustments to the config at /etc/snapper/configs/root. The ones I made are:

TIMELINE_MIN_AGE="1800"
TIMELINE_LIMIT_HOURLY="5"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="2"
TIMELINE_LIMIT_MONTHLY="1"
TIMELINE_LIMIT_YEARLY="0"

I’m not using cron, so we need to setup the systemd timers. To adjust when the timers run, you can use dropins:

mkdir /etc/systemd/system/snapper-cleanup.timer.d
cat  /etc/systemd/system/snapper-cleanup.timer.d/local.conf
[Timer]
OnUnitActiveSec=1h
EOF mkdir /etc/systemd/system/snapper-timeline.timer.d
cat  /etc/systemd/system/snapper-timeline.timer.d/local.conf
[Timer]
OnCalendar=
OnCalendar=*:0/5
EOF

Enable the systemd timers:

systemctl enable snapper-cleanup.timer
systemctl enable snapper-timeline.timer systemctl start snapper-cleanup.timer
systemctl start snapper-timeline.timer

Verify that they’re running:

list-timers | grep snapper Wed 2021-05-26 00:10:00 IST 1min 36s left Wed 2021-05-26 00:05:09 IST 3min 13s ago snapper-timeline.timer snapper-timeline.service
Wed 2021-05-26 01:00:09 IST 51min left Wed 2021-05-26 00:00:09 IST 8min ago snapper-cleanup.timer snapper-cleanup.service


Note: There is another timer called snapper-boot that tells snapper to take a snapshot on every boot. I didn’t enable it as I felt it didn’t suit my use case.

btrfsmaintenance

Btrfs maintenance 4 is a little more obscure than snapper is. It’s well known enough that it’s been packaged into Fedora. It sets up timers (or cron entries) for 4 functions:

  • balance – moves data around BTRFS extents to make sure it’s distributed evenly around physical volumes
  • defrag – an excerpt from here – Btrfs lays out the data sequentially when files are written to the disk for first time, but a COW design implies that any subsequent modification to the file must not be written on top of the old data, but be placed in a free block, which will cause fragmentation (RPM databases are a common case of this problem). Aditionally, it suffers the fragmentation problems common to all filesystems. This defragmentation routine addresses this problem
  • scrub – Scrub operation reads all data and metadata from the devices and verifies the checksums. On a volument with only 1 disk, it will only highlight bitrot early. On a system with disk redundancy it will repair the affected blocks.
  • trim – The TRIM operation (aka. discard) can instruct the underlying device to optimize blocks that are not used by the filesystem. Off by default so it does not collide with fstrim.timer – I’ve left it disabled as I have the fstrim.timer running out of the box on Fedora

Install the package with the following:

dnf install btrfsmaintenance

This will put the relevant scripts into /usr/share/btrfsmaintenance and puts a config file in /etc/sysconfig/btrfsmaintenance. Once you’ve adjusted the config file, run the following to install and kick off the timers:

cd /usr/share/btrfsmaintenance
btrfsmaintenance-refresh-cron.sh timer

Verify that they’ve been installed:

list-timers | grep btrfs
Mon 2021-05-31 00:00:00 IST 4 days left n/a n/a btrfs-balance.timer btrfs-balance.service
Tue 2021-06-01 00:00:00 IST 5 days left n/a n/a btrfs-defrag.timer btrfs-defrag.service
Tue 2021-06-01 00:00:00 IST 5 days left n/a n/a btrfs-scrub.timer btrfs-scrub.service


I am a devops-er. And a software developer. I like taking the pain out of boring jobs.

Raymond Coetzee © 2024. All rights reserved.

Follow Us