Зачем rsync
Скопировать дерево файлов между машинами (или между каталогами на одной) с минимумом трафика и времени. Когда меняется один байт в гигабайтном файле - rsync передаст ~несколько килобайт служебных данных, не весь файл.
Сравнение:
| Утилита | Когда |
|---|---|
cp -a | локально, без сети |
scp | разовое копирование по SSH; не делит на блоки |
rsync | многократная синхронизация; SSH или daemon |
| `tar | ssh tar` |
rclone | облачные хранилища (S3, GCS, Dropbox) |
Базовый синтаксис
rsync [OPTIONS] SRC [SRC]... DEST
Локально:
rsync -av /home/user/src/ /backup/src/
По SSH (push):
rsync -av /home/user/src/ user@host:/backup/src/
По SSH (pull):
rsync -av user@host:/var/log/ ./logs/
Слэш в конце источника - КРИТИЧНО
/src/ - "содержимое /src" → копируется в DEST
/src - "директория src сама" → создаётся DEST/src/
90% багов rsync - забытый или лишний слэш. Перед первым запуском
всегда добавляй --dry-run.
-a - archive mode
Это сокращение для -rlptgoD:
-rrecursive-lсохранить symlinks как symlinks-pсохранить permissions-tсохранить mtime (без этого - rsync будет слать всё каждый раз)-gсохранить group-oсохранить owner (только под root)-Dспецфайлы (devices, sockets) - редко нужен
Без -t rsync определяет изменения по размеру, и при равных размерах
пропускает - но это обманывает при правках одного байта в гигабайтнике
без изменения размера. -t включай всегда.
Часто используемые опции
| Опция | Что |
|---|---|
-v | verbose; -vv ещё подробнее; -q тишина |
-z | сжатие на лету (имеет смысл по сети, не локально) |
-h | размеры в KiB/MiB |
-P | --partial --progress (показывать прогресс + не удалять недокачанное) |
-n | --dry-run |
--delete | удалить в DEST то, чего нет в SRC (зеркало) |
--exclude=PATTERN | пропустить (можно много раз) |
--exclude-from=FILE | список паттернов из файла |
--include=PATTERN | переопределить exclude |
--bwlimit=10M | ограничить ширину канала |
-e ssh | использовать конкретную SSH-команду (порт, ключ) |
--checksum | сравнивать по содержимому, не по mtime+size |
--inplace | писать в существующий файл (для huge fixed-size, БД) |
--link-dest=DIR | hard-link с предыдущего бэкапа (snapshot-style) |
--delete, зеркало
rsync -av --delete /src/ /mirror/
После запуска /mirror/ ИДЕНТИЧЕН /src/. Файлы которые есть в mirror
но удалены из src - сотрутся. Поэтому всегда:
- Сначала
--dry-run -v --delete - Внимательно смотри список deleted
- Если ок - убирай
-n
Особенно опасен в скриптах с переменными:
# ОПАСНО если SRC=""
rsync -av --delete "$SRC/" /backup/ # удалит весь /backup
Exclude
rsync -av --exclude='node_modules' --exclude='.git' /src/ /backup/
rsync -av --exclude-from=.rsync-ignore /src/ /backup/
Паттерны - shell-glob, не regex. ** - matches много уровней.
Trailing / - только директория. Полное правило в man rsync под
"FILTER RULES".
SSH-нюансы
rsync -av -e "ssh -p 2222 -i ~/.ssh/key" /src/ user@host:/dst/
Если SSH спрашивает пароль каждый раз - используй [[ssh|ssh-agent]] или ключ без passphrase. Для cron'а ключ обязательно.
Скорость: -z тратит CPU на сжатие. Для уже сжатых данных (jpg, mp4,
zip) -z вреден - выключай.
Snapshot-style бэкапы
Магия --link-dest:
YESTERDAY=/backup/2026-05-01
TODAY=/backup/2026-05-02
rsync -av --delete --link-dest="$YESTERDAY" /data/ "$TODAY/"
Неизменённые файлы будут hard-link'ами на вчерашние - занимают 0 диска.
Каждая папка 2026-MM-DD выглядит как полная копия. Это базовый
паттерн утилит вроде rsnapshot и Time Machine.
Когда удаляешь старые snapshot'ы - hard-link'и сами разрешаются, место освобождается естественно.
Когда что-то пошло не так
- Скопировались чужие правa - запускал не от root,
-o/-gне сработали. Используй--no-perms --no-owner --no-groupили sudo. - rsync шлёт ВСЁ заново каждый раз - mtime не сохраняется (нет
-t) или ФС назначения не поддерживает время (FAT32, древние SMB). Permission denied (publickey)- SSH-ключ не прокинут в-eили у юзера на той стороне нет доступа.- Скорость уперлась в 10 MB/s по 1Gbit-линку -
-zзабивает CPU. Убери для уже-сжатых данных. - Большие файлы рвутся при разрыве сети - добавь
-P(--partial) чтобы при следующем запуске докачать хвост. --deleteснёс файлы которые нужны - не было--dry-run. На важных таргетах используй--backup --backup-dir=...rsync error: some files/attrs were not transferred (8)- чаще всего проблема с extended-attributes/ACL; добавь-X -Aили исключи файлы.
Альтернативы
rclone- rsync-style CLI, но для S3/GCS/Dropbox/etcbbcp,bbftp- научные трансферы на 10+Gbitunison- двусторонняя синхронизация (rsync только односторонняя)borg/restic- dedup + шифрование + snapshot'ы; rsync ради бэкапа проигрывает на больших объёмах