Crie um backup diferencial com rsync de um diretório na minha unidade local para outro diretório na mesma unidade

4

Como posso usar o rsync (mas nem o rsnapshot nem o rdiff-backup nem qualquer outro aplicativo) para criar um backup diferencial de um diretório localizado na minha unidade local para outro diretório localizado na mesma unidade local ?

F. Hauri postou o seguinte em uma pergunta para Como criar um backup local? :

#!/bin/bash
backRepo=/media/mydisk
backSrce=/home/user
backDest=home
backCopy=copy
backCount=9

[ -d "$backRepo/$backDest" ] || mkdir "$backRepo/$backDest"

cd $backSrce || exit 1
rsync -ax --delete --exclude '*~' --exclude '.DStore' . "$backRepo/$backDest/."

cd $backRepo
[ -d "$backCopy.$backCount" ] && rm -fR "$backCopy.$backCount"
for ((i=$backCount;i--;));do
    [ -d "$backCopy.$i" ] && mv "$backCopy.$i" "$backCopy.$((i+1))"
  done
((i++))

cp -al $backDest $backCopy.$i

Parece que o script acima está bem próximo do que eu quero, mas, francamente, apesar de gastar cerca de uma hora estudando Easy Automated Snapshot- Backups de estilo com Linux e Rsync Eu ainda tenho uma vaga idéia de como fazer o rsync fazer o que eu quero.

Aqui está o meu caso de uso:

Estou editando um vídeo localmente na minha máquina. A soma de todas as centenas de arquivos associados a esse vídeo será menor que 5 GB (cinco gigabytes).

Atualmente, uso o Grsync para fazer backup da minha unidade interna em uma unidade USB externa. Embora eu realmente tenha descoberto como realizar a tarefa idêntica usando o rsync, prefiro usar o Grsync porque eu preciso apenas ativá-lo e depois clicar em um botão para fazer o backup do meu diretório interno contendo meus arquivos de vídeo para minha unidade USB externa. Todo o processo é suave como seda.

A cada poucas horas, quero uma maneira bastante tranquila de fazer backup dos dados mencionados acima associados ao meu vídeo em minha conta do Google Drive. Não me importo de escolher manualmente enviar uma pasta para o Google Drive. Na verdade, eu prefiro ter que fazer isso porque isso me ajudaria a garantir que o backup estava realmente sendo realizado.

De tempos em tempos, antes de dormir, copiei toda a pasta que contém os arquivos de vídeo, que contêm muitos dados, até a minha conta do Google Drive.

Eu prefiro backups diferenciais para backups incrementais, porque no caso de precisar restaurar meus dados do Google Drive, provavelmente seria possível fazer isso manualmente sem ficar confuso.

Por favor, tenha em mente que eu certamente não sou um administrador de sistemas unix em uma grande empresa que suporta centenas de usuários. Eu sou apenas um cara que quer um método fácil, mas não necessariamente um método totalmente automatizado, para fazer backup de seus dados offsite a cada poucas horas em caso de uma perda catastrófica de dados, o que provavelmente seria devido ao roubo do meu computador . Tenho quase certeza de que o rsync pode fazer o que eu quero. Portanto, estou relutante em instalar outro aplicativo.

    
por Yekutiel 21.09.2016 / 10:17

1 resposta

0

Aqui está você!

#!/bin/bash

# written by strobelight, you know who you are.
# license, MIT, go for it.

me='basename $0'

EXCLUDES="\
    --exclude '*~'
    --exclude '.DS_Store'
"

CANDIDATES=/tmp/candidates

usage() {
    cat <<EOF

$me last_diff_dir new_diff_dir [ dir_to_copy ]

where:
    last_diff_dir  is the directory containing the last differential
    new_diff_dir   is the directory you want files saved to
    dir_to_copy    is optional and is the directory to copy from (default .)

cd directory_to_backup
Full backup: $me full_back full_back
Diff backup: $me full_back diff_1
Diff backup: $me full_back diff_2

EOF
    exit 1
}

get_dir() {
    HERE='pwd'
    cd $1
    x='pwd'
    cd $HERE
    echo $x
}

if [ $# -lt 2 ]; then
    usage
fi

LAST_DIR="$1"
NEW_DIR="$2"
DIR_TO_COPY="${3:-.}"

mkdir -p "$LAST_DIR" || exit 1
mkdir -p "$NEW_DIR" || exit 1

[ -d "$LAST_DIR" ] || usage
[ -d "$NEW_DIR" ] || usage
[ -d "$DIR_TO_COPY" ] || usage

LAST_DIR='get_dir "$LAST_DIR"'
NEW_DIR='get_dir "$NEW_DIR"'
DIR_TO_COPY='get_dir "$DIR_TO_COPY"'

# get list of what's different
eval rsync -v --dry-run -axH --delete --update $EXCLUDES "$DIR_TO_COPY/" "$LAST_DIR" | awk '
    /building file list/ { next }
    /^$/ {next}
    /bytes.*received/ { nextfile }
    {
        for(i=5;i<NF;i++) {
            printf("%s ",$i)
        }
        printf("%s\n",$NF)
    }
    ' | sed 's:/$::' > $CANDIDATES
#cat $CANDIDATES

# use list to backup 
eval rsync --files-from=$CANDIDATES -lptgoDxH --delete $EXCLUDES ${DIR_TO_COPY}/ $NEW_DIR

Por exemplo, meu diretório atual tem 3 arquivos 8k:

$ ls -1sk
total 24
 8 seg1
 8 seg2
 8 seg3

Meu backup completo ainda não existe, vamos chamar esse diretório full_bak

ls ../full_bak
ls: ../full_bak: No such file or directory

Primeiro, precisamos de um backup completo para fazer diferenciais. Eu copiei o script para meu diretório $ HOME / bin como test123.sh. Quando os dois argumentos são os mesmos, essencialmente, está executando um backup completo.

$HOME/bin/test123.sh ../full_bak ../full_bak

saídas de script

.
seg1
seg2
seg3

Agora olhe para ../ full_bak

$ ls -1sk ../full_bak
total 24
 8 seg1
 8 seg2
 8 seg3

Faça algumas alterações

dd if=/dev/zero of=seg2 bs=512 count=11

Confirme se existem diferenças:

$ diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ

Agora crie um diferencial

$ $HOME/bin/test123.sh ../full_bak ../differential1
seg2

Veja o diferencial tendo apenas o arquivo diferente do último backup completo

$ ls -1sk ../differential1/
total 8
 8 seg2

Faça outra alteração

dd if=/dev/zero of=seg4 bs=512 count=10

Verifique o que é diferente

diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Only in .: seg4

e vemos que temos um novo arquivo que não está em nosso backup completo e um arquivo alterado de antes.

Faça outro diferencial em outro diretório

$ $HOME/bin/test123.sh ../full_bak ../differential2
.
seg2
seg4

e veja o novo diferencial tem o 1º diferencial assim como o novo arquivo

$ ls -1sk ../differential2
total 16
 8 seg2
 8 seg4

Backups diferenciais

Aqui está um wrapper de backup completo usando test123.sh:

#!/bin/bash

FULLDIR=/media/mydisk/home
SRCDIR=/home/user

$HOME/bin/test123.sh $FULLDIR $FULLDIR $SRCDIR

Aqui está um script diferencial que cria subdiretórios baseados na hora:

#!/bin/bash

FULLDIR=/media/mydisk/fullbackup/home
DIFFDIR=/media/mydisk/differentials/home
SRCDIR=/home/user
DIFFSUB='date '+BAK_%H''

$HOME/bin/test123.sh $FULLDIR $DIFFDIR/$DIFFSUB $SRCDIR
    
por 22.09.2016 / 06:23