Может ли rsync возобновиться после прерывания?

Я использовал rsync для копирования большого количества файлов, но моя ОС (Ubuntu) неожиданно перезапустилась.

После перезагрузки я снова запустил rsync, но из вывода на терминале я обнаружил, что rsync все еще скопировал уже скопированные ранее. Но я слышал, что rsync способен находить различия между источником и получателем и, следовательно, просто копировать различия. Поэтому, в моем случае, если rsync может возобновить то, что было в последний раз?

141 голос | спросил Tim 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 16 Sep 2012 03:36:31 +0400 2012, 03:36:31

4 ответа


224

Прежде всего, что касается части «возобновления» вашего вопроса, --partial просто сообщает получающей части сохранить частично переданные файлы, если конец отправки исчезает, как если бы они были полностью перенесены.

При передаче файлов они временно сохраняются в виде скрытых файлов в целевых папках (например, .TheFileYouAreSending.lRWzDC) или специально выбранной папке, если вы установите --partial-dir. Когда сбой передачи и --partial не установлен, этот скрытый файл останется в целевой папке под этим загадочным именем, но если установлен --partial, файл будет переименовано в фактическое имя целевого файла (в данном случае TheFileYouAreSending), даже если файл не является полным. Дело в том, что позже вы можете завершить передачу, снова запустив rsync с помощью --append или --append-verify.

Итак, --partial не сам возобновляет неудачную или отмененную передачу. Чтобы возобновить его, вам нужно будет использовать один из вышеупомянутых флагов в следующем прогоне. Итак, если вам нужно убедиться, что цель никогда не будет содержать файлы, которые выглядят нормально, но на самом деле неполные, вы не должны использовать --partial. И наоборот, если вы хотите, чтобы вы никогда не оставляли затерянные файлы, которые скрыты в целевом каталоге, и вы знаете, что позже сможете завершить передачу, --partial помогите вам.

Что касается переключателя --append, упомянутого выше, это фактический переключатель «resume», и вы можете использовать его независимо от того, используете ли вы --partial

Итак, чтобы подвести итог, если вы перемещаете большие файлы, и хотите возобновить отмененную или неудачную операцию rsync с точной точки, в которой остановлен rsync, вам нужно использовать - append или --append при следующей попытке.

Как @Alex указывает ниже, поскольку версия 3.0.0 --append-verify теперь имеет новую опцию, rsync, которая ведет себя как --append-verify до этого коммутатора. Вероятно, вам всегда нужно поведение --append, поэтому проверьте свою версию с помощью --append-verify. Если вы находитесь на Mac и не используете rsync --version из rsync, вы, по крайней мере, до El Capitan, включая более старую версию, и должны использовать - append, а не homebrew. Почему они не сохраняли поведение в --append и вместо этого с именем newcomer --append-verify немного озадачивают. В любом случае --append в --append-no-verify до версии 3 совпадает с --append в более новых версиях.

rsync не опасен: он всегда будет читать и сравнивать данные с обоих концов, а не просто считать, что они равны. Он делает это с помощью контрольных сумм, поэтому в сети это легко, но для этого требуется чтение общего объема данных на обоих концах провода, прежде чем он сможет фактически возобновить передачу, добавив к цели.

Во-вторых, вы сказали, что «слышали, что rsync способен находить различия между источником и получателем и, следовательно, просто копировать различия».

Это правильно, и это называется дельта-переносом, но это совсем другое дело. Чтобы включить это, вы добавляете переключатель --append-verify или --append-verify. Когда этот переключатель используется, rsync будет проверять файлы, которые существуют на обоих концах провода. Он делает это в кусках, сравнивает контрольные суммы на обоих концах, и если они отличаются друг от друга, он передает только разные части файла. Но, как указывает @Jonathan, сравнение выполняется только тогда, когда файлы имеют одинаковый размер на обоих концах - разные размеры заставляют rsync загружать весь файл, переписывая цель с тем же именем.

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

Примечательно, что если вы используете -c для передачи партии файлов, которые полностью новы в целевой системе, rsync все равно будет вычислять свои контрольные суммы в исходной системе перед их переносом. Почему я не знаю:)

Итак, короче:

Если вы часто используете rsync, чтобы просто «переместить материал с A на B» и хотите, чтобы опция отменила эту операцию, а затем возобновите ее, не использовать --checksum, но сделать используйте --checksum.

Если вы используете rsync для резервного копирования файлов часто, использование --checksum, вероятно, не сделает для вас многого, если у вас нет привычки отправлять большие файлы, которые непрерывно растут в размерах, но редко изменяются после их написания. В качестве бонусного совета, если вы создаете резервную копию для хранения, которая поддерживает моментальные снимки, такие как --append-verify или --append-verify, добавление переключателя btrfs поможет вам уменьшить размеры снимков, поскольку измененные файлы не воссозданы, а измененные блоки записываются непосредственно поверх старых. Этот переключатель также полезен, если вы хотите избежать rsync, создавая копии файлов на целевом объекте, когда произошли только незначительные изменения.

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

ОБНОВЛЕНО 2015-09-01 Изменено, чтобы отражать точки, сделанные @Alex (спасибо!)

ОБНОВЛЕНО 2017-07-14 Изменено, чтобы отразить точки, сделанные @Jonathan (спасибо!)

ответил DanielSmedegaardBuus 1 62014vEurope/Moscow11bEurope/MoscowSat, 01 Nov 2014 15:32:51 +0300 2014, 15:32:51
31

TL; DR:

Просто укажите частичную директорию, которую рекомендуют справочные страницы rsync:

--partial-dir=.rsync-partial

Более длинное объяснение:

Для этого используется встроенная функция, использующая параметр --partial-dir, который имеет несколько преимуществ перед --partial и --append-verify /--append.

Выдержка из страниц руководства rsync:

--partial-dir=DIR
      A  better way to keep partial files than the --partial option is
      to specify a DIR that will be used  to  hold  the  partial  data
      (instead  of  writing  it  out to the destination file).  On the
      next transfer, rsync will use a file found in this dir  as  data
      to  speed  up  the resumption of the transfer and then delete it
      after it has served its purpose.

      Note that if --whole-file is specified (or  implied),  any  par-
      tial-dir  file  that  is  found for a file that is being updated
      will simply be removed (since rsync  is  sending  files  without
      using rsync's delta-transfer algorithm).

      Rsync will create the DIR if it is missing (just the last dir --
      not the whole path).  This makes it easy to use a relative  path
      (such  as  "--partial-dir=.rsync-partial")  to have rsync create
      the partial-directory in the destination file's  directory  when
      needed,  and  then  remove  it  again  when  the partial file is
      deleted.

      If the partial-dir value is not an absolute path, rsync will add
      an  exclude rule at the end of all your existing excludes.  This
      will prevent the sending of any partial-dir files that may exist
      on the sending side, and will also prevent the untimely deletion
      of partial-dir items on the receiving  side.   An  example:  the
      above  --partial-dir  option would add the equivalent of "-f '-p
      .rsync-partial/'" at the end of any other filter rules.

По умолчанию rsync использует случайное временное имя файла, которое удаляется при неудачной передаче. Как уже упоминалось, используя --partial, вы можете заставить rsync сохранить неполный файл , как если бы он был успешно перенесен , так что можно позже добавить его с помощью --append-verify /--append. Однако есть несколько причин, по которым это неоптимально.

  1. Ваши файлы резервных копий могут быть неполными, и, не проверяя удаленный файл, который все еще остается неизменным, не существует способа узнать.

  2. Если вы пытаетесь использовать --backup и --backup-dir, вы только что добавили новую версию этого файла, которая даже не вышли до вашей истории версий.

Однако, если мы используем --partial-dir, rsync сохранит временный частичный файл и возобновит загрузку с использованием этого частичного файла при следующем запуске, и мы не будем страдать от вышеуказанных проблем .

ответил Alexander O'Mara 3 Jam1000000amSun, 03 Jan 2016 09:34:38 +030016 2016, 09:34:38
28

Вам может понадобиться добавить в команду команду -P.

На странице man:

--partial By default, rsync will delete any partially transferred file if the transfer
         is interrupted. In some circumstances it is more desirable to keep partially
         transferred files. Using the --partial option tells rsync to keep the partial
         file which should make a subsequent transfer of the rest of the file much faster.

  -P     The -P option is equivalent to --partial --progress.   Its  pur-
         pose  is to make it much easier to specify these two options for
         a long transfer that may be interrupted.

Итак, вместо:

sudo rsync -azvv /home/path/folder1/ /home/path/folder2

делать:

sudo rsync -azvvP /home/path/folder1/ /home/path/folder2

Конечно, если вы не хотите обновления прогресса, вы можете просто использовать --partial, i.e.:

sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2
ответил N2O 29 J000000Tuesday14 2014, 22:24:32
1

Я думаю, что вы принудительно вызываете rsync, и, следовательно, все данные загружаются, когда вы снова вызываете его. используйте --progress, чтобы скопировать только те файлы, которые не скопированы, и --delete, чтобы удалить любые файлы, если они уже скопированы, и теперь они не существуют в исходной папке. ..

rsync -avz --progress --delete -e  /home/path/folder1/ /home/path/folder2

Если вы используете ssh для входа в другую систему и копирования файлов,

rsync -avz --progress --delete -e "ssh -o UserKnownHostsFile=/dev/null -o \
StrictHostKeyChecking=no" /home/path/folder1/ /home/path/folder2

сообщите мне, есть ли какая-либо ошибка в моем понимании этой концепции ...

ответил Yadunandana 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 16 Sep 2012 20:07:05 +0400 2012, 20:07:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132