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.
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/`.
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.
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.
{ 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.
`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.