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 убирает на приёмнике файлы, которых нет в источнике, — так получается точная копия. Это же и самый опасный ключ: опечатка в пути стирает данные.
Правило безопасной работы:
- сначала
--dry-runи прочитать, что будет удалено; - в первом проходе
--deleteне использовать вообще (сначала наполнить приёмник); - включать
--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-страницам.
- Скорость передачи зависит от канала и размера файлов; конкретных цифр в статье нет намеренно.
Комментарии
Пока комментариев нет.