18

Я читал несколько руководств о том, как объединить снимки btrfs с rsync, чтобы создать эффективное решение для резервного копирования с историей. Однако все зависит от того, изменяет ли rsync --inplace только те части файлов, которые действительно изменились, или последовательно перезаписывает весь файл. Если он записывает весь файл, то кажется, что btrfs всегда будет создавать новую копию файла, что сделает идею гораздо менее эффективной.

6 ответов6

26

Если вы передадите 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 .

12

Вот точный ответ, наверное, со ссылкой на правильную часть руководства:

   --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.
4

--inplace только те регионы, которые изменились. Всегда используйте его при записи в Btrfs.

3

Алгоритм дельта-передачи rsync определяет, передается ли весь файл или только части, которые отличаются. Это стандартное поведение при rsyncing файла между двумя компьютерами для экономии пропускной способности. Это можно переопределить с помощью --whole-file (или -W), чтобы rsync передал весь файл.

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

2

Со страницы руководства:

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 будет почти невозможно работать любым другим способом.

0

Теоретическая работа по rsync на месте описана в этой статье.

Справочный документ: Д. Раш и Р. Бернс. Rsync на месте: синхронизация файлов для мобильных и беспроводных устройств. Ежегодная техническая конференция USENIX, трек FREENIX, 91-100, USENIX, 2003.

По ссылке:

... Мы изменили существующую реализацию rsync для поддержки реконструкции на месте.

Аннотация: [...] Мы изменили rsync, чтобы он работал на устройствах с ограниченным пространством. Файлы на целевом хосте обновляются в том же хранилище, которое занимает текущая версия файла. Устройства с ограниченным пространством не могут использовать традиционный rsync, поскольку для этого требуется память или хранилище как для старой, так и для новой версии файла. Примеры включают в себя синхронизацию файлов на сотовых телефонах и портативных ПК, которые имеют небольшую память. Алгоритм rsync на месте кодирует сжатое представление файла в графе, который затем топологически сортируется для получения свойства на месте. [...]

Так что это технические детали того, что делает rsync -inplace. Согласно началу статьи:

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

Как становится ясно из ответа @ dataless, это означает, что --inplace использует то же пространство памяти, но может все же скопировать весь файл в это пространство. В частности, когда копии делаются из / в локальные файловые системы, rsync принимает --whole-file . Но с другой стороны, когда он подключен к сетевым системам, он принимает параметр --no-whole-file .

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