Патч очень большой двоичный файл через медленное соединение
В целях резервного копирования я передал очень большой двоичный файл по сравнительно медленному соединению в восходящем направлении (передача заняла 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 для восстановления файла на удаленной стороне. Протокол делит файл на небольшие блоки и автоматически повторно загружает блоки, хеши которых не соответствуют начальному файлу.
Чтобы заставить его работать в приватной обстановке:
- Отключите DHT на локальных и удаленных бит-торрент-клиентах.
- Откройте локальные бит-торрент-порты на брандмауэре или настройте переадресацию портов SSH.
- Создайте начальный файл на стороне источника. Не используйте трекер. Убедитесь, что клиент также начал заполнять файл.
- Сделайте резервную копию файла на удаленной стороне.
- Скопируйте начальный файл на удаленную сторону и откройте его с помощью клиента.
- Укажите местоположение загрузки для поврежденного файла и выберите опцию, чтобы не начать загрузку! Также отключите параметры для подключения к DHT, обмена пирами и т. Д., Если avaialbe.
- Попросите клиента перепроверить загруженный файл. Следует сообщить процент загрузки, который почти завершен.
- Добавьте локальный клиент в качестве пира к загрузке
- Начать загрузку