rsync
| Авторы | Эндрю Триджелл, Пол Маккеррас |
|---|---|
| Первый выпуск | 1996 |
| Язык | C |
| Лицензия | GNU GPL v3 |
| Транспорт | SSH или собственный демон rsyncd (порт 873) |
| Ключевая идея | передача только различий (дельта-кодирование) |
| Альтернативы | rclone (облачные хранилища), restic и borg (резервные копии) |
rsync — утилита для синхронизации файлов и каталогов: между папками на одной машине или между компьютерами по сети, обычно через SSH. Её главное достоинство — передаются только изменения: если в гигабайтном файле поменялось несколько килобайт, по сети уйдут лишь они. rsync сохраняет права, владельцев, время изменения и символические ссылки, умеет удалять на приёмнике файлы, исчезнувшие в источнике, и продолжать прерванную передачу.
rsync — стандартный инструмент резервного копирования, зеркалирования, переноса данных между серверами и простого развёртывания сайтов.
История и алгоритм
rsync создали австралийские программисты Эндрю Триджелл (известный также как автор Samba) и Пол Маккеррас; первая версия вышла в 1996 году.[1] Алгоритм описан в техническом отчёте и диссертации Триджелла.[3][4]
Задача: синхронизировать файл, когда у получателя уже есть его старая версия, а пересылать файл целиком дорого.
- Получатель делит свою версию на блоки и отправляет для каждого две контрольные суммы — быструю «скользящую» и надёжную.
- Отправитель проходит по своему файлу окном размером в блок, сдвигаясь на один байт. Скользящая сумма пересчитывается за константное время при сдвиге, поэтому совпадения находятся даже при вставке данных в середину файла.
- Совпавшие блоки отправитель заменяет ссылками «возьми свой блок № N», а передаёт только данные, которых у получателя нет.
Для решения, какие файлы вообще нужно проверять, rsync по умолчанию сравнивает размер и время изменения — это быстро.
Основы
rsync -av src/ backup/ # локально: архивный режим, подробный вывод
rsync -avz src/ user@server:/var/www/site/ # на сервер по SSH со сжатием
rsync -avz user@server:/var/log/app/ ./logs/ # с сервера
rsync -avP big.iso server:/data/ # прогресс и докачка прерванной передачи
rsync -av --delete src/ backup/ # точное зеркало: удалить лишнее в приёмнике
rsync -avn --delete src/ backup/ # -n (--dry-run): показать, что будет сделано
| Ключ | Смысл |
|---|---|
-a |
архивный режим: рекурсивно, с правами, владельцами, временем, ссылками |
-v |
подробный вывод |
-z |
сжатие при передаче |
-P |
прогресс и сохранение частично переданных файлов |
--delete |
удалять в приёмнике файлы, которых нет в источнике |
-n |
пробный запуск без изменений |
--exclude, --exclude-from |
исключить файлы по шаблону |
-e "ssh -p 2222" |
параметры SSH |
--bwlimit |
ограничение скорости |
Полный перечень — в руководстве rsync.[2]
Косая черта в конце
Самая частая ловушка — косая черта в конце пути источника:
rsync -a photos backup/ # создаст backup/photos/...
rsync -a photos/ backup/ # скопирует содержимое: backup/...
src/ означает «содержимое каталога», src — «сам каталог». С ключом --delete ошибка в одном символе может стереть данные, поэтому сначала запускайте команду с -n.
Резервные копии
С ключом --link-dest rsync создаёт снимки, в которых неизменившиеся файлы — жёсткие ссылки на предыдущий снимок (см. Файловая система Unix (FHS)). Каждый снимок выглядит как полная копия, но занимает место только под изменения:
today=$(date +%F)
rsync -a --delete --link-dest=/backups/latest /home/ /backups/$today/
ln -sfn /backups/$today /backups/latest
Такую команду запускают по расписанию (cron и таймеры systemd). Однако rsync — не полноценная система резервного копирования: у него нет шифрования хранилища, дедупликации между файлами и проверки целостности снимков. Для этого существуют restic и BorgBackup (см. Бэкапы: правило 3-2-1).
Безопасность: ограниченный доступ
Когда сервер с данными отправляет копии на сервер резервного хранения, ключ SSH для этого стоит ограничить. Скрипт rrsync, поставляемый с rsync, разрешает ключу только операции rsync внутри заданного каталога и может запретить чтение:[5]
# ~/.ssh/authorized_keys на сервере хранения
command="rrsync -wo /backups/app",restrict ssh-ed25519 AAAA... backup@app
Режим -wo (только запись) означает, что даже при краже ключа злоумышленник не сможет ни прочитать старые копии, ни получить оболочку на сервере. Это пример принципа наименьших привилегий.
Развёртывание
rsync -avz --delete --exclude ".git" --exclude "node_modules" build/ deploy@web:/var/www/site/
Для статических сайтов (Статический сайт и генераторы (SSG)) этого часто достаточно. Для приложений надёжнее атомарное переключение: загрузить в новый каталог и сменить символическую ссылку, чтобы пользователи не увидели полузагруженную версию.
Альтернативы
- scp и sftp — простое копирование без дельта-передачи.
- rclone — «rsync для облаков»: синхронизация с S3, Google Drive и десятками других хранилищ.[6]
- restic, BorgBackup — резервное копирование с шифрованием, дедупликацией и снимками.
- Syncthing — непрерывная двусторонняя синхронизация между устройствами.
См. также
- SSH
- Бэкапы: правило 3-2-1
- cron и таймеры systemd
- Принцип наименьших привилегий
- Файловая система Unix (FHS)