Введение
Протокол и программное обеспечение для синхронизации файлов
rsync – это утилита для передачи и синхронизации файлов между компьютером и накопителем, а также между компьютерами в сети, путем сравнения времени изменения и размеров файлов. Она широко распространена в Unix-подобных операционных системах и распространяется под лицензией GPL 3.0 или более поздней версии. rsync написан на языке C как однопоточное приложение. Алгоритм rsync представляет собой разновидность дельта-кодирования и используется для минимизации сетевого трафика. Для дополнительного сжатия данных могут использоваться Zstandard, LZ4 или Zlib. После установления соединения, он запускает rsync на удалённом хосте, после чего обе программы определяют, какие части локального файла необходимо передать для соответствия удалённого файла локальному. Одно из применений rsync – синхронизация репозиториев программного обеспечения на зеркальных сайтах, используемых системами управления пакетами. rsync также может работать в режиме демона (rsyncd), предоставляя и принимая файлы по собственному протоколу rsync (с использованием синтаксиса "rsync://").
История
Эндрю Триджелл и Пол Маккеррас написали оригинальный rsync, который был впервые представлен 19 июня 1996 года. Триджелл обсуждает проектирование, реализацию и производительность rsync в главах 3–5 своей докторской диссертации 1999 года. По состоянию на 2023 год, поддержку rsync осуществляет Уэйн Дэвисон. Благодаря гибкости, скорости и возможности автоматизации rsync стал стандартной утилитой Linux, включенной во все популярные дистрибутивы Linux. Он был портирован на Windows (через Cygwin, Grsync или SFU), FreeBSD, NetBSD, OpenBSD и macOS.
Связь
Процесс rsync работает, взаимодействуя с другим процессом rsync, выступающим в роли отправителя и приемника. При запуске клиент rsync подключается к одноранговому процессу. Если передача выполняется локально (то есть между файловыми системами, смонтированными на одном хосте), то этот процесс-одноранговый может быть создан с помощью `fork` после настройки соответствующих каналов для соединения. Если задействован удаленный хост, rsync запускает процесс для обработки соединения, как правило, с использованием Secure Shell. После установления соединения отправляется команда для запуска процесса rsync на удаленном хосте, который использует установленное соединение. В качестве альтернативы, если на удаленном хосте запущен демон rsync, клиенты rsync могут подключаться, открывая сокет на TCP-порту 873, возможно, через прокси-сервер. Rsync предоставляет множество опций командной строки и файлов конфигурации для указания альтернативных оболочек, параметров, команд, возможно, с полным путем и номерами портов. Помимо использования удаленных оболочек, можно использовать туннелирование, чтобы удаленные порты отображались как локальные на сервере, где работает демон rsync. Эти возможности позволяют настроить уровни безопасности в соответствии с современными требованиями, в то время как для локальной сети может быть достаточно простого демона rsync. Одна из опций – "пробный запуск" (dry run), которая позволяет пользователям проверить аргументы командной строки и смоделировать процесс копирования данных без внесения каких-либо изменений или фактической передачи данных.
Определение файлов для отправки
По умолчанию rsync определяет, какие файлы отличаются между отправителем и получателем, проверяя время модификации и размер каждого файла. Если время или размер файла отличаются между системами, он передает файл из отправляющей в принимающую систему. Поскольку это требует только чтения информации о файлах каталога, это происходит быстро, но такой подход не обнаружит необычные изменения, которые не влияют ни на время, ни на размер. Получатель разбивает свою копию файла на блоки и вычисляет две контрольные суммы для каждого блока: хэш MD5 и более слабую, но более простую в вычислении «скользящую контрольную сумму». Он отправляет эти контрольные суммы отправителю. Отправитель вычисляет скользящую контрольную сумму для каждого участка в своей версии файла, размер которого соответствует размеру блоков, используемых получателем. В то время как получатель вычисляет контрольную сумму только для блоков, начинающихся с полных кратных размера блока, отправитель вычисляет контрольную сумму для всех участков, начинающихся с любого адреса. Если какая-либо из скользящих контрольных сумм, вычисленных отправителем, совпадает с контрольной суммой, вычисленной получателем, этот участок становится кандидатом на то, чтобы не передавать его содержимое, а только указать его местоположение в файле получателя. В этом случае отправитель использует более ресурсоемкий хэш MD5 для проверки, что участок отправителя и блок получателя идентичны. Следует отметить, что участок в отправителе может иметь другой начальный адрес, чем блок в получателе. Это обеспечивает эффективную передачу файлов, которые отличаются вставками и удалениями. Затем отправитель отправляет получателю те части файла, которые не совпали, вместе с информацией о том, где объединить существующие блоки в версию получателя. Это делает копии идентичными. Скользящая контрольная сумма, используемая в rsync, основана на контрольной сумме Adler 32 Марка Адлера, которая используется в zlib, и сама основана на контрольной сумме Флетчера. Если версии файла отправителя и получателя имеют много общих участков, утилите потребуется передать относительно мало данных для синхронизации файлов. Если используются типичные алгоритмы сжатия данных, файлы, которые похожи в несжатом виде, могут сильно отличаться в сжатом виде, и, следовательно, потребуется передать весь файл. Некоторые программы сжатия, такие как gzip, предоставляют специальный режим «rsyncable», который позволяет эффективно синхронизировать эти файлы, гарантируя, что локальные изменения в несжатом файле приводят только к локальным изменениям в сжатом файле. Rsync поддерживает другие ключевые функции, которые значительно облегчают передачу данных или резервное копирование. К ним относятся сжатие и распаковка данных блоками с использованием Zstandard, LZ4 или zlib, а также поддержка протоколов, таких как ssh и stunnel.
Вариации
Утилита rdiff использует алгоритм rsync для создания дельта-файлов, содержащих разницу между файлом A и файлом B (как утилита diff, но в другом формате дельта). Затем дельта-файл может быть применен к файлу A, преобразуя его в файл B (аналогично утилите patch). rdiff хорошо работает с бинарными файлами. Скрипт резервного копирования rdiff поддерживает создание зеркальной копии файла или каталога локально или удаленно через сеть на другом сервере. rdiff backup сохраняет инкрементальные rdiff дельты вместе с резервной копией, что позволяет восстановить любую точку резервного копирования. Библиотека librsync, используемая rdiff, является независимой реализацией алгоритма rsync. Она не использует сетевой протокол rsync и не имеет общего кода с приложением rsync. Она используется Dropbox, rdiff backup, duplicity и другими утилитами. В отличие от librsync, она обеспечивает совместимость с rsync на уровне протокола (версия 29 или 30). Она распространяется под Reciprocal Public License и используется в коммерческом программном обеспечении rsync Acrosync. Программное обеспечение duplicity, написанное на Python, позволяет создавать инкрементальные резервные копии с использованием простых служб хранения, таких как локальная файловая система, sftp, Amazon S3 и многие другие. Duplicity использует librsync для генерации дельта-данных на основе сигнатур предыдущих версий файлов, шифрует их с помощью gpg и сохраняет на бэкенде. Для повышения производительности используется локальный каталог архивов для кэширования сигнатур цепочки резервных копий, но при необходимости их можно повторно загрузить с бэкенда. Начиная с macOS 10.5 и более поздних версий, существует специальный ключ E или расширенных атрибутов, позволяющий сохранять большую часть метаданных файлов HFS+ при синхронизации между двумя машинами, поддерживающими эту функцию. Это достигается путем передачи ресурсной вилки вместе с вилкой данных. zsync — это инструмент, подобный rsync, оптимизированный для множественных загрузок одной версии файла. zsync используется дистрибутивами Linux, такими как Ubuntu, для распространения быстро меняющихся бета-образов ISO. zsync использует протокол HTTP и файлы zsync с предварительно вычисленным скользящим хешем для минимизации нагрузки на сервер и, в то же время, обеспечения передачи дельт для оптимизации сети. Rclone — это инструмент с открытым исходным кодом, вдохновленный rsync, ориентированный на облачные и другие хранилища с высокой задержкой. Он поддерживает более 50 различных провайдеров и предоставляет интерфейс, подобный rsync, для облачных хранилищ. Однако Rclone не поддерживает скользящие контрольные суммы для частичной синхронизации файлов (бинарные дельты), поскольку поставщики облачных хранилищ обычно не предоставляют эту функцию, и Rclone избегает хранения дополнительных метаданных.
Приложения rsync
Программа Операционная система Свободное программное обеспечение Описание Linux macOS Windows Back In Time ✔ ✔ BackupAssist ✔ Прямое зеркалирование или с историей, VSS. cwRsync ✔ На основе Cygwin. Grsync ✔ ✔ ✔ ✔ Графический интерфейс для rsync. LuckyBackup ✔ ✔ ✔ ✔ rclone ✔ ✔ ✔ ✔ Вдохновлен rsync и поддерживает более 50 провайдеров облачного хранилища и других служб хранения с высокой задержкой. Не использует rsync и не поддерживает скачкообразные контрольные суммы и частичную синхронизацию файлов. tym ✔ ✔ ✔ ✔ Time rsYnc Machine – резервное копирование в стиле Time Machine – скрипт Bash.