Btrbk: Difference between revisions

imported>Onny
mNo edit summary
Klinger (talk | contribs)
m Link to btrfs article
 
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[https://digint.ch/btrbk/ Btrbk], a tool for creating snapshots and remote backups of btrfs subvolumes.
[https://digint.ch/btrbk/ Btrbk], a tool for creating snapshots and remote backups of [[btrfs]] subvolumes.


== Setup ==
== Setup ==
Line 17: Line 17:
== Configuration ==
== Configuration ==


=== Basic example ===
Following example configuration will create a weekly incremental backup of a local Btrfs subvolume called <code>nixos</code> and sends it compressed to the remote host <code>myhost</code>. The mount point <code>/btr_pool</code>, as referenced above, contains the subvolume.
Following example configuration will create a weekly incremental backup of a local Btrfs subvolume called <code>nixos</code> and sends it compressed to the remote host <code>myhost</code>. The mount point <code>/btr_pool</code>, as referenced above, contains the subvolume.


Line 32: Line 33:
         target = "ssh://myhost/mnt/mybackups";
         target = "ssh://myhost/mnt/mybackups";
         subvolume = "nixos";
         subvolume = "nixos";
        # "nixos" could instead be an attribute set with other volumes to
        # back up and to give subvolume specific configuration.
        # See man btrbk.conf for possible options.
        /*
        subvolume = {
          home = { snapshot_create = "always"; };
          nixos = {};
        };
        */
       };
       };
     };
     };
Line 38: Line 48:
</nowiki>}}
</nowiki>}}


{{Note|Before the release of NixOS 24.05 you'll have to add the corresponding compression tool manually with <code><nowiki>services.btrbk.extraPackages = [ pkgs.lz4 ];</nowiki></code>}}
For the remote host, configure SSH access for Btrbk:


The user has to be created on the remote host and needs root permissions on the commands <code>btrfs</code>, <code>readlink</code> and <code>test</code>, for example via [[sudo]]. For transport stream compression using <code>lz4</code> to work, the package must also be installed on the target host. The target host configuration for Btrbk could look like this:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
services.btrbk = {
  sshAccess = [
    {
      key = "ssh-ed25519 blah";
      roles = [
        "target"
        "info"
        "receive"
      ];
    }
  ];
};
</nowiki>}}
 
=== Local <code>/home</code> Snapshots ===
{{Warning|This is not a backup solution alone. If the entire disk fails, local snapshots will be lost along with it.}}
 
If <code>/home</code> is its own subvolume and important files are backed up separately or combined with the above section, this configuration takes snapshots hourly, retains them for at least a week, and keeps weekly snapshots for two weeks under <code>/snapshots</code>.


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
security.sudo = {
services.btrbk = {
   enable = true;
   instances."home" = {
  extraRules = [{
    onCalendar = "hourly";
     commands = [
     settings = {
       {
       snapshot_preserve_min = "1w";
        command = "${pkgs.coreutils-full}/bin/test";
      snapshot_preserve = "2w";
        options = [ "NOPASSWD" ];
       volume = {
       }
          "/" = {
      {
            snapshot_dir = "/snapshots";
        command = "${pkgs.coreutils-full}/bin/readlink";
            subvolume = "home";
        options = [ "NOPASSWD" ];
          };
      }
        };
      {
      };
        command = "${pkgs.btrfs-progs}/bin/btrfs";
   };
        options = [ "NOPASSWD" ];
      }
    ];
    users = [ "btrbk" ];
  }];
   extraConfig = with pkgs; ''
    Defaults:picloud secure_path="${lib.makeBinPath [
      btrfs-progs coreutils-full
    ]}:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin"
  '';
};
};
# Btrbk does not create snapshot directories automatically, so create one here.
systemd.tmpfiles.rules = [
  "d /snapshots 0755 root root"
];
</nowiki>}}
=== Retention policy ===
The following example takes daily snapshot but won't store them forever with the given retention policy:
* '''7d''': For the most recent week, you will have a '''daily snapshot''' stored from each day.
* '''4w''': After a week, you'll only keep one snapshot per week for the next 4 weeks (so older daily snapshots get removed).
* '''12m''': After a month, the policy will keep only '''monthly snapshots''' for the next 12 months.


environment.systemPackages = [ pkgs.lz4 ];
The option <code>snapshot_preserve_min</code>ensures that all daily snapshots from the last 7 days are preserved, regardless of the other retention rules. It's a safety net to guarantee that no daily snapshot from the past week is deleted prematurely.<syntaxhighlight lang="nix">
</nowiki>}}
services.btrbk.instances."remote_myhost" = {
  onCalendar = "daily";
  settings = {
      snapshot_preserve = "7d 4w 12m";
      snapshot_preserve_min = "7d";
      target_preserve = "7d 4w 12m";
  };
};
</syntaxhighlight>This retention policy will ensure you have a balance between recent, frequent backups (daily) and older, more spaced-out backups (weekly/monthly) while preserving space.


== Manual usage ==
== Manual usage ==