Возобновить прерванный процесс копирования

8

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

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

Это достижимо с dd?

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

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

Гжегож Вежовецкий
источник
Вы можете использовать: unix.stackexchange.com/a/12538/9689 и unix.stackexchange.com/questions/32941/…
Grzegorz Wierzowiecki

Ответы:

12

Да, вы можете использовать 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-size в начале ввода
  • seek: пропустить блоки BLOBKS obs-size в начале вывода
Ульрих Дангел
источник
10

Вы хотите rsync:

rsync -a --append "$A" "$B"
Тедди
источник
1
Я не хочу использовать rsync. Давайте предположим, что А составляет 1 ТБ, и я скопировал уже 900 ГБ данных, а осталось 100 ГБ. Rsync будет читать всего 1 ТБ, а мне нужны только последние 100 ГБ! -> Прочтите сначала об используемом алгоритме: en.wikipedia.org/wiki/Rsync#Algorithm
Гжегож Вежовецкий,
1
@GrzegorzWierzowiecki Я думаю, что вы не правы. Если мой опыт работы с rsync не является полностью неверным, rsync будет читать то, что нужно прочитать, чтобы убедиться, что вывод верен, пока не достигнет точки, где начнут появляться различия, и затем продолжится с этой отмеченной точки. Похоже, это в значительной степени именно то, что нужно.
убийца
1
Чтобы это работало, нужно также добавить --append.
Тор
Спасибо @Thor за то, что подчеркнули эту опцию. Как я дважды проверил, похоже, что поведение --appendизменилось с версии 3.0.0. Не могли бы вы убедиться, что в данный момент --appendигнорирует уже скопированную часть, а --append-verifyчитает всю А для проверки контрольной суммы? (до версии 3.0.0. --appendвел себя как --append-verify-> Вот причина недопонимания)
Grzegorz Wierzowiecki
5
@GrzegorzWierzowiecki: я не заметил этого изменения. Я только что проверил это, и действительно --appendслепо добавляет к файлу. --append-verifyделает то же самое, но запускает контрольные суммы в конце, если контрольные суммы не совпадают rsync, создается новая копия.
Тор
3

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

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

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

lynxlynxlynx
источник