Riprendi il processo di copia interrotto


8

Come riprendere in modo sicuro e affidabile il processo di copia dei file $Anella posizione di backup $Beseguita con pv "$A" > "$B"o cat "$A" > "$B"?

(supponiamo che il file $Asia molto grande, ad esempio il file di istantanea LVM2)

È realizzabile con dd?

Preffered: soluzioni bash o python (preferibilmente python3).

Scenario di esempio: pv "$A" > "$B"interrotto dopo aver copiato il 90%. Come riprenderlo, al fine di completare il processo di copia ma non ripetere di nuovo l'intero lavoro?


Risposte:


12

Sì, puoi usare dd per saltare i blocchi.

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

I parametri importanti qui sono skipoltre a seek:

  • skip: salta BLOCCHI blocchi di dimensioni ibs all'inizio dell'ingresso
  • seek: salta BLOCCHI blocchi di dimensioni obsolete all'inizio dell'output

10

Tu vuoi rsync:

rsync -a --append "$A" "$B"

1
Non voglio usare rsync. Supponiamo che A sia 1 TB e ho già copiato 900 GB di dati e restano 100 GB. rsync leggerebbe 1 TB intero, mentre ho bisogno solo degli ultimi 100G! -> Leggi prima l'algoritmo utilizzato: en.wikipedia.org/wiki/Rsync#Algorithm
Grzegorz Wierzowiecki

1
@GrzegorzWierzowiecki Penso che ti sbagli. A meno che la mia esperienza con rsync non sia del tutto errata, rsync leggerà ciò che deve leggere per verificare che l'output sia corretto, fino a quando non raggiunge un punto in cui iniziano a comparire le disparità, e quindi continuerà da quel punto contrassegnato. Questo sembra essere praticamente esattamente ciò che è necessario.
assassino

1
Perché questo funzioni, devi anche aggiungere --append.
Thor,

Grazie @Thor per aver sottolineato questa opzione. Come ho ricontrollato, sembra che il comportamento di --appendsia cambiato dalla versione 3.0.0. Potresti assicurarmi se attualmente --appendignora la parte già copiata, mentre --append-verifylegge l'intera A per il checksum? (prima della versione 3.0.0. si --appendcomportava come --append-verify-> Questa è la ragione dell'incomprensione)
Grzegorz Wierzowiecki,

5
@GrzegorzWierzowiecki: non avevo notato questo cambiamento. L'ho appena provato e anzi --appendaccoda ciecamente il file. --append-verifyfa lo stesso ma esegue checksum alla fine, se i checksum non corrispondono rsyncsembrano fare una nuova copia.
Thor,

3

Hai provato dd skipcon un offset della dimensione del file reale di B (indipendentemente dalla dimensione del blocco di partizione)?

Questo ti procurerebbe la parte mancante. A quel punto potresti collegarli direttamente catin un nuovo file con cat "$B" "$A2" >> "$C"; #mv "$C" "$B"(dove $Covviamente è la parte mancante su un percorso con spazio sufficiente).

catfunziona bene anche per la concatenazione di file binari e in questo caso non si hanno più intestazioni di file che precederebbero semplici fusioni con script. C'è una possibilità che la fine $Bsia danneggiata, ma in tal caso potresti tagliarla breve e rileggerne di più $Anel passaggio dd iniziale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.