Como você mencionou, o BTRFS pode fazer isso. É assim que faço backup regularmente do meu laptop (que tem um tempo de atividade de 9 semanas, 5 dias enquanto digito isso).
Dentro do meu sistema de arquivos BTRFS, tenho subvolumes. A maneira como você divide seus dados em subvolumes e como aninhá-los não é importante aqui, desde que você não esteja usando a raiz do sistema de arquivos para armazenar dados dos quais deseja fazer backup.
Os seguintes comandos são para ilustrar a sintaxe e as possibilidades, eu recomendo envolvê-los em um script que é executado como um cronjob ou systemd.timer.
Para tirar um instantâneo de um subvolume:
btrfs subvolume snapshot -r <source> <dest>
Para serializar um instantâneo:
btrfs send <snapshot>
Para serializar um instantâneo relativo a um antigo (ou seja, diferencial):
btrfs send -p <start> <end>
Para gerar um diff, compactando instantaneamente e enviando para o servidor de backup, com o monitoramento "progress":
btrfs send -p <start> <end> | \
pv -bart | \
pbzip2 --best | \
ssh [email protected] "cat > /backups/name.bz2"
Para fazer semelhante, mas recriar os subvolumes do BTRFS no servidor de backup em vez de apenas fluxos BTRFS compactados:
btrfs send -p <start> <end> | \
pv -bart | \
pbzip2 --best | \
ssh [email protected] "pbzip2 -d | \
btrfs receive <target>"
Para restaurar, aplique seus instantâneos para um novo sistema de arquivos BTRFS, via btrfs receive
.
Aqui estão mais informações sobre Backups Incrementais BTRFS