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

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

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

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

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

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

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

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

решение1

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

решение2

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

Чтобы это работало в приватной обстановке:

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

Связанный контент