How I use snbk for automated Snapper backups with Btrfs send/receive

Using snbk for automated Snapper backups with Btrfs send/receive

I hope this is useful to someone.

I’ve been testing the new snbk tool for automated backups of Snapper snapshots using Btrfs send/receive.

I have to say that, if this can be useful to anyone else, it is actually quite straightforward to configure.

  1. Create a backup configuration

First, you need to create a configuration file telling snbk which Snapper configuration to use and where the backup should be stored.

For example, for my root configuration:

sudo nano /etc/snapper/backup-configs/root.json

My Snapper configurations are:

emanu@fedora ~> sudo snapper list-configs

Configuration │ Subvolume
──────────────┼──────────
home          │ /home
root          │ /
var           │ /var

In this example, root is the name of the Snapper configuration associated with the / subvolume.

I then created the following snbk backup configuration:

{
  "config": "root",
  "target-mode": "local",
  "automatic": true,
  "source-path": "/",
  "target-path": "/media/emanu/hdd_pool/Backup_OS/Fedora_Desktop/root"
}
"automatic": true

This enables automatic transfers and cleanup for the backup configuration through a systemd timer.

There are several other configuration options available. See the snapper-backup-configs documentation for the complete list.

  1. Check the available snapshots

Before starting a transfer, you can use snbk list to see the snapshots associated with the backup configuration:

emanu@fedora ~> sudo snbk list

# │ Date                       │ Source status │ Target status
──┼────────────────────────────┼───────────────┼──────────────
1194 │ Fri 31 Jul 2026, 12:16:52 │ read-only │
1197 │ Sat 1 Aug 2026, 14:44:02  │ read-only │
1210 │ Sun 2 Aug 2026, 15:29:06  │ read-only │
1211 │ Mon 3 Aug 2026, 14:00:47  │ read-only │
1212 │ Mon 3 Aug 2026, 14:15:14  │ read-only │
1213 │ Tue 4 Aug 2026, 13:38:16  │ read-only │
1214 │ Tue 4 Aug 2026, 14:00:46  │ read-only │
1215 │ Tue 4 Aug 2026, 21:29:27  │ read-only │
1216 │ Wed 5 Aug 2026, 14:00:42  │ read-only │
1217 │ Wed 5 Aug 2026, 14:15:21  │ read-only │
1220 │ Thu 6 Aug 2026, 00:00:18  │ read-only │
1225 │ Thu 6 Aug 2026, 23:19:52  │ read-only │
1226 │ Fri 7 Aug 2026, 13:33:41  │ read-only │
1227 │ Fri 7 Aug 2026, 14:00:58  │ read-only │
1228 │ Sat 8 Aug 2026, 14:00:50  │ read-only │
1229 │ Sat 8 Aug 2026, 14:15:46  │ read-only │
1236 │ Sun 9 Aug 2026, 00:00:09  │ read-only │
1237 │ Sun 9 Aug 2026, 10:00:14  │ read-only │
1238 │ Sun 9 Aug 2026, 10:01:30  │ read-only │
  1. Perform a manual transfer

I first tested the transfer manually by using the snapshot number reported by snbk list.

For example, to transfer snapshot 1238:

sudo snbk transfer 1238

The command reports:

Executing transfer for backup configuration 'root'.
Transferring snapshot 1238.

After the transfer completes, running snbk list again shows the snapshot as valid on the target:

1238 │ Sun 9 Aug 2026, 10:01:30 │ read-only │ valid

So the snapshot has successfully been transferred to the backup target.

I’ve only tested the manual part so far. I still need to test it over time to make sure that everything works correctly with the automatic mode.

For example, I still need to verify whether snbk automatically creates a backup whenever a new snapshot is created with Snapper (for example, through Btrfs Assistant), and whether it automatically keeps a certain number of snapshots on the destination.

As mentioned, these are all things I still need to test and understand better.

  1. Backing up the /home subvolume

The same approach can be used for other Snapper configurations.

For example, I also have a home configuration:

sudo nano /etc/snapper/backup-configs/home.json

The configuration is:

{
  "config": "home",
  "target-mode": "local",
  "automatic": true,
  "source-path": "/home",
  "target-path": "/media/emanu/hdd_pool/Backup_OS/Fedora_Desktop/home"
}

Running:

sudo snbk list

now shows the snapshots for the home backup configuration:

Backup-config:home, config:home, source-path:/home, target-mode:local

# │ Date                       │ Source status │ Target status
──┼────────────────────────────┼───────────────┼──────────────
687 │ Wed 5 Aug 2026, 14:00:42 │ read-only │
690 │ Thu 6 Aug 2026, 00:00:18 │ read-only │
696 │ Fri 7 Aug 2026, 14:00:58 │ read-only │
701 │ Sat 8 Aug 2026, 14:00:50 │ read-only │
703 │ Sat 8 Aug 2026, 18:00:11 │ read-only │
704 │ Sat 8 Aug 2026, 19:00:11 │ read-only │
705 │ Sat 8 Aug 2026, 20:00:11 │ read-only │
706 │ Sat 8 Aug 2026, 21:00:09 │ read-only │
707 │ Sat 8 Aug 2026, 22:00:09 │ read-only │
708 │ Sat 8 Aug 2026, 23:00:09 │ read-only │
709 │ Sun 9 Aug 2026, 00:00:09 │ read-only │
710 │ Sun 9 Aug 2026, 10:00:14 │ read-only │

I can then transfer a specific snapshot in exactly the same way:

sudo snbk transfer 710

which gives:

Executing transfer for backup configuration 'home'.
Transferring snapshot 710.

Conclusion

So far, snbk looks quite simple to configure and provides a convenient way to automate Btrfs snapshot replication using btrfs send/receive, while integrating directly with Snapper configurations.

For a system using separate Snapper configurations for /, /home, /var, etc., each configuration can have its own snbk backup configuration and target path.

I haven’t tested the automatic systemd timer extensively yet, but the manual transfers work as expected.

emanu@fedora ~> sudo btrfs subvolume list -t /media/emanu/hdd_pool/Backup_OS/Fedora_Desktop/
ID	gen	top level	path	
--	---	---------	----	
256	6615	5		Backup_Dati
257	6624	5		Backup_OS
259	6604	5		VM
260	6622	257		Fedora_Desktop/root/1238/snapshot
261	6664	257		Fedora_Desktop/home/710/snapshot

Update: I discovered that even if "automatic": true is set in the snbk configuration, the corresponding systemd service is not enabled automatically. It therefore has to be enabled manually.

emanu@fedora ~ [3]> sudo systemctl status snapper-backup.timer
○ snapper-backup.timer - Backup of Snapper Snapshots
     Loaded: loaded (/usr/lib/systemd/system/snapper-backup.timer; disabled; preset: disabled)
     Active: inactive (dead)
    Trigger: n/a
   Triggers: ● snapper-backup.service
       Docs: man:snbk(5)
emanu@fedora ~ [3]> sudo systemctl status snapper-backup.service
○ snapper-backup.service - Backup of Snapper Snapshots
     Loaded: loaded (/usr/lib/systemd/system/snapper-backup.service; static)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: inactive (dead)
       Docs: man:snbk(8)