Возобновление прерванного процесса копирования

Как возобновить безопасный и надежный процесс копирования файла $A в резервное расположение $B выполненного с помощью pv "$A" > "$B" или cat "$A" > "$B" ?

(предположим, что файл $A очень большой, например, файл моментального снимка LVM2)

Возможно ли это с dd ?

Предпочитаемые решения: bash или python (предпочтительно python3).

Пример сценария: pv "$A" > "$B" прерывается после копирования 90%. Как возобновить его, чтобы закончить процесс копирования, но не повторить всю работу снова?

Да, вы можете использовать dd для пропуска блоков.

 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 

Важными параметрами здесь являются skip а также seek :

  • skip : пропустить блоки BLOBKS ibs-размера при начале ввода
  • seek : пропускать блоки незанятых блоков BLOCK в начале выхода

Вы хотите rsync :

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

Вы пытались dd skip с смещением реального размера файла B (независимо от размера блока разделов)?

Это доставит вам недостающую часть. В этот момент вы можете cat их вместе в новый файл с cat "$B" "$A2" >> "$C"; #mv "$C" "$B" cat "$B" "$A2" >> "$C"; #mv "$C" "$B" (где $C – это, конечно, недостающая часть на пути с достаточным пространством).

cat отлично подходит для конкатенирования двоичных файлов, и в этом случае у вас нет нескольких заголовков файлов, которые могли бы запускать простые скриптовые слияния. Есть вероятность, что конец $B будет поврежден, но в этом случае вы можете сократить его и перечитать больше $A на начальном этапе dd.