Use USB para sincronizar o diretório grande entre dois servidores desconectados

3

Gostaria de sincronizar um diretório grande entre dois servidores desconectados com um dispositivo USB muito pequeno para conter todo o diretório. Cada servidor tem a maioria dos dados e os arquivos alterados são pequeno o suficiente para caber no meu dispositivo USB.

Existe uma ferramenta que eu possa usar para seguir os seguintes passos?

  1. Dispositivo B: Compute e armazene hashes do diretório D para o dispositivo usb
  2. Dispositivo A: Compute e compare os hashes. Adicione arquivos não sincronizados ao dispositivo usb e anote os arquivos excluídos.
  3. Dispositivo B: Sincronize as alterações do dispositivo USB para o D, tendo agora a mesma versão do Dispositivo A.

Até onde sei, ferramentas como rsync, rdiff-backup e unison não suportam isso, então minha melhor solução para isso seria escrever alguns scripts simples para fazer isso.

    
por Brandon Amos 29.05.2015 / 15:15

2 respostas

2

A maneira mais simples seria obter um cabo cross-over e conectar as duas máquinas. :) Mas se você absolutamente deve fazê-lo com uma memória flash e fita adesiva, você pode fazer assim:

Na máquina destino :

  • find /some/dir -type f -print0 | xargs -0 sha1sum -b | sort >dst.txt
  • copie o arquivo dst.txt para a máquina source

Na máquina source :

  • find /some/dir -type f -print0 | xargs -0 sha1sum -b | sort >src.txt
  • comm -23 src.txt dst.txt | cut -b 43- | (cd /some/dir; tar cJvf - --files-from -) | split -b 3500MB -d
  • copie os arquivos x* , um por um, para a máquina destino
  • rm -f x* src.txt dst.txt

Na máquina destino novamente:

  • cat $( ls -1 x* | sort ) | (cd /some/dir; tar xJvpf -)
  • rm -f x*

Como isso deve funcionar:

  • os arquivos dst.txt e src.txt contêm somas SHA-1 dos arquivos nas duas máquinas
  • comm -23 src.txt dst.txt seleciona os arquivos que existem apenas na máquina source ou existem em ambos, mas são diferentes
  • cut -b 43- mantém apenas os nomes dos arquivos; esta é a lista de arquivos que precisam ser copiados
  • cd /some/dir altera CWD para o diretório de origem
  • tar cJvpf - --files-from - faz um arquivo do grupo; --files-from - lê a lista de arquivos a serem arquivados de stdin , f - diz tar para gravar o arquivo em stdout , J significa compactar o arquivo com xz e v faz tar imprime a lista de arquivos que arquiva em stderr
  • split -b 3500MB -d divide o arquivo em pedaços de 3500MB (suponho que você tenha uma memória flash de 4GB e os dados não caibam todos em uma única execução; talvez você não precise fazer isso)
  • cat $( ls -1 x* | sort ) concatena os arquivos x* ; sort está lá para garantir que isso seja feito na ordem certa
  • cd /some/dir altera CWD para o diretório de destino
  • tar xJvpf - salva os arquivos; J significa descompactar com xz , p significa restaurar permissões, v torna a operação detalhada e f - diz tar para ler o arquivo de stdin .

Por fim, a declaração de responsabilidade do @Stéphane Chazelas: assume que (1) os nomes de arquivos em cada máquina não contêm novas linhas e (2) os diretórios a serem espelhados não são muito profundos (há um limite para o comprimento máximo de arquivos em tar arquivos, e não é muito alto - 200 caracteres IIRC).

    
por 29.05.2015 / 17:11
1

Pode tar em combinação com o parâmetro -N | --newer | --after ajudá-lo? Ele permite que você faça backup de todos os arquivos que foram modificados desde a data especificada.

Se você criar uma lista de arquivos (usando find , por exemplo) antes de cada execução, poderá comparar os arquivos para ver quais arquivos serão removidos. Usando essa saída, você pode remover os arquivos extras do servidor de destino.

    
por 29.05.2015 / 16:12