A man with brains and a shovel

A blog about goals and obstacles, motivation and procrastination, life's random events and getting things done.

Versioned backups with btrfs and btrbk

In my a previous post, I showed how to install Ubuntu 18.04 with btrfs filesystem. Now let's use the superpowers of btrfs and create awesome backups.

My setup: A server running Ubuntu 18.04 on a two ssd-drives in a btrfs raid1 configuration. In addition, there are two old-fashioned cheap hard drives installed. They are twice the size of the root partition, so I have plenty of space for backups.

Initially I wanted to use the commands btrfs subvolume snapshot and the btrfs send and btrfs receive them to the hard drives. In fact I did just that for fun and it worked well. The btrfs-wiki-Article on incremental backups is a good starting point for getting familiar with this.

btrfs send in incremental mode can do so much more than rsync. For example if you rename a directory. Good old rsync will think it's deleted and a new one is created. That results in lots of data to be transferred and stored. To btrfs send the renamed directory is only a few bytes of meta-data.

Then I came across btrbk which seems to do just what I was trying to do with a bunch of scripts.

First, I need to format my hard drives with btrfs:

$ mkfs.btrfs -f  -d raid1 -m raid1 /dev/sdc /dev/sdd -L backuphd
btrfs-progs v4.15.1
See for more information.

Label:              backuphd
UUID:               bee8e186-3047-46e8-bc70-6faf89c0c3e5
Node size:          16384
Sector size:        4096
Filesystem size:    3.64TiB
Block group profiles:
  Data:             RAID1             1.00GiB
  Metadata:         RAID1             1.00GiB
  System:           RAID1             8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  2
   ID        SIZE  PATH
    1     1.82TiB  /dev/sdc
    2     1.82TiB  /dev/sdd

root@linuxserver2:/mnt# btrfs fi sh
Label: none  uuid: 8c33495b-f558-11e8-8c48-ac1f6b156e58
	Total devices 2 FS bytes used 3.06GiB
	devid    1 size 893.75GiB used 5.03GiB path /dev/sda2
	devid    2 size 893.75GiB used 5.03GiB path /dev/sdb2

Label: 'backuphd'  uuid: bee8e186-3047-46e8-bc70-6faf89c0c3e5
	Total devices 2 FS bytes used 112.00KiB
	devid    1 size 1.82TiB used 2.01GiB path /dev/sdc
	devid    2 size 1.82TiB used 2.01GiB path /dev/sdd

Notice the UUID in the above output. We need that for fstab later.

Now I add this to my /etc/fstab

UUID=86b86299-ba2d-40d5-9af3-69a5ee981994 /mnt/backuphd btrfs  compress=lzo,noatime,nodiratime,space_cache,discard 0 2

Now let's create the mount point and mout the drive

$ cd /mnt/
$ mkdir backuphd
$ mount backuphd

Now let's install btrbk

I did not have make, ruby or asciidoctor on my system, so I needed to install that. You can use the tarball of the release, but I prefer the github version.

$ sudo -i
$ git clone
$ cd btrbk
$ apt install make
$ apt install ruby
$ gem install asciidoctor
$ make install
$ cd /etc/btrbk/
$ cp btrbk.conf.example btrbk.conf

This is my running btrbk.conf. Notice the # before stream_buffer to comment it out. See the instructions for details

transaction_log            /var/log/btrbk.log
#stream_buffer  512m                                                          
snapshot_dir               _btrbk_snap

# Keep all snapshots for 2 days on ssd
snapshot_preserve_min   2d
# Keep 14 daily snapshots on ssd
snapshot_preserve       14d

target_preserve_min     no
# Keep 20 daily, 10 weekly and all monthly backups on /mnt/backuphd/
target_preserve         20d 10w *m

# Useful for creating extra archive copies (clones) from your backup disks.
# I don't use this, yet
archive_preserve_min    latest
archive_preserve        12m 10y

volume /mnt/btrfs_ssd
  subvolume @*
    target send-receive      /mnt/backuphd/_btrbk

Btrbk does not create the directories. Let's take care of that.

$ mkdir /mnt/btrfs_ssd/_btrbk_snap
$ mkdir /mnt/backuphd/_btrbk

And now we can run btrbk for the first time.

$ btrbk run

Now I have subvolumes containing all my data on both drives.

More commands are here

Now let's run this command every hour by adding this line to /etc/crontab.

50 *    * * *   root    btrbk run -q

This should take care of versioning the files and retaining copies according to /etc/btrbk/btrbk.conf