LINUX.ORG.RU

Синхронизация большого файла с помощью rsync

 


0

5

На удаленном сервере есть файл архива на несколько терабайт, с одним файлом внутри. На локальном сервере есть его копия которая «срезалась» с поврежденного диска, на котором этот архив приехал с удаленного сервера, т.е. файл имеет пустые/дефектные участки внутри файла(архив не проходит тестирование). Возможно ли с помощью rsync «докачать» файл в режиме приведения его к исходному состоянию, т.е. чтобы влились в поврежденный файл недостающие куски с файла на удаленном сервере? Пробовал разные ключи -acvP, почему-то файл начинает перекачиваться заново целиком, а мне это не нужно ибо неделю ждать.

rsync -acvP rsync://10.254.100.1/trans/1.zip /home/1.zip

Размер, имя и удаленного файла и локального совпадают.

Либо есть какие-то иные механизмы докачки такого рода файлов?


На удалённом сервере сгенерировать .torrent для этого файла и встать на раздачу.

На локалхосте добавить его в torrent-клиент и указать существующий файл в качестве пути.

Torrent-клиент проверит целостность фрагментов и перекачает повреждённые.

wandrien ★★★
()
Последнее исправление: wandrien (всего исправлений: 1)

Пробовал разные ключи -acvP, почему-то файл начинает перекачиваться заново целиком, а мне это не нужно ибо неделю ждать.

А как это проявляется? По-умолчанию rsync создаёт новый файл и пишет в него данные из старого локального и из нового с сервера. Причём по медленном интернете хорошо видно, когда подтягиваются данные из сети. Когда известно, что файлы идентичны, просто локальный содержит пробелы, то можно воспользоваться параметром --inplace, чтобы rsync записывал сразу же в существующий локальный файл. Это эффективнее, но и опаснее, когда сначала экспериментируешь.

gag ★★★★★
()

Если не известно, какие именно части файла битые, то всё равно читать весь файл, что бы понять это.

Можно попробовать магию — создать там, где файл цел, суммы par2, передать только их и попробовать восстановить битый файл. Но это надо знать, какой процент файла повреждён. Ну и par2 будет долго пыхтеть. (Вроде есть варианты par2, поддерживающие многопроцессорность, не пробовал.)

Ну а так да, как уже предложили, через торрент. Или писать свой инструмент, что бы считал контрольные суммы для частей файла, а потом на основе этого передать целые блоки на место битых.

greenman ★★★★★
()
Последнее исправление: greenman (всего исправлений: 2)

Сгенери контрольные суммы для каждых 16МБ на обеих сторонах, докачай где не совпадает.

N=0
while true; do
  echo -n "$N "
  dd if=filename bs=16777216 skip=$N count=1 | md5sum | awk '{print $1}'
  N=`expr $N + 1`
done

firkax ★★★★★
()

Если я ничего не путаю, то это все умеет rsync. Он умеет разбивать файл на блоки, сравнивать их и пересылать только отличающиеся части. Почитай внимательно его man (ключи).

urxvt ★★★★★
()
Ответ на: комментарий от greenman

По сети. Ну ты просто делаешь rsync с одной машины и он автоматически запустит на удаленной свой сервер (rsync --server).

https://ru.wikipedia.org/wiki/Rsync#Алгоритм
Тут бегло алгоритм описан. В английской версии детальней.

urxvt ★★★★★
()

Именно это и делает rsync. Разделяет файл на чанки, делает чексуммы с них локально и удалённо и пересылает битый чанк.

Я таким образом на медленном интернете битые dvd iso-образы с дистрибутивами ~ 20 лет назад. В конце rsync покажет, сколько он скачал и передал, будут копейки.

Dimez ★★★★★
()

rsync для этого и создан, скорее всего не хватает ключа –inplace и –no-whole-file

sergej ★★★★★
()
Ответ на: комментарий от wandrien

Я так, кстати, делал, качал 20Гиговый архив. Отлично работает на любом канале.

MoldAndLimeHoney ★★
()
Ответ на: комментарий от Dimez

По дефолту он всё таки качает весь файл. Причём даже не сверяя контрольных сумм, а просто если отличается размер и даты.

kirill_rrr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.