Reanudar el proceso de copia interrumpido

8

¿Cómo reanudar de forma segura y confiable el proceso de copia de archivos $Aen la ubicación de copia de seguridad $Brealizada con pv "$A" > "$B"o cat "$A" > "$B"?

(supongamos que el archivo $Aes muy grande, por ejemplo, el archivo de instantánea LVM2)

¿Se puede lograr con dd?

Preferido: soluciones bash o python (preferiblemente python3).

Escenario de ejemplo: pv "$A" > "$B"interrumpido después de copiar el 90%. ¿Cómo reanudarlo para finalizar el proceso de copia pero no repetir todo el trabajo nuevamente?

Grzegorz Wierzowiecki
fuente

Respuestas:

12

Sí, puede usar dd para omitir los bloques.

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

Los parámetros importantes aquí son skipasí como seek:

  • skip: omite BLOQUES bloques del tamaño de ibs al inicio de la entrada
  • seek: omite BLOQUES de bloques de tamaño obs al inicio de la salida
Ulrich Dangel
fuente
10

Tu quieres rsync:

rsync -a --append "$A" "$B"
Osito de peluche
fuente
1
No quiero usar rsync. Supongamos que A es 1TB y ya he copiado 900GB de datos y quedan 100G. ¡rsync leería 1TB completo, mientras que solo necesito los últimos 100G! -> Lea primero sobre el algoritmo que se utiliza: en.wikipedia.org/wiki/Rsync#Algorithm
Grzegorz Wierzowiecki
1
@GrzegorzWierzowiecki Creo que te equivocas. A menos que mi experiencia con rsync sea completamente incorrecta, rsync leerá lo que necesita leer para verificar que la salida sea correcta, hasta que llegue a un punto en el que comienzan a aparecer disparidades, y luego continuará desde ese punto marcado. Esto parece ser exactamente lo que se necesita.
killermist
1
Para que esto funcione, también debe agregar --append.
Thor
Gracias @Thor por destacar esta opción. Como he comprobado dos veces, parece que el comportamiento de --appendha cambiado desde la versión 3.0.0. ¿Podría asegurarme si actualmente --appendignora la parte ya copiada, mientras --append-verifylee todo A para verificar la suma de verificación? (antes de la versión 3.0.0. se --appendcomportaba como --append-verify-> Esa es la razón del malentendido)
Grzegorz Wierzowiecki
55
@GrzegorzWierzowiecki: No había notado este cambio. Lo acabo de probar y, de hecho, se --appendagrega ciegamente al archivo. --append-verifyhace lo mismo pero ejecuta sumas de comprobación al final, si las sumas de comprobación no coinciden rsyncparece hacer una nueva copia.
Thor
3

¿Intentó dd skipcon un desplazamiento del tamaño de archivo real de B (independiente del tamaño del bloque de partición)?

Eso te daría la parte que falta. En ese punto, podría catjuntarlos directamente en un nuevo archivo con cat "$B" "$A2" >> "$C"; #mv "$C" "$B"(donde, $Cpor supuesto, es la parte que falta en una ruta con suficiente espacio).

cattambién funciona bien para concatenar binarios y, en este caso, no tiene múltiples encabezados de archivo que precedan fusiones simples con script. Existe la posibilidad de que el final $Besté dañado, pero en ese caso podría acortarlo y releer más $Aen el paso inicial de dd.

lynxlynxlynx
fuente