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.
       
 (HTM) 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.