Espelhar / fazer backup da unidade btrfs do laptop para o disco USB externo conectado às vezes

5

Eu tenho um laptop com uma unidade interna usando o Btrfs . Existem vários subvolumes e instantâneos aqui. Eu quero uma cópia desta unidade a ser feita periodicamente para um disco USB externo de aproximadamente o mesmo tamanho. A unidade externa deve ser inicializável e quase idêntica à interna, para que, se a unidade principal falhar, eu possa simplesmente trocá-la.

Qual é a melhor maneira de conseguir isso?

Abaixo, alguns métodos que considerei:

Eu considerei usar o Btrfs RAID 1, mas isso é realmente projetado para uma unidade permanentemente conectada, então eu suspeito que não funcionaria bem.

Quando eu tinha o mesmo disco e usava o Ext4 em ambos, eu gerenciei essa configuração com o Rysnc, que funcionou bem. Espero que isso não funcione agora, porque o rsync não entenderia os instantâneos e copiaria tudo muitas vezes.

Talvez seja possível usar o envio / recebimento do Btrfs, mas não é tão simples, porque para enviar um sistema de arquivos, um instantâneo somente para leitura deve ser criado primeiro e, em seguida, o nome desse instantâneo é usado no disco externo . Eu não acho que há uma maneira de receber o sistema de arquivos raiz, em /

    
por river 20.10.2014 / 20:41

2 respostas

2

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).

    
por 10.07.2016 / 19:57
-1

Pelo que entendi, você está olhando para criar um espelho (ou perto o suficiente para um) do disco rígido do seu laptop para substituir o disco rígido do laptop no caso de uma falha no disco. A unidade espelhada deve ser conectada via USB e nem sempre pode ser conectada, por exemplo, você pega seu laptop em uma viagem curta, mas deixa o espelhamento no trabalho ou em casa.

Para mim, isso parece um caso para o RAID 1. Isso pode ser feito com o BTRFS ou o MDADM. Em qualquer caso, ao conectar o drive externo ao laptop, você precisará garantir que ele seja visto como o "escravo". Como as gravações mais recentes provavelmente teriam ocorrido no laptop, esse deveria ser o caso. No btrfs, é possível executar uma operação de limpeza (btrfs-scrub).

Como alternativa, você pode usar o fssync, embora seja concedido ssh'ing no host local. O fssync é relatado na página man para funcionar bem com o btrfs.

Com relação aos snapshots e ao uso de rsync ou outras sincronizações, você pode criar snapshots, criar um tanto no espelho externo quanto no disco interno, e apenas não sincronizar os snapshots assumindo snapshots somente de leitura. Se não for somente leitura, você precisaria sincronizar e potencialmente teria o problema que você declarou.

Se você tiver outro sistema, considere a possibilidade de usar o DRBD no modo primário único. Embora você possa conseguir que isso funcione com as duas unidades em um único sistema, vi relatórios que indicam que isso não funciona.

Observe que o RAID, a sincronização e a replicação são considerados, por muitos, não um substituto adequado para um sistema de backup.

    
por 01.03.2015 / 21:10