3

Я пытаюсь передать большой (~ 3 ГБ) файл между двумя компьютерами Unix.

Я могу использовать scp или rsync, но иногда передача повреждена. (Я должен проверить вручную.) Я могу разбить файл на части и передать их, а затем контрольную сумму, а затем рекомбинировать, но это утомительно.

Существует ли одна команда для правильной передачи большого файла между двумя машинами Unix? Я хочу, чтобы он автоматически проверял контрольную сумму обеих копий и продолжал повторять передачу (или ее фрагменты) до тех пор, пока он не получит все байты через провод правильно.

4 ответа4

7

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

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

6

Используйте опцию -c (контрольная сумма) в rsync.

rsync -azcvPh file1 user@remotehost:/tmp/

Опция -P отображает статистику прогресса и поможет вам понять, где / когда прервется передача файлов. -H делает его "читаемым человеком", а -z сжимается.

3

Вы используете лучшие команды, но ваш компьютер не работает. Я настоятельно рекомендую запустить memtest86+ на обеих машинах за ночь, чтобы проверить вашу оперативную память.

1

Вы всегда можете установить битрорент между хостами, но я не уверен, как это автоматизировать.

Я не делаю такого рода вещи часто, поэтому я бы не стал писать сценарии. Вместо этого я бы собрал большую строчку, чтобы сделать работу. Технически, это не одна команда, а все в одной строке. Это не сложно, если вы делаете это часто.

$ md5sum bigfile > bigfile.md5 ; export BIGFILE="notdone" ; while [ "$BIGFILE" eq "notdone" ] ; do rsync --checksum --partial bigfile* user@remotehost:path/to/put/it/in/ ; ssh user@remotehost "cd path/to/put/it/in/; md5sum -c < bigfile.md5" | grep -Ev 'OK$' | [ `wc -l` == "0" ] && BIGFILE="done" ; done

Это делится на:

$ md5sum bigfile > bigfile.md5 ;         \  # create our own checksum
  export BIGFILE="notdone" ;             \  # set our check variable
  while [ "$BIGFILE" == "notdone" ]; do  \  # recheck variable state after each pass
     rsync --checksum --partial bigfile* \  # call rsync to copy
          user@remotehost:path/to/put/it/in/ ; \  # and call ssh to check
     ssh user@remotehost                 \  # connect with ssh
       "cd path/to/put/it/in/; md5sum -c < bigfile.md5" \ # and run the check
          | grep -Ev 'OK$'               \  # ignore good output
          | [ `wc -l` == "0" ]           \  # if we didn't find one
            && BIGFILE="done" ;          \  # set our get-out-of-jail card
  done                                   \  # and we're done

Вы должны настроить SSH для входа на ваш хост с ключом авторизации для запуска без взаимодействия. Если вы это сделаете, поместите туда эхо-оператор, чтобы сказать, где он находится.

Протестировано, но я ожидаю, что параметры rsync могут быть изменены.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .