Возобновить передачу одного файла с помощью rsync

52

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

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

Но с --appendrsync начинается с того, что осталось в прошлый раз.

Я в замешательстве, как я увидел на странице руководства --partial, --inplaceи, --appendпохоже, связан с возобновлением копирования с того, что осталось в прошлый раз. Кто-то может объяснить разницу? Почему не работает --partialили не --inplaceработает для возобновления копирования? Правда ли, что для возобновления копирования rsyncдолжна работать --appendопция?

Кроме того, если частичный файл был оставлен mvили cpне rsync, rsync --appendправильно ли возобновится копирование файла?

Тим
источник

Ответы:

39

Чтобы возобновить прерванную копию, вы должны использовать rsync --append. Из объяснения man-страницы --append:

Это приводит к тому, что rsync обновляет файл, добавляя данные в конец файла, что предполагает, что данные, которые уже существуют на принимающей стороне, идентичны началу файла на отправляющей стороне. [...] Подразумевает --inplace, [...]

Опция --inplaceзаставляет rsync(перезаписывать) содержимое файла назначения напрямую; без --inplace , rsyncбудет:

  1. создать новый файл с временным именем,
  2. скопировать в него обновленный контент,
  3. поменяйте его местами с файлом назначения и, наконец,
  4. удалить старую копию файла назначения.

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

Обратите внимание, что если операция копирования / обновления завершится неудачно на шагах 1.-3. выше, rsyncудалит временный файл назначения; эта --partial опция отключает это поведение и rsyncоставляет частично перенесенные временные файлы в файловой системе назначения. Таким образом, возобновление одной операции копирования файла не принесет большого успеха, если вы не вызвали первый rsyncс помощью --partialили --partial-dir(тот же эффект, что --partialи дополнительно дает указание rsync создать все временные файлы в определенном каталоге).

Риккардо Мурри
источник
Спасибо! Если частичный файл был оставлен mv или cp, а не rsync, будет ли rsync --append правильно возобновить копирование файла?
Тим
1
Короче говоря, --appendзаставляет rsyncповерить, что, если два соответствующих файла имеют разную длину, то более короткий файл идентичен начальной части более длинного. Так что, да, если вы начнете копировать большой файл cpи прервите процесс копирования, то rsync --appendскопируете только оставшуюся часть файла. ( Примечание: если cpпрерывается грохотом системы, существует небольшая вероятность того, что содержимое файлов и метаданные не синхронизирована, то есть, файл поврежден В этом случае работает. rsyncЕще раз , не --append должно решить эту проблему.)
Риккардо Мурри
2
Так что, если я правильно понимаю, нет способа сказать rsync проверить частичный файл и возобновить передачу в этот частично переданный файл ?
Винни
1
@ Винни, очень запоздало: для локальной копии нет разумного способа сделать это. Для сетевой копии это режим по умолчанию при указании --partialбез --append.
Роайма
1
@ Винни --appendи --append-verifyимеет опасный случай сбоя: когда файл получателя имеет тот же размер или больше, но имеет другие данные. Я предлагаю решение, основанное на этом--no-whole-file .
Том Хейл
21

Знайте, что --appendподразумевает --inplace, что подразумевает --partial.

  • При использовании просто --partialвы должны rsyncоставить частичные переводы и возобновить их при последующих попытках.

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

  • --append-verify включает в себя весь файл в проверке контрольной суммы, включая любую часть, переданную в предыдущей передаче.

  • С либо --appendили --append-verifyнеудачная контрольная проверка должна вызвать файл , чтобы быть повторно переданы полностью (используя --inplace)

Вы должны иметь возможность возобновить mvили выполнить cpоперацию, rsyncно вы можете использовать эту --append-verifyопцию для спокойствия.

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

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

Больше информации на странице руководства

TomG
источник
--appendи --append-verifyиметь опасный случай сбоя: когда файл получателя имеет тот же размер или больше, но имеет другие данные. Я предлагаю решение, основанное на этом--no-whole-file .
Том Хейл
@ Документация TomHale предполагает, что для пропуска файла он должен иметь одинаковый размер и время модификации на обоих концах. Если это правдоподобная проблема, то --checksumследует использовать. Я не могу найти его в явном виде, но логически любой из вариантов возобновления должен подразумевать, --no-whole-fileпотому что он --whole-fileдолжен быть несовместимым.
TomG
--append-verifyпропустит файлы одинакового или большего размера с разными датами , которые могут быть «неожиданными». Нет необходимости во --checksum всех файлах, так как rsyncв любом случае будет выполняться проверка всей файловой суммы, но только для того, что она передает.
Том Хейл
--checksumсообщает rsyncконтрольной сумме файлы перед отправкой, что гарантирует передачу всех измененных файлов независимо от их размера / времени. У вас есть источник неожиданного --append-verifyповедения, поскольку то, что вы описываете, не соответствует документации или моему (ограниченному) опыту?
TomG
--append-verifyссылается на --appendкоторый гласит: If a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.Даже если файл должен быть передан из-за --checksum, он все равно может быть пропущен.
Том Хейл,
6

Дэвид Шварц прав, --partial(или лучше -P) делает то, что вы хотите. Я проверил это на 37G-файле, который был остановлен на ~ 8g, по сети. rsync быстро просканировал первые части фрагмента (показывая прогресс по ходу дела благодаря -P), а затем возобновил передачу в конец файла фрагмента.

Стив Бирн
источник
Сетевая копия обрабатывается иначе, чем локальная копия, которая является проблемой здесь.
Роайма
@roaima У вас есть источник для этого или документ, который более подробно объясняет, в чем различия? Я не могу найти его в (огромной) справочной странице.
Йонас Шефер
@JonasWielicki страница руководства ссылается на нее под --whole-fileописанием опции.
roaima
@roaima Большое спасибо! Это также означает, что правильный обходной путь --no-W(который на самом деле работает!)
Йонас Шефер,
@JonasWielicki это крайне неэффективно, поэтому по умолчанию оно отключено. Вы действительно не хотите использовать, --no-Wесли вы не понимаете, что именно это означает для локальных файлов. См. Unix.stackexchange.com/a/181018/100397
roaima
2

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

Дэвид Шварц
источник
Локальные копии не сравниваются, они просто перезаписываются (или --appendпродолжаются со смещения байта).
Роайма
1

По умолчанию rsyncвключается --whole-fileпри переносе с локального диска на локальный диск. Это перезапустит прерванную передачу с самого начала, вместо проверки уже имеющихся частей.

Чтобы отключить это, используйте:

--no-whole-file

Комбинируя это с одним --inplaceили --partialпозволит возобновить передачу позже.

Мой псевдоним для использования rsyncдля копирования:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

Предупреждение : будьте осторожны при использовании, так --append-verifyкак он пропустит все файлы назначения того же размера или больше.

Том Хейл
источник
Для сетевых передач rsyncсравнивает исходные и соответствующие файлы назначения перед передачей, чтобы отправить только те части, которые были изменены (дельта-передача). --no-whole-fileговорит rsyncсделать то же самое для локального копирования. Документация не предполагает, что это повлияет на возобновление частичной передачи отдельных файлов. rsyncпропустит файлы с одинаковым размером и временными метками. Ни то, --append-verifyни другое не --no-whole-fileдолжно изменить это поведение, но оно --checksumдолжно работать либо для душевного спокойствия за счет дискового ввода-вывода
TomG
--append-verifyпропустит файлы одинакового или большего размера с разными датами , которые могут быть «неожиданными». Нет необходимости во --checksum всех файлах, так как rsyncв любом случае будет выполняться проверка всей файловой суммы, но только для того, что она передает.
Том Хейл