Maybe using Btrfs send / receive could be made to work, but it is not so simple, because to send a filesystem, a read only snapshot must first be made, and then the name of this snapshot is used on the external disk. I don't think there is a way to receive the root filesystem, at /
Esta é a melhor solução. Eu uso instantâneos para fazer backups incrementais rápidos de meus servidores. Você pode fazer o backup do subvolume raiz como qualquer outro, mas não acho que você possa receber na raiz. Mais ao ponto, você não deve fazer isso, porque isso impede que você desfrute de um dos benefícios da captura instantânea: backups incrementais. Feito corretamente, ele só enviará os dados que foram alterados e consumirá apenas o espaço em disco para os dados alterados.
Este script é executado como uma tarefa cron e tira um instantâneo diário da minha partição raiz e, em seguida, usa btrfs send
para enviar uma cópia incremental para minha partição de backup. O script como escrito usa pv
, mas se por algum motivo você não quiser instalá-lo, pode simplesmente remover pv
do meio dos tubos.
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
date=$(date +%Y-%m-%d)
# the path to the partition mount point that we are backing up
source_partition=/
# where backup snapshots will be stored on the local partition
# this is needed for incremental backups
source_snapshot_dir=/snapshots
# where backups will be stored on the backup drive
target_snapshot_dir=/mnt/media/backups/root
if [ ! -d $source_snapshot_dir ]; then
echo 'Creating initial snapshot...'
mkdir --parents $source_snapshot_dir $target_snapshot_dir
# create a read-only snapshot on the local disk
btrfs subvolume snapshot -r $source_partition $source_snapshot_dir/$date
# clone the snapshot as a new subvolume on the backup drive
# you could also pipe this through ssh to back up to a remote machine
btrfs send $source_snapshot_dir/$date | pv | \
btrfs receive $target_snapshot_dir
elif [ ! -d $source_snapshot_dir/$date ]; then
echo 'Creating root volume snapshot...'
# create a read-only snapshot on the local disk
btrfs subvolume snapshot -r $source_partition $source_snapshot_dir/$date
# get the most recent snapshot
previous=$(ls --directory $source_snapshot_dir/* | tail -n 1)
# send (and store) only the changes since the last snapshot
btrfs send -p $previous $source_snapshot_dir/$date | pv | \
btrfs receive $target_snapshot_dir
fi
echo 'Cleaning up...'
# keep the 3 most recent snapshots on the source partition
ls --directory $source_snapshot_dir/* | \
head --lines=-3 | \
xargs --no-run-if-empty --verbose \
btrfs subvolume delete --commit-after
# keep the 28 most recent snapshots on the backup partition
ls --directory $target_snapshot_dir/* | \
head --lines=-28 | \
xargs --no-run-if-empty --verbose \
btrfs subvolume delete --commit-after
(Nota: eu adaptei o script um pouco para torná-lo uma solução geral, e não testei como está escrito. Por favor, sinta-se livre para enviar revisões, se necessário).