Title: Linux BTRFS continuous snapshots | |
Author: Solène | |
Date: 07 October 2022 | |
Tags: linux nixos btrfs backup | |
Description: In this article, I will show how to create regular | |
snapshots of a BTRFS filesystem to avoid data loss due to mistakes. | |
# Introduction | |
As shown in my previous article about the NILFS file system, continuous | |
snapshots are great and practical as they can save you losing data | |
accidentally between two backups jobs. | |
Today, I'll demonstrate how to do something quite similar using BTRFS | |
and regular snapshots. | |
In the configuration, I'll show the code for NixOS using the tool | |
`btrbk` to handle snapshots retention correctly. | |
Snapshots are not backups! It is important to understand this. If | |
your storage is damaged or the file system get corrupted, or the device | |
stolen, you will lose your data. Backups are archives of your data | |
that are on another device, and which can be used when the original | |
device is lost/destroyed/corrupted. However, snapshots are superfast | |
and cheap, and can be used to recover accidentally deleted files. | |
btrbk official website | |
# NixOS configuration | |
The program `btrbk` is simple, it requires a configuration file | |
`/etc/btrbk.conf` defining which volume you want to snapshot regularly, | |
where to make them accessible and how long you want to keep them. | |
In the following example, we will keep the snapshots for 2 days, and | |
create them every 10 minutes. A SystemD service will be scheduled | |
using a timer in order run `btrbk run` which handle snapshot creation | |
and pruning. Snapshots will be made available under `/.snapshots/`. | |
```nix | |
environment.etc = { | |
"btrbk.conf".text = '' | |
snapshot_preserve_min 2d | |
volume / | |
snapshot_dir .snapshots | |
subvolume home | |
''; | |
}; | |
systemd.services.btrfs-snapshot = { | |
startAt = "*:0/10"; | |
enable = true; | |
path = with pkgs; [btrbk]; | |
serviceConfig.Type = "oneshot"; | |
script = '' | |
mkdir -p /.snapshots | |
btrbk run | |
''; | |
}; | |
``` | |
Rebuild your system, you should now have systemd units | |
`btrfs-snapshot.service` and `btrfs-snapshot.timer` available. | |
As the configuration file will be at the standard location, you can use | |
`btrbk` as root to manually list or prune your snapshots in case you | |
need to, like immediately reclaiming disk space. | |
# Using NixOS module | |
After publishing this blog post, I realized a NixOS module existed to | |
simplify the setup and provide more features. Here is the code used to | |
replicate the behavior of the code above. | |
```nix | |
{ | |
services.btrbk.instances."btrbk" = { | |
onCalendar = "*:0/10"; | |
settings = { | |
snapshot_preserve_min = "2d"; | |
volume."/" = { | |
subvolume = "/home"; | |
snapshot_dir = ".snapshots"; | |
}; | |
}; | |
}; | |
} | |
``` | |
You can find more settings for this module in the man page | |
`configuration.nix`. | |
Note that with this module, you need to create the directory | |
`.snapshots` manually before btrbk can work. | |
# Going further | |
`btrbk` is a powerful tool, as not only you can create snapshots with | |
it, but it can stream them on a remote system with optional encryption. | |
It can also manage offline backups on a removable media and a few | |
other non-simple cases. It's really worth taking a look. |