rsync

Материал из llmdocs — справочник разработчика
rsync
АвторыЭндрю Триджелл, Пол Маккеррас
Первый выпуск1996
ЯзыкC
ЛицензияGNU GPL v3
ТранспортSSH или собственный демон rsyncd (порт 873)
Ключевая идеяпередача только различий (дельта-кодирование)
Альтернативыrclone (облачные хранилища), restic и borg (резервные копии)

rsync — утилита для синхронизации файлов и каталогов: между папками на одной машине или между компьютерами по сети, обычно через SSH. Её главное достоинство — передаются только изменения: если в гигабайтном файле поменялось несколько килобайт, по сети уйдут лишь они. rsync сохраняет права, владельцев, время изменения и символические ссылки, умеет удалять на приёмнике файлы, исчезнувшие в источнике, и продолжать прерванную передачу.

rsync — стандартный инструмент резервного копирования, зеркалирования, переноса данных между серверами и простого развёртывания сайтов.

История и алгоритм

rsync создали австралийские программисты Эндрю Триджелл (известный также как автор Samba) и Пол Маккеррас; первая версия вышла в 1996 году.[1] Алгоритм описан в техническом отчёте и диссертации Триджелла.[3][4]

Задача: синхронизировать файл, когда у получателя уже есть его старая версия, а пересылать файл целиком дорого.

  1. Получатель делит свою версию на блоки и отправляет для каждого две контрольные суммы — быструю «скользящую» и надёжную.
  2. Отправитель проходит по своему файлу окном размером в блок, сдвигаясь на один байт. Скользящая сумма пересчитывается за константное время при сдвиге, поэтому совпадения находятся даже при вставке данных в середину файла.
  3. Совпавшие блоки отправитель заменяет ссылками «возьми свой блок № 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 — непрерывная двусторонняя синхронизация между устройствами.

См. также

Источники

  1. rsync — официальный сайт
  2. rsync(1) — manual page
  3. A. Tridgell, P. Mackerras — The rsync algorithm (technical report)
  4. A. Tridgell — Efficient Algorithms for Sorting and Synchronization (PhD thesis, 1999)
  5. rrsync(1) — restricted rsync
  6. rclone