Я читал несколько руководств о том, как объединить снимки btrfs с rsync, чтобы создать эффективное решение для резервного копирования с историей. Однако все зависит от того, изменяет ли rsync --inplace
только те части файлов, которые действительно изменились, или последовательно перезаписывает весь файл. Если он записывает весь файл, то кажется, что btrfs всегда будет создавать новую копию файла, что сделает идею гораздо менее эффективной.
6 ответов
Если вы передадите rsync два локальных пути, по умолчанию будет использоваться «--whole-file», а не delta-Transfer. Итак, вы ищете "--no-whole-file". Вы также получаете дельта-перевод, если вы запросили '-c'.
Вот как вы можете проверить:
$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3
sent 196831 bytes received 72 bytes 393806.00 bytes/sec
total size is 196608 speedup is 1.00
Затем коснитесь файла и повторите синхронизацию.
$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1
sent 65662 bytes received 31 bytes 131386.00 bytes/sec
total size is 196608 speedup is 2.99
Вы можете убедиться, что он повторно использовал индекс с помощью «ls -li», но обратите внимание, что он отправил целые 64 Кбайт. Попробуйте еще раз с --no-whole-file
$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1
sent 494 bytes received 595 bytes 2178.00 bytes/sec
total size is 196608 speedup is 180.54
Теперь вы отправили только 494 байта. Вы можете использовать strace для дальнейшей проверки того, был ли записан какой-либо файл, но это показывает, что он по крайней мере использовал дельта-передачу.
Обратите внимание (см. Комментарии), что для локальных файловых систем --whole-file
(см. Справочную страницу для rsync). С другой стороны, для всей сети предполагается --no --no-whole-file
, поэтому --inplace
по себе будет вести себя как --inplace --no-whole-file
.
Вот точный ответ, наверное, со ссылкой на правильную часть руководства:
--inplace
[...]
This option is useful for transferring large files
with block-based changes or appended data, and
also on systems that are disk bound, not network
bound. It can also help keep a copy-on-write
*************
filesystem snapshot from diverging the entire con‐
*******************
tents of a file that only has minor changes.
--inplace
только те регионы, которые изменились. Всегда используйте его при записи в Btrfs.
Алгоритм дельта-передачи rsync определяет, передается ли весь файл или только части, которые отличаются. Это стандартное поведение при rsyncing файла между двумя компьютерами для экономии пропускной способности. Это можно переопределить с помощью --whole-file
(или -W
), чтобы rsync
передал весь файл.
--inplace
определяет, будет ли rsync
во время передачи создавать временный файл или нет. Поведение по умолчанию - создать временный файл. Это дает меру безопасности в том, что если передача будет прервана, существующий файл на целевом компьютере останется нетронутым / нетронутым. --inplace
переопределяет это поведение и сообщает rsync
обновить существующий файл напрямую. При этом вы рискуете получить несогласованный файл на конечном компьютере, если передача будет прервана.
Со страницы руководства:
This option changes how rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new copy of the file and moving it into place when it is com-
plete, rsync instead writes the updated data directly to the
destination file.
Это заставляет меня поверить, что он записывает поверх файла целиком - я думаю, что rsync будет почти невозможно работать любым другим способом.
Теоретическая работа по rsync на месте описана в этой статье.
Справочный документ: Д. Раш и Р. Бернс. Rsync на месте: синхронизация файлов для мобильных и беспроводных устройств. Ежегодная техническая конференция USENIX, трек FREENIX, 91-100, USENIX, 2003.
По ссылке:
... Мы изменили существующую реализацию rsync для поддержки реконструкции на месте.
Аннотация: [...] Мы изменили rsync, чтобы он работал на устройствах с ограниченным пространством. Файлы на целевом хосте обновляются в том же хранилище, которое занимает текущая версия файла. Устройства с ограниченным пространством не могут использовать традиционный rsync, поскольку для этого требуется память или хранилище как для старой, так и для новой версии файла. Примеры включают в себя синхронизацию файлов на сотовых телефонах и портативных ПК, которые имеют небольшую память. Алгоритм rsync на месте кодирует сжатое представление файла в графе, который затем топологически сортируется для получения свойства на месте. [...]
Так что это технические детали того, что делает rsync -inplace. Согласно началу статьи:
Мы изменили rsync, чтобы он выполнял задачи синхронизации файлов с восстановлением на месте. [...] Вместо использования временного пространства, изменения в целевом файле происходят в пространстве, уже занятом текущей версией. Этот инструмент можно использовать для синхронизации устройств с ограниченным пространством.
Как становится ясно из ответа @ dataless, это означает, что --inplace
использует то же пространство памяти, но может все же скопировать весь файл в это пространство. В частности, когда копии делаются из / в локальные файловые системы, rsync принимает --whole-file
. Но с другой стороны, когда он подключен к сетевым системам, он принимает параметр --no-whole-file
.