Назад | Перейти на главную страницу

Могу ли я проверить скачивание большого файла по частям через http

Я скачиваю большой файл http через wget, 1,2 ТБ. Загрузка занимает около недели и уже дважды содержала повреждения (не удалось выполнить проверку md5, на выполнение которой требуется несколько дней).

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

Файл tar archive, поэтому я считаю, что повреждения каждого блока можно последовательно идентифицировать во время распаковки.

На стороне сервера вы можете использовать dd и md5sum для контрольной суммы каждого фрагмента файла:

#!/bin/bash
FILENAME="$1"
FILESIZE=`stat --printf="%s" $FILENAME`
CHUNKSIZE=536870912 # 512MB
CHUNKNUM=0
while ! grep -q 'cannot skip' hash.log 2> /dev/null ; do
    dd if=$FILENAME bs=$CHUNKSIZE skip=$CHUNKNUM count=1 2> hash.log | md5sum >> $FILENAME.md5
    CHUNKNUM=$(( CHUNKNUM + 1 ))
done
rm hash.log

У вас останется один $FILENAME.md5 файл со всеми хэшами чанков.

Теперь вы можете загрузить этот большой файл и контрольные суммы, запустить этот сценарий для файла и сравнить хэши. Если какой-либо фрагмент получает несоответствующий хэш, вы можете использовать curl для загрузки только части файла (если сервер поддерживает RANGE) и исправления файла с помощью dd.

Например, если блок 2 получает несоответствие хешей:

curl -s -r 536870912-1073741824 | dd of=somelargetarfile.tar seek=536870912 conv=notrunc

Это загрузит фрагмент 2 и пропатчит им большой tar-файл.

Ответ ThoriumBR хорош, но я хотел бы добавить несколько дополнительных советов на случай, если вы не можете получить доступ к удаленному серверу.

У вас уже есть одна (или несколько) некорректных загрузок локально.
Используя уловку разделения, предлагаемую ThoriumBR, вы можете разделить эти файлы локально и использовать хорошие части.
Сравните каждый из этих фрагментов с тем же фрагментом, загруженным с помощью curl (согласно последней инструкции ThoriumBR). Если у вас есть 2 идентичных фрагмента (двоичный diff, нет необходимости в медленном md5), вы можете быть относительно уверены, что это хороший фрагмент. Так что сохраните его где-нибудь в другом месте и повторите со следующим фрагментом.

Итак: Для каждого фрагмента: сравните свои локальные копии (если у вас их больше 1), добавьте недавно загруженные копии и сравните, пока не найдете 2 идентичных фрагмента: это тот, который нужно сохранить.

Это небольшая ручная работа, но выполнимая. Вы даже можете создать сценарий для всего процесса, но выполнение этого (и отладка сценария) может не стоить усилий.

На исходном сервере создайте BitTorrent .torrent и добавьте существующее местоположение в качестве исходного URL-адреса веб-сайта. BitTorrent проверит чанки. Любой клиент, которому удается загрузить копию, при желании может ее заполнить.

Это действительно требует хорошей копии файла для создания .torrent. Очень похоже на решение ThoriumBR, но с другими инструментами.

Если у вас все еще есть неудачные файлы и / или контрольные суммы, сравните все и контрольную сумму. Один и тот же результат каждый раз может указывать на правильность передачи, но удаленный файл не соответствует его известной контрольной сумме.