Патч очень большой двоичный файл через медленное соединение

В целях резервного копирования я передал очень большой двоичный файл по сравнительно медленному соединению в восходящем направлении (передача заняла 2 недели), пересыпая его на смонтированном общем ресурсе cifs (чтобы я мог и смог получить к нему доступ по блокам). Через 2 недели rsync показал ошибку (к сожалению, не смог ее сохранить), но размер файла соответствовал. Также

tail -c 1000000000 myfile.img|md5sum # and
head -c 1000000000 myfile.img|md5sum

совпадают, поэтому начало и конец файла идентичны.

Так как мой нисходящий поток намного быстрее, я снова загрузил полный образ и набрал md5 суммы за все это, и они НЕ совпадают. Так что, видимо, где-то в этих 1,5 ТБ есть хотя бы один бит, который отличается.

Есть ли способ, чтобы сгенерировать "патч" из двух загруженных мной файлов, а затем применить его к удаленному файлу, чтобы снова передавались только неправильные блоки?

Пожалуйста, обратите внимание: у меня нет полномочий для удаленного выполнения кода или использования возможностей rsync, которые требуют удаленного запуска rsync. Я думаю, что я все еще мог бы использовать rsync, и он работает в порядке величины моей скорости загрузки, но мне интересно, есть ли лучший способ использовать тот факт, что у меня есть обе версии локально. Вероятно, было бы не так сложно что-то написать, но я бы предпочел использовать что-то проверенное и сохранить работу.

2 ответа

Решение

(предполагая Linux), если вы считаете, что поврежден только один блок данных или около того, но размер блока не изменился, вы можете использовать cmp -l, Он сравнивает побайтно и с -l дает компенсацию любых различий. Если у вас есть смутное представление о том, с чего начать в файлах, вы можете начать с -i, Если у вас есть смещения по ошибке, вы можете использовать dd skip=... оторваться от исходного файла и dd seek=... conv=notrunc вставить его в сломанный файл. (Сначала проверьте на копии)

Я бы использовал BitTorrent для восстановления файла на удаленной стороне. Протокол делит файл на небольшие блоки и автоматически повторно загружает блоки, хеши которых не соответствуют начальному файлу.

Чтобы заставить его работать в приватной обстановке:

  1. Отключите DHT на локальных и удаленных бит-торрент-клиентах.
  2. Откройте локальные бит-торрент-порты на брандмауэре или настройте переадресацию портов SSH.
  3. Создайте начальный файл на стороне источника. Не используйте трекер. Убедитесь, что клиент также начал заполнять файл.
  4. Сделайте резервную копию файла на удаленной стороне.
  5. Скопируйте начальный файл на удаленную сторону и откройте его с помощью клиента.
  6. Укажите местоположение загрузки для поврежденного файла и выберите опцию, чтобы не начать загрузку! Также отключите параметры для подключения к DHT, обмена пирами и т. Д., Если avaialbe.
  7. Попросите клиента перепроверить загруженный файл. Следует сообщить процент загрузки, который почти завершен.
  8. Добавьте локальный клиент в качестве пира к загрузке
  9. Начать загрузку
Другие вопросы по тегам