rsync: синхронизация файлов

Файлы

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

Отсюда всё остальное: повторный запуск почти не занимает времени, оборванное копирование продолжается с места обрыва, а не начинается заново. Для серверов, бэкапов и переноса больших объёмов это первый инструмент, а не «ещё один способ копирования».

Чем отличается от cp

cp rsync
Копирует Всё, всегда Только отличающееся
Оборвался Начинать заново Продолжить
Сеть Только через смонтированный каталог Сам, по SSH или через демон
Исключения Нет Файлы, каталоги, шаблоны
Удаление лишнего на приёмнике Нет --delete
Проверка перед запуском Нет --dry-run

Три способа запуска

# локально: каталог в каталог
$ rsync -a /home/user/ /backup/user/

# на сервер (push): то, что у меня, — туда
$ rsync -a /home/user/ user@server:/backup/user/

# с сервера (pull): то, что там, — сюда
$ rsync -a user@server:/backup/user/ /home/user/

По сети rsync ходит через SSH по умолчанию. Если нужен другой ключ или порт — ключ -e:

$ rsync -a -e 'ssh -p 2222 -i ~/.ssh/backup' /home/user/ user@server:/backup/user/

Слэш на конце — главная ловушка

Это стоит запомнить один раз и навсегда: слэш на конце источника означает «содержимое», его отсутствие — «сам каталог».

$ rsync -a src dst1/
$ find dst1 -type f
dst1/src/a.txt

$ rsync -a src/ dst2/
$ find dst2 -type f
dst2/a.txt

Разница в одном символе, а результат разный: в первом случае внутри dst1 появился каталог src, во втором — файлы легли прямо в dst2. Именно из-за этого чаще всего «бэкап лёг не туда», и именно поэтому перед первой синхронизацией делают --dry-run.

Ключи, которые нужны каждый день

Ключ Что делает
-a «Архивный» режим: рекурсивно, с правами, временем, владельцем, ссылками. Основной
-n, --dry-run Показать, что будет сделано, и ничего не менять
--stats Итоги: сколько файлов и байт передаётся
-h Размеры в мегабайтах, а не в байтах
--info=progress2 Общий прогресс по всей передаче
--delete Удалить на приёмнике то, чего нет в источнике
--exclude, --include Исключить или вернуть файлы по шаблону
--exclude-from=файл Список исключений из файла
--partial Оставить недокачанный файл и продолжить в следующий раз
--append-verify Дописывать большие файлы, проверяя уже переданную часть
--bwlimit=10M Ограничить скорость, чтобы не забить канал
--numeric-ids Не пересчитывать владельцев по именам
--checksum Сравнивать по контрольной сумме, а не по времени и размеру (медленнее)
-H, -A, -X Жёсткие ссылки, ACL, расширенные атрибуты

Как проверить, что будет сделано

$ rsync -a --dry-run --stats src/ dst2/
Total bytes sent: 155
Total bytes received: 20
total size is 35  speedup is 0,20 (DRY RUN)

(DRY RUN) в конце — подтверждение, что ничего не менялось. Строка speedup показывает, во сколько раз передача меньше полного объёма: у повторного запуска она большая (передаётся почти ничего), у первого — около единицы.

Что происходит при повторном запуске без изменений:

$ rsync -a --stats src/ dst2/ | grep 'Number of regular files transferred'
Number of regular files transferred: 0

Ноль переданных файлов — это и есть главное свойство rsync: он не копирует то, что уже совпадает.

Удаление лишнего: --delete

--delete убирает на приёмнике файлы, которых нет в источнике, — так получается точная копия. Это же и самый опасный ключ: опечатка в пути стирает данные.

Правило безопасной работы:

  1. сначала --dry-run и прочитать, что будет удалено;
  2. в первом проходе --delete не использовать вообще (сначала наполнить приёмник);
  3. включать --delete только когда источник и приёмник — это именно та пара, о которой вы думаете.

Полезная модификация: --backup --backup-dir=/backup/old — удаляемое не пропадает, а складывается в отдельный каталог.

Исключения

$ rsync -a --exclude='.cache/' --exclude='*.iso' --exclude='.local/share/Trash/' /home/user/ /backup/user/

Что стоит исключать при копировании домашнего каталога и почему — разобрано в статье «Перенести домашний каталог»: кэши, корзина, snap-образы. Там же — проверка итогов и второй проход.

Список исключений удобно держать файлом и передавать --exclude-from=/etc/rsync-exclude.txt.

Бэкап на сервер: как это выглядит целиком

$ rsync -aHAX --numeric-ids --info=progress2 \
    --exclude='.cache/' --exclude='.local/share/Trash/' --exclude='snap/' \
    /home/user/ user@server:/backup/user/

Первый запуск долгий, все следующие — быстрые. Именно так делаются резервные копии расписанием: задачу ставят в cron или systemd-timer, а rsync каждый раз донесёт только изменения.

Демон rsync: когда SSH недоступен

Если на приёмнике нет SSH или копирование должна выполнять не человек, rsync умеет работать демоном:

# /etc/rsyncd.conf
[backup]
    path = /srv/backup
    read only = no
    auth users = backupuser
    secrets file = /etc/rsyncd.secrets
$ sudo systemctl enable --now rsync        # слушает порт 873
$ rsync -a --password-file=/etc/rsync.pass /home/user/ backupuser@server::backup/user/

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

Типичные ошибки

Симптом Причина
Файлы легли «на уровень выше» или появился лишний каталог Слэш на конце источника: src вместо src/ или наоборот
Права у файлов стали другими Копирование без -a (например, -r вместо -a)
Владелец — root, хотя копировал обычный пользователь Так и должно быть: назначать владельца может только root; для переноса между машинами — --numeric-ids
Передаётся всё заново каждый раз Изменилось время файлов (например, после распаковки) — смотреть --checksum
Обрыв на большом файле, снова с нуля Добавить --partial (и --append-verify для больших одиночных файлов)
Приёмник стал пустым --delete с неверным источником

Источники

  • man 1 rsync — ключи, поведение слэша, --delete, --exclude, --partial, --numeric-ids.
  • man 5 rsyncd.conf — режим демона и его настройки.
  • man 1 ssh — передача через SSH и ключ -e.

Что ещё не проверено

  • Раздел «Слэш на конце» и примеры с --dry-run, --stats и повторным запуском проверены на локальной системе (Ubuntu 26.04): выводы команд в статье настоящие.
  • Всё, что касается копирования по сети и режима демона, не проверялось — для этого нужны две машины; ключи и файлы настроек приведены по своим man-страницам.
  • Скорость передачи зависит от канала и размера файлов; конкретных цифр в статье нет намеренно.
Оценка статьи 0

Комментарии

Пока комментариев нет.