Я читал несколько руководств о том, как объединить снимки btrfs с rsync, чтобы создать эффективное решение для резервного копирования с историей. Однако все зависит от того, rsync --inplace
изменяет ли только те части файлов, которые действительно изменились, или последовательно перезаписывает весь файл. Если он записывает весь файл, то кажется, что btrfs всегда будет создавать новую копию файла, что сделает идею гораздо менее эффективной.
21
rsync
читает весь файл, а затем ищет и обновляет только те части, которые необходимы, btrfs скопирует только эти обновленные блоки. Но еслиrsync
читает и пишет весь файл, то это будет проблемой.rsync
не только знает, что может избежать записи всего файла, но и делает это, не копируя его полностью по сети. Умная маленькая программа.Ответы:
Если вы передадите rsync два локальных пути, по умолчанию будет использоваться «--whole-file», а не delta-Transfer. Итак, вы ищете "--no-whole-file". Вы также получаете дельта-перевод, если вы запросили '-c'.
Вот как вы можете проверить:
Затем коснитесь файла и повторите синхронизацию.
Вы можете убедиться, что он повторно использовал индекс с помощью «ls -li», но обратите внимание, что он отправил целые 64 Кбайт. Попробуйте еще раз с --no-whole-file
Теперь вы отправили только 494 байта. Вы можете использовать strace для дальнейшей проверки того, был ли записан какой-либо файл, но это показывает, что он по крайней мере использовал дельта-передачу.
Обратите внимание (см. Комментарии), что для локальных файловых систем
--whole-file
предполагается (см. Справочную страницу для rsync). С другой стороны, через сеть--no-whole-file
предполагается, что само--inplace
по себе будет вести себя как--inplace --no-whole-file
.источник
--inplace
подразумевает--no-whole-file
?--no-whole-file
любом случае не по умолчанию?--inplace
это не--no-whole-file
относится к версии rsync, которую я использовал в 2013 году, но вы можете повторить этот эксперимент со своей версией rsync.inplace
речь идет не о «сканировании одинаковых / отличающихся блоков», а о перезаписи существующего файла сразу, со смещения 0. (В противном случае создается временная копия, и только затем удаляется старый целевой файл, а временная копия переименовывается. Вероятно, считается более безопасным сохранять старый файл как можно дольше, если процесс прерывается. Конечно, это ухудшает производительность, пиковое потребление памяти (например, большие файлы), возможно фрагментацию ...) ...--no-whole-file
всегда подразумевает--inplace
, иначе большая часть прироста производительности исчезла бы. Не могу найти это документально, хотя ...Вот определенный ответ, наверное, со ссылкой на правильную часть руководства:
источник
--inplace
Перезаписывает только те регионы, которые изменились. Всегда используйте его при записи в Btrfs.источник
-vvv
показывает, что он пропускает подходящие блокиАлгоритм дельта-передачи rsync определяет, передается ли весь файл или только части, которые отличаются. Это стандартное поведение при rsyncing файла между двумя машинами для экономии пропускной способности. Это можно переопределить с помощью
--whole-file
(или-W
), чтобы принудительноrsync
передать весь файл.--inplace
имеет дело с темrsync
, будет ли во время передачи создавать временный файл или нет. Поведение по умолчанию - создать временный файл. Это дает меру безопасности в том, что если передача прервана, существующий файл на целевом компьютере останется без изменений.--inplace
переопределяет это поведение и указываетrsync
обновлять существующий файл напрямую. При этом вы рискуете получить несогласованный файл на конечном компьютере, если передача будет прервана.источник
Со страницы руководства:
Это заставляет меня поверить, что он записывает поверх файла целиком - я думаю, что rsync будет почти невозможно работать любым другим способом.
источник
Теоретическая работа по rsync на месте описана в этой статье .
Ссылка на документ: Д. Раш и Р. Бернс. Rsync на месте: синхронизация файлов для мобильных и беспроводных устройств. Ежегодная техническая конференция USENIX, трек FREENIX, 91-100, USENIX, 2003.
По ссылке:
Так что это технические детали того, что делает rsync --inplace. Согласно началу статьи:
Как становится ясно из ответа @ dataless , это означает, что
--inplace
используется то же пространство памяти, но оно все равно может копировать весь файл в это пространство. В частности, когда копии делаются из / в локальные файловые системы, rsync принимает эту--whole-file
опцию. Но с другой стороны, когда он подключен к сетевым системам, он принимает такую--no-whole-file
возможность.источник