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.