btrbk
Btrbk is a backup tool for BTRFS subvolumes, taking advantage of btrfs specific capabilities to create atomic snapshots and transfer them incrementally to your backup locations. I have been using this tool in all the linux distributions i’ve used including Alpine Linux .
Configuration files
btrbk config file (alpine - homepc2)
The option compat busybox is required for the utility to work with Alpine Linux . The mbuffer package needs to be installed if stream_buffer option is to be used. The below configuration file is used by the btrbk backup script .
transaction_log /var/log/btrbk.log
compat busybox
stream_buffer 512m
incremental yes
lockfile /var/lock/btrbk.lock
snapshot_preserve_min 2d
target_preserve_min no
target_preserve 7d 4w 12m 0y
archive_preserve_min latest
archive_preserve 12m 0y
ssh_identity /etc/btrbk/ssh/id_rsa
volume /mnt/btrfs
snapshot_dir _btrbk_snap
snapshot_create always
target send-receive /mnt/backup/_btrbk
subvolume @
target_preserve 7d 4w 1m 0y
subvolume @home
subvolume @audio
subvolume @video
subvolume @photos
subvolume @docs
subvolume @myhome
The example configuration file comes with sample configuration and explanation for all options. This file can be viewed without comments and modified settings as follows:
cat /etc/btrbk/btrbk.conf.example |grep -v '^ *#'|grep "\S"
Configuration for hourly backup(crontab)
prabu@homepc-lm:/etc$ sudo crontab -l
# Edit this file to introduce tasks to be run by cron.
#
...
#03 * * * * /usr/local/bin/btrbk -c /etc/btrbk/btrbk_hourly.conf run
33 * * * * /usr/local/bin/btrbk -c /etc/btrbk/btrbk_hourly.conf run
Configuration for daily backup(anacron)
prabu@homepc-lm:/etc$ cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root
#current backup system in use
1 7 daily-btrbk /usr/bin/btrbk -q -c /etc/btrbk/btrbk.conf run
Configuration for daily backup in alpine
prabu@homepc2 /e/btrbk [1]> doas cat /etc/crontabs/root
# do daily/weekly/monthly maintenance
# min hour day month weekday command
*/15 * * * * run-parts /etc/periodic/15min
0 * * * * run-parts /etc/periodic/hourly
0 2 * * * run-parts /etc/periodic/daily
0 3 * * 6 run-parts /etc/periodic/weekly
0 5 1 * * run-parts /etc/periodic/monthly
@reboot /usr/sbin/anacron -s
prabu@homepc2 /e/btrbk> cat /etc/anacrontab
#current backup system in use
1 7 daily-btrbk /usr/bin/btrbk -q -c /etc/btrbk/btrbk.conf run⏎
Archive to external HDD
Archive in homepc
Dry run with progress:
sudo btrbk --progress -c ~/scripts/btrbk_external_homepc.conf -n archive /mnt/backup/_btrbk/ /mnt/ext_part1/_btrbk/homepc-lm/
Actual Archive with progress:
$sudo btrbk --progres -c ~/scripts/btrbk_external_homepc.conf archive /mnt/backup/_btrbk/ /mnt/ext_part1/_btrbk/homepc-lm/
--------------------------------------------------------------------------------
Archive Summary (btrbk command line client, version 0.30.0)
Date: Sun Mar 7 10:06:48 2021
Legend:
++. created directory
--- deleted subvolume
*** received subvolume (non-incremental)
>>> received subvolume (incremental)
[-] no action
--------------------------------------------------------------------------------
/mnt/backup/_btrbk/data.*
*** /mnt/ext_part1/_btrbk/homepc-lm/data.20210116
>>> /mnt/ext_part1/_btrbk/homepc-lm/data.20210207
>>> /mnt/ext_part1/_btrbk/homepc-lm/data.20210307
/mnt/backup/_btrbk/@home.*
*** /mnt/ext_part1/_btrbk/homepc-lm/@home.20210211
>>> /mnt/ext_part1/_btrbk/homepc-lm/@home.20210307
/mnt/backup/_btrbk/@.*
*** /mnt/ext_part1/_btrbk/homepc-lm/@.20210214
>>> /mnt/ext_part1/_btrbk/homepc-lm/@.20210307
Archive in onepc
Dry run with progress:
prabu@onepc-lm:~$sudo btrbk --progress -c scripts/btrbk_external_onepc.conf -n archive /mnt/backup/_btrbk/ /mnt/ext_part1/_btrbk/onepc-lm
Actual Archive run with progress:
prabu@onepc-lm:~$ sudo btrbk --progress -c scripts/btrbk_external_onepc.conf archive /mnt/btrfs/_btrbk_snap/ /mnt/ext_part1/_btrbk/onepc-lm/
--------------------------------------------------------------------------------
Archive Summary (btrbk command line client, version 0.27.1)
Date: Sun Mar 7 14:02:59 2021
Legend:
++. created directory
--- deleted subvolume
*** received subvolume (non-incremental)
>>> received subvolume (incremental)
[-] no action
--------------------------------------------------------------------------------
/mnt/btrfs/_btrbk_snap/@.*
*** /mnt/ext_part1/_btrbk/onepc-lm/@.20210113
>>> /mnt/ext_part1/_btrbk/onepc-lm/@.20210207
>>> /mnt/ext_part1/_btrbk/onepc-lm/@.20210307
Archive in alpine Linux
The following added on the client homepc
# mkdir /etc/btrbk/ssh/
# ssh-keygen -t rsa -b 4096 -f /etc/btrbk/ssh/id_rsa -C kprabuanand@gmail.com -N ""
# scp /etc/btrbk/ssh/id_rsa.pub prabu@192.168.1.3:
# btrbk --progress archive /mnt/btrfs/_btrbk_snap/ ssh://192.168.1.3/mnt/NAS/_btrbk/homepc2
Repeated the above steps on homepc
root@homepc:~# mkdir -p /etc/btrbk/ssh
root@homepc:~# cd /etc/btrbk/ssh/
root@homepc:/etc/btrbk/ssh# ssh-keygen -t rsa -b 4096 -f /etc/btrbk/ssh/id_rsa -C kprabuanand@gmail.com -N ""
Your identification is saved in /etc/btrbk/ssh/id_rsa and the public key is saved in /etc/btrbk/ssh/id_rsa.pub.
The following added on the server(pi) In the file “/etc/ssh/sshd_config” the following entry was added under Authentication section:
pizero2W:~$ doas cat /etc/ssh/sshd_config|grep AuthorizedKeysFile
AuthorizedKeysFile .ssh/authorized_keys
mkdir -p /root/.ssh
chmod 700 /root/.ssh
cat /home/prabu/id_rsa.pub >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
With the above setup the archive was done using the below command.
prabu@homepc2 ~> doas btrbk --progress archive /mnt/btrfs/_btrbk_snap/ /mnt/ext_part1/_btrbk/homepc2/
backup script
The backup script below tangles to ~/.local/bin/btrbk_backup↗ . This is symlinked to /usr/local/bin/btrbk_backup and uses this configuration file . In addition to logging the outcome to the system log, the script also triggers an visual indicator on the sway bar by sending a i3blocks signal. The visual indicator remains until the backup is in progress.
#!/bin/sh
# Configuration
INDICATOR_FILE="/tmp/btrbk_running"
I3BLOCKS_SIGNAL=5 # matches the number in $HOME/.config/i3blocks/config
BTRBK_CONFIG="/home/prabu/.config/btrbk/btrbk.conf"
send_signal() {
pkill -RTMIN+$I3BLOCKS_SIGNAL i3blocks
}
# Log the start time
echo "btrbk backup process started."
# Create the lock file
touch "$INDICATOR_FILE"
# Signal i3blocks to refresh
send_signal
# Cleanup runs on EXIT (success or failure)
trap "rm -f \"$INDICATOR_FILE\" &>/dev/null; send_signal" EXIT
# Run the Btrbk Job
# Use 'exec' to replace the current shell process with the btrbk process.
/usr/bin/btrbk -q -c "$BTRBK_CONFIG" run
# Log the end time
echo "btrbk backup process ended."
The above script is invoked by dcron as shown below.
@daily ID=daily-btrbk sleep 120 && /usr/local/bin/btrbk_backup 2>&1 | logger -t daily-btrbk
References
© Prabu Anand K 2020-2026