Rsync
Rsync (от англ. remote synchronization) — это утилита для эффективной синхронизации файлов и каталогов в операционных системах семейства Unix, а также в среде Windows (через порты или подсистемы). Разработана Эндрю Триджеллом в 1996 году. Отличается алгоритмом дельта-кодирования, позволяющим передавать только изменённые части файлов, что минимизирует объём передаваемых данных.
История
Исходный код rsync был создан Эндрю Триджеллом (Andrew Tridgell) и Полом Макаскиллом (Paul Mackerras) в 1996 году. Первая версия вышла 19 июня 1996 года. Триджелл разработал алгоритм дельта-кодирования, который позволял вычислять различия между файлами на удалённом и локальном компьютерах без предварительного копирования всего файла. Этот алгоритм лёг в основу протокола rsync.
В 1998 году проект перешёл под эгиду сообщества разработчиков свободного программного обеспечения. Начиная с версии 2.5.7 (2002 год) rsync стал поддерживать шифрование передачи данных через SSH. В 2007 году вышла версия 3.0.0, которая добавила поддержку инкрементального копирования, улучшенную обработку символических ссылок и работу с разреженными файлами.
На 2024 год rsync остаётся стандартным инструментом для синхронизации данных в Unix-подобных системах, встроен в большинство дистрибутивов Linux и macOS.
Принцип работы
Алгоритм дельта-кодирования
Основная особенность rsync — алгоритм «дельта-кодирования» (rolling checksum). При синхронизации файла на удалённом сервере утилита разбивает файл на блоки фиксированного размера (обычно 512 байт или 4 КБ) и вычисляет для каждого блока контрольную сумму (MD5 или SHA-256). Затем эти контрольные суммы сравниваются с контрольными суммами блоков локального файла. Если блоки совпадают, они не передаются; если различаются, передаётся только изменённый блок.
Режимы работы
Rsync может работать в двух основных режимах:
- Локальный режим — копирование файлов между каталогами на одном компьютере (аналог
cpс опциями). - Удалённый режим — синхронизация через SSH, RSH или собственный протокол rsync (демон rsync). При использовании SSH данные шифруются.
Собственный протокол
Rsync может работать как клиент-серверное приложение. Серверная часть (демон rsync) запускается на порту 873 (по умолчанию) и предоставляет доступ к определённым каталогам. Клиент подключается к серверу и запрашивает синхронизацию. Протокол rsync не шифрует данные, поэтому для безопасной передачи рекомендуется использовать туннелирование через SSH.
Основные возможности
Инкрементальное копирование
Rsync передаёт только изменённые части файлов, а не целые файлы. Это делает его эффективным для резервного копирования больших объёмов данных, когда изменения незначительны.
Поддержка символических ссылок, прав доступа и метаданных
Утилита может сохранять:
- символические и жёсткие ссылки;
- права доступа (chmod);
- владельцев и группы (chown);
- временные метки (mtime, ctime);
- расширенные атрибуты файловых систем (Linux, macOS).
Исключение и включение файлов
С помощью опций --exclude и --include можно задавать шаблоны для исключения или включения определённых файлов и каталогов. Например, можно исключить временные файлы, каталоги .git или node_modules.
Сжатие данных
Опция -z (или --compress) включает сжатие данных перед передачей. Используется алгоритм zlib (gzip). Сжатие снижает объём передаваемых данных, но увеличивает нагрузку на процессор.
Ограничение пропускной способности
Опция --bwlimit позволяет ограничить скорость передачи данных (в КБ/с). Это полезно при работе в сетях с ограниченной пропускной способностью, чтобы не перегружать канал.
Работа с разреженными файлами
Опция --sparse позволяет эффективно обрабатывать разреженные файлы (файлы с большими пустыми областями, например, образы виртуальных машин). Rsync передаёт только ненулевые блоки, экономя место на диске.
Команды и синтаксис
Базовый синтаксис команды rsync:
`` rsync [опции] источник назначение ``
Примеры:
- Локальное копирование:
rsync -av /home/user/docs/ /backup/docs/ - Удалённое копирование через SSH:
rsync -avz /home/user/docs/ user@server:/backup/docs/ - Синхронизация с удалённым сервером (демон rsync):
rsync -av rsync://server.ru/module/docs/ /local/docs/
Основные опции
| Опция | Описание |
|---|---|
-a | Архивный режим (рекурсивное копирование, сохранение ссылок, прав, временных меток, владельцев) |
-v | Подробный вывод (verbose) |
-z | Сжатие данных при передаче |
-r | Рекурсивное копирование каталогов |
-u | Обновление (пропуск файлов, которые новее на стороне назначения) |
--delete | Удаление файлов в назначении, которых нет в источнике |
--exclude | Исключение файлов по шаблону |
--bwlimit | Ограничение скорости передачи |
--dry-run | Тестовый запуск без реального копирования |
-n | То же, что --dry-run |
Применение
Резервное копирование
Rsync широко используется для создания резервных копий данных. Благодаря инкрементальному копированию, резервное копирование больших каталогов (например, домашних папок пользователей) выполняется быстро и экономит трафик. Пример скрипта для ежедневного бэкапа:
``bash rsync -avz --delete /home/user/ /mnt/backup/user/ ``
Репликация данных
В веб-хостинге и кластерных системах rsync применяется для синхронизации содержимого между серверами. Например, можно синхронизировать каталог с файлами сайта между двумя серверами для обеспечения отказоустойчивости.
Миграция данных
При переносе данных с одного сервера на другой rsync позволяет выполнить миграцию с минимальным простоем: сначала копируются все файлы, затем (после остановки сервисов) — только изменённые.
Синхронизация между устройствами
Пользователи Linux и macOS часто используют rsync для синхронизации файлов между домашним компьютером и ноутбуком, а также с удалёнными серверами.
Ограничения
Отсутствие шифрования в собственном протоколе
Демон rsync (порт 873) передаёт данные в открытом виде. Для безопасной передачи необходимо использовать SSH-туннель (опция -e ssh).
Проблемы с кодировками имён файлов
Rsync не обрабатывает корректно имена файлов в некоторых кодировках (например, UTF-8 с нормализацией Unicode). Это может привести к созданию дублирующихся файлов при синхронизации между системами с разными настройками локали.
Производительность при большом количестве мелких файлов
При синхронизации каталогов с миллионами мелких файлов (например, кэш браузера) rsync тратит много времени на сканирование и сравнение контрольных сумм. В таких случаях может быть эффективнее использовать tar или rdiff-backup.
Отсутствие поддержки дедупликации на уровне блоков
Rsync не выполняет дедупликацию данных на уровне блоков (в отличие от систем резервного копирования, таких как Borg или ZFS). Если в разных файлах содержатся одинаковые блоки, они будут переданы повторно.
Альтернативы
- rdiff-backup — утилита, использующая алгоритм rsync для инкрементального резервного копирования с возможностью хранения истории изменений.
- Unison — инструмент для двусторонней синхронизации файлов, поддерживающий разрешение конфликтов.
- BorgBackup — система резервного копирования с дедупликацией и сжатием, более эффективная для больших объёмов данных.
- ZFS send/receive — встроенный механизм репликации в файловой системе ZFS, позволяющий передавать снимки состояния (snapshots).
Интересные факты
- Название «rsync» происходит от «remote sync» (удалённая синхронизация).
- Алгоритм дельта-кодирования, разработанный Триджеллом, был опубликован в 1998 году в статье «The rsync algorithm» (Andrew Tridgell, Paul Mackerras).
- Rsync используется в ядре Linux для синхронизации исходных кодов между репозиториями.
- В 2005 году вышла реализация rsync для Windows — cwRsync (на базе Cygwin). Позднее появились нативные порты, такие как Rsync для Windows (MSYS2).
Источники
- Tridgell, A., Mackerras, P. (1998). «The rsync algorithm». Technical Report TR-CS-98-06, Australian National University.
- Официальная документация rsync: https://rsync.samba.org/documentation.html
- Man-страница rsync (Linux):
man rsync - Проект rsync на GitHub: https://github.com/WayneD/rsync
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →