Retomar processo de cópia interrompido

8

Como retomar com segurança e confiabilidade o processo de cópia de arquivo $Ano local de backup $Bfeito com pv "$A" > "$B"ou cat "$A" > "$B"?

(vamos supor que o arquivo $Aseja muito grande, por exemplo, arquivo de instantâneo LVM2)

Isso é possível dd?

Preffered: soluções bash ou python (de preferência python3).

Cenário de exemplo: pv "$A" > "$B"interrompido após copiar 90%. Como retomar, para concluir o processo de cópia, mas sem repetir todo o trabalho?

Grzegorz Wierzowiecki
fonte
Você pode gostar de utilizar: unix.stackexchange.com/a/12538/9689 e unix.stackexchange.com/questions/32941/...
Grzegorz Wierzowiecki

Respostas:

12

Sim, você pode usar o dd para pular os blocos.

A="file1"
B="file2"

BLOCKSIZE=512  # default bs for dd

size_b=$(stat -c "%s" "$B")
skip_blocks=$((size_b / BLOCKSIZE))

dd if="$A" of="$B" skip=$skip_blocks seek=$skip_blocks bs=$BLOCKSIZE

Os parâmetros importantes aqui são skipbem como seek:

  • skip: ignore os blocos do tamanho de blocos ibs no início da entrada
  • seek: ignore os blocos obsoletos de BLOCOS no início da saída
Ulrich Dangel
fonte
10

Você quer rsync:

rsync -a --append "$A" "$B"
Urso de pelúcia
fonte
1
Eu não quero usar o rsync. Vamos supor que A tenha 1 TB e eu já copiei 900 GB de dados e há 100 G restantes. rsync iria ler 1 TB inteiro, enquanto eu preciso apenas dos últimos 100G! -> Leia primeiro sobre o algoritmo usado: en.wikipedia.org/wiki/Rsync#Algorithm
Grzegorz Wierzowiecki
1
@GrzegorzWierzowiecki Acho que você está errado. A menos que minha experiência com o rsync esteja totalmente errada, o rsync lerá o que precisa ler para verificar se a saída está correta, até atingir um ponto em que começam a aparecer disparidades e, em seguida, continuará a partir desse ponto marcado. Parece ser exatamente exatamente o que é necessário.
Killermist
1
Para que isso funcione, você também precisa adicionar --append.
Thor
Obrigado @ Thor por enfatizar esta opção. Como verifiquei duas vezes, parece que o comportamento de --appendmudou desde a versão 3.0.0. Você poderia me garantir se atualmente --appendignora a parte já copiada, enquanto --append-verifylê A inteiro para verificação da soma de verificação? (antes da versão 3.0.0. --appendcomportava-se como --append-verify-> Essa é a razão do mal-entendido)
Grzegorz Wierzowiecki
5
@GrzegorzWierzowiecki: Eu não tinha notado essa mudança. Acabei de testar e, de fato, --appendanexa cegamente ao arquivo. --append-verifyfaz o mesmo, mas executa somas de verificação no final, se as somas de verificação não corresponderem rsyncparecerem fazer uma nova cópia.
Thor
3

Você tentou dd skipcom um deslocamento do tamanho real do arquivo B (independente do tamanho do bloco de partição)?

Isso te daria a parte que faltava. Nesse ponto, você pode catreuni-los diretamente em um novo arquivo com cat "$B" "$A2" >> "$C"; #mv "$C" "$B"(onde $Cé claro a parte que está faltando em um caminho com espaço suficiente).

cattambém funciona bem para concatenar binários e, nesse caso, você não possui vários cabeçalhos de arquivos que precedem mesclagens com script simples. Há uma chance de o final $Bestar corrompido, mas, nesse caso, você pode abreviá-lo e reler mais $Ano passo inicial do dd.

lynxlynxlynx
fonte