# rsync - инкрементальная синхронизация файлов _Команды · LinuxLab Knowledge Base_ **TL;DR:** rsync копирует только изменённые блоки файлов локально или по SSH. `-avz` базовая комбинация (archive + verbose + compress). `--delete` зеркалирует. `--dry-run` обязателен перед первым запуском. ## Зачем rsync Скопировать дерево файлов между машинами (или между каталогами на одной) с минимумом трафика и времени. Когда меняется один байт в гигабайтном файле - rsync передаст ~несколько килобайт служебных данных, не весь файл. Сравнение: | Утилита | Когда | |---------|-------| | `cp -a` | локально, без сети | | `scp` | разовое копирование по SSH; не делит на блоки | | `rsync` | многократная синхронизация; SSH или daemon | | `tar | ssh tar` | один проход без diff'а - редко быстрее rsync | | `rclone`| облачные хранилища (S3, GCS, Dropbox) | ## Базовый синтаксис ``` rsync [OPTIONS] SRC [SRC]... DEST ``` Локально: ```bash rsync -av /home/user/src/ /backup/src/ ``` По SSH (push): ```bash rsync -av /home/user/src/ user@host:/backup/src/ ``` По SSH (pull): ```bash rsync -av user@host:/var/log/ ./logs/ ``` ## Слэш в конце источника - КРИТИЧНО ``` /src/ - "содержимое /src" → копируется в DEST /src - "директория src сама" → создаётся DEST/src/ ``` 90% багов rsync - забытый или лишний слэш. Перед первым запуском всегда добавляй `--dry-run`. ## -a - archive mode Это сокращение для `-rlptgoD`: - `-r` recursive - `-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, зеркало ```bash rsync -av --delete /src/ /mirror/ ``` После запуска `/mirror/` ИДЕНТИЧЕН `/src/`. Файлы которые есть в mirror но удалены из src - **сотрутся**. Поэтому всегда: 1. Сначала `--dry-run -v --delete` 2. Внимательно смотри список deleted 3. Если ок - убирай `-n` Особенно опасен в скриптах с переменными: ```bash # ОПАСНО если SRC="" rsync -av --delete "$SRC/" /backup/ # удалит весь /backup ``` ## Exclude ```bash 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-нюансы ```bash 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`: ```bash 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/etc - **`bbcp`**, **`bbftp`** - научные трансферы на 10+Gbit - **`unison`** - двусторонняя синхронизация (rsync только односторонняя) - **`borg`/`restic`** - dedup + шифрование + snapshot'ы; rsync ради бэкапа проигрывает на больших объёмах ## Команды ```bash rsync -avzP /src/ user@host:/dst/ ``` Базовая синхронизация с прогрессом и сжатием ```bash rsync -avn --delete /src/ /backup/ ``` Dry-run перед зеркалом - покажет что будет добавлено и удалено ```bash rsync -av --exclude='*.log' --exclude='node_modules' /app/ /backup/app/ ``` Бэкап без мусора - типичный фильтр для проектов ```bash rsync -av --link-dest=/backup/yesterday /data/ /backup/today/ ``` Snapshot-бэкап с hard-link'ами - почти бесплатный по диску ```bash rsync -av --bwlimit=20M /src/ user@host:/dst/ ``` Ограничить трафик до 20 MiB/s - не забивать аплинк в рабочие часы ```bash rsync -av -e 'ssh -p 2222' /src/ user@host:/dst/ ``` SSH на нестандартном порту через -e ```bash rsync -avc /src/ /dst/ ``` Сравнить по содержимому (checksum) - дороже, но честнее когда mtime врёт ## См. также - [find - поиск файлов по предикатам](/kb/cmd-find.md) - [SSH - secure shell](/kb/ssh.md) - [FTP и SFTP - передача файлов](/kb/ftp-sftp.md) - [NFS - сетевая файловая система](/kb/nfs.md) - [mount и /etc/fstab - подключение ФС](/kb/mount-and-fstab.md)