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