Retomar o processo de cópia interrompido

8

Como reiniciar o processo de copiar o arquivo $A de forma segura e confiável no local de backup $B concluído com pv "$A" > "$B" ou cat "$A" > "$B" ?

(suponhamos que o arquivo $A seja muito grande, por exemplo, arquivo de instantâneo LVM2)

É possível com dd ?

Soluções Preffered: bash ou python (preferencialmente python3).

Cenário de exemplo: pv "$A" > "$B" interrompido após copiar 90%. Como retomá-lo, a fim de concluir o processo de cópia, mas não repetir todo o trabalho novamente?

    
por Grzegorz Wierzowiecki 28.07.2012 / 19:43

3 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 skip , bem como seek :

  • skip : ignore BLOCKS blocos ibs-sized no início de entrada
  • seek : skip BLOCKS Blocos obs-sized no início da saída
por 29.07.2012 / 00:40
10

Você quer rsync :

rsync -a --append "$A" "$B"
    
por 28.07.2012 / 20:09
3

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

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

cat funciona bem para concatenar binários também e, nesse caso, você não possui vários cabeçalhos de arquivos que precedem as mesclagens com script simples. Há uma chance de que o final de $B esteja corrompido, mas, nesse caso, você pode encurtá-lo e reler mais $A na etapa inicial do dd.

    
por 28.07.2012 / 20:10