Reprendre le processus de copie interrompu

8

Comment reprendre le processus de copie de fichier $Aen toute sécurité et de manière fiable dans l'emplacement de sauvegarde $Bfait avec pv "$A" > "$B"ou cat "$A" > "$B"?

(supposons que le fichier $Asoit très volumineux, par exemple un fichier d'instantané LVM2)

Est-ce réalisable avec dd?

Préféré: solutions bash ou python (de préférence python3).

Exemple de scénario: pv "$A" > "$B"interrompu après avoir copié 90%. Comment le reprendre, afin de terminer le processus de copie sans recommencer tout le travail?

Grzegorz Wierzowiecki
la source
Vous aimerez peut-être utiliser: unix.stackexchange.com/a/12538/9689 et unix.stackexchange.com/questions/32941/…
Grzegorz Wierzowiecki

Réponses:

12

Oui, vous pouvez utiliser dd pour ignorer les blocs.

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

Les paramètres importants ici sont skipainsi que seek:

  • skip: ignorer les blocs de taille ibs BLOCKS au début de l' entrée
  • seek: ignorer les blocs de taille obsolète BLOCKS au début de la sortie
Ulrich Dangel
la source
10

Vous voulez rsync:

rsync -a --append "$A" "$B"
Teddy
la source
1
Je ne veux pas utiliser rsync. Supposons que A représente 1 To et que j'ai déjà copié 900 Go de données et qu'il reste 100 Go. rsync lirait 1 To entier, alors que je n'ai besoin que des 100 derniers Go! -> Lisez d'abord sur l'algorithme utilisé: en.wikipedia.org/wiki/Rsync#Algorithm
Grzegorz Wierzowiecki
1
@GrzegorzWierzowiecki Je pense que vous vous trompez. À moins que mon expérience avec rsync ne soit totalement fausse, rsync lira ce qu'il doit lire pour vérifier que la sortie est correcte, jusqu'à ce qu'elle atteigne un point où des disparités commencent à apparaître, puis elle continuera à partir de ce point marqué. Cela semble être à peu près exactement ce qui est nécessaire.
killermist
1
Pour que cela fonctionne, vous devez également ajouter --append.
Thor
Merci @Thor d'avoir souligné cette option. Comme je l'ai vérifié, il semble que le comportement de --appenda changé depuis la version 3.0.0. Pourriez-vous m'assurer si --appendignore actuellement la partie déjà copiée, tout en --append-verifylisant tout A pour la vérification de la somme de contrôle? (avant la version 3.0.0. --appendse comportait comme --append-verify-> C'est la raison d'un malentendu)
Grzegorz Wierzowiecki
5
@GrzegorzWierzowiecki: Je n'avais pas remarqué ce changement. Je viens de le tester, et en effet --appendajoute aveuglément au fichier. --append-verifyfait la même chose mais exécute les sommes de contrôle à la fin, si les sommes de contrôle ne correspondent pas, rsyncsemble faire une nouvelle copie.
Thor
3

Avez-vous essayé dd skipavec un décalage de la taille réelle du fichier B (indépendamment de la taille du bloc de partition)?

Cela vous obtiendrait la partie manquante. À ce stade, vous pouvez directement catles regrouper dans un nouveau fichier avec cat "$B" "$A2" >> "$C"; #mv "$C" "$B"(où se $Ctrouve bien sûr la partie manquante sur un chemin avec suffisamment d'espace).

catfonctionne très bien pour la concaténation des binaires aussi et dans ce cas, vous n'avez pas plusieurs en-têtes de fichier qui empêcheraient les fusions scriptées simples. Il y a une chance que la fin de $Bsoit corrompue, mais dans ce cas, vous pouvez la raccourcir et relire davantage $Aà l'étape dd initiale.

lynxlynxlynx
la source