rsync в Linux: синхронизация папок и резервные копии на примерах
rsync примеры начинаются с одной команды: rsync -avh источник/ приёмник/ копирует папку с правами и при повторном запуске передаёт только изменения. Для зеркала добавьте --delete, для удалённого компьютера укажите путь вида user@host:/путь, и rsync пойдёт через SSH.

Содержание
Чем rsync лучше cp и scp
rsync сравнивает источник и приёмник и передаёт только то, что изменилось. Первый прогон копирует всё, а второй по папке на сотню гигабайт проходит за секунды, если поменялись пара файлов. Прерванное копирование можно продолжить с того же места, права, владельцы и время изменения сохраняются, а через SSH всё это работает между компьютерами без дополнительной настройки.
Программа обычно уже стоит. Если нет:
sudo apt install rsync # Debian, Ubuntu
sudo dnf install rsync # Fedora
sudo pacman -S rsync # Arch
rsync --version
Для копирования на другой компьютер rsync должен быть установлен на обеих сторонах. В начале 2025 года в rsync закрыли серию серьёзных уязвимостей, ещё несколько исправили в 2026 году, поэтому держите пакет обновлённым, особенно на сервере.
Синтаксис и главная ловушка: слеш в конце пути
Общий вид команды: rsync [ключи] ИСТОЧНИК ПРИЁМНИК. Почти все ошибки новичков связаны с одним символом: косой чертой в конце пути источника.
# со слешем: содержимое Photos попадает прямо в /backup/Photos
rsync -avh ~/Photos/ /backup/Photos/
# без слеша: в /backup появится каталог Photos целиком
rsync -avh ~/Photos /backup/
Оба варианта дают одинаковый результат, если правильно указать приёмник. А вот rsync -avh ~/Photos /backup/Photos/ создаст вложенный /backup/Photos/Photos. Слеш на конце приёмника на результат не влияет. Запомните правило так: слеш у источника означает "содержимое этой папки".
Перед любой новой командой, особенно с удалением, добавляйте -n (--dry-run). rsync покажет список того, что сделает, и ничего не тронет.
rsync -avhn --delete ~/Photos/ /backup/Photos/Ключи -avh, -P, --delete и другие нужные опции
Связка -avh подходит для девяти задач из десяти, остальное ищите в официальном руководстве rsync. -a (архивный режим) это сокращение для -rlptgoD: рекурсивно, с символическими ссылками, правами, временем, группой, владельцем и спецфайлами.
| Ключ | Что делает |
|---|---|
-a | Архивный режим, сохраняет структуру и атрибуты |
-v | Показывать передаваемые файлы |
-h | Размеры в понятном виде: K, M, G |
-n, --dry-run | Пробный прогон без изменений |
-P | То же, что --partial --progress: прогресс и докачка прерванных файлов |
-z | Сжимать данные при передаче, полезно на медленной сети |
--delete | Удалять в приёмнике файлы, которых нет в источнике |
--exclude=ШАБЛОН | Пропускать файлы и каталоги по шаблону |
-A, -X, -H | Сохранять ACL, расширенные атрибуты и жёсткие ссылки |
-c | Сравнивать по контрольной сумме, а не по размеру и времени |
--bwlimit=5M | Ограничить скорость, чтобы не забивать канал |
--info=progress2 | Общий прогресс по всей передаче вместо пофайлового |
--delete без сюрпризов
С --delete приёмник становится точным зеркалом источника. Если вы по ошибке укажете пустую папку источником, rsync честно очистит приёмник. Поэтому всегда сначала прогон с -n, а для резервных копий лучше вариант с корзиной: --backup --backup-dir переносит удаляемые и перезаписываемые файлы в отдельный каталог вместо удаления.
rsync -avh --delete --backup --backup-dir=/backup/deleted/$(date +%F) ~/Documents/ /backup/Documents/
Исключения
rsync -avh --exclude='.cache/' --exclude='node_modules/' --exclude='*.tmp' ~/ /backup/home/
# или списком из файла, по шаблону на строку
rsync -avh --exclude-from=$HOME/.rsync-exclude ~/ /backup/home/rsync через SSH: на сервер и обратно
Удалённый путь записывается как пользователь@хост:путь. Транспорт по умолчанию SSH, так что если вы можете зайти на сервер командой ssh, rsync тоже сработает.
# с локального компьютера на сервер
rsync -avhP ~/project/ ivan@192.168.1.20:/home/ivan/project/
# с сервера к себе
rsync -avhP ivan@192.168.1.20:/var/log/nginx/ ~/logs/nginx/
# нестандартный порт и отдельный ключ
rsync -avhP -e "ssh -p 2222 -i ~/.ssh/backup_ed25519" ~/project/ ivan@server:/srv/project/
Если хост уже описан в ~/.ssh/config с портом, пользователем и ключом, можно писать просто rsync -avh ~/project/ myserver:/srv/project/. Как настроить ключи и этот файл, рассказано в статье про SSH-клиент.
Файлы, принадлежащие root
Если на удалённой стороне нужно читать системные файлы, а вход под root по SSH закрыт, запустите удалённый rsync через sudo. Пользователю для этого понадобится правило sudo без пароля для /usr/bin/rsync:
rsync -avh --rsync-path="sudo rsync" ivan@server:/etc/ ~/server-etc/
На медленном канале с уже сжатыми файлами (видео, фото, архивы) -z только нагружает процессор. Включайте сжатие для текстов, логов и исходников, а для медиатеки обходитесь без него.
Синхронизация папок между дисками и компьютерами
rsync синхронизирует в одну сторону: источник считается правильным, приёмник подгоняется под него. Для зеркала папки на внешнем диске этого достаточно:
rsync -avh --delete ~/Music/ /run/media/$USER/External/Music/
Флешки и диски с FAT32 или exFAT не хранят владельцев и права Unix, а время у них хранится с точностью до двух секунд. rsync будет каждый раз считать файлы изменившимися. Для таких носителей используйте -rtv --modify-window=2 вместо -a.
Двусторонняя синхронизация, когда файлы правятся и тут, и там, не задача rsync: при конфликте он молча перезапишет одну версию другой. Для этого есть Syncthing, у нас есть статья про приватную синхронизацию через Syncthing.
Копия всей системы
Чтобы перенести систему на новый диск или сделать полную копию, нужны все атрибуты и исключение виртуальных каталогов:
sudo rsync -aAXHv --numeric-ids \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
/ /mnt/newroot/
Фигурные скобки разворачивает bash, в sh эта запись не сработает.
Резервные копии с историей через --link-dest
Зеркало защищает от смерти диска, но не от ошибки: удалённый файл исчезнет и из копии при следующем запуске. Решение в духе Time Machine: каждый день новая папка с датой, где неизменившиеся файлы не копируются, а становятся жёсткими ссылками на вчерашние. Каждая папка выглядит как полная копия, а место занимают только изменения.
#!/bin/bash
SRC="$HOME/"
DST="/backup/snapshots"
TODAY=$(date +%F)
mkdir -p "$DST"
rsync -a --delete --link-dest="$DST/latest" \
--exclude='.cache/' "$SRC" "$DST/$TODAY"
ln -sfn "$DST/$TODAY" "$DST/latest"
Старые снимки удаляются обычным rm -rf, файлы, на которые ссылаются другие снимки, при этом не пропадут. Каталог с копиями должен лежать на файловой системе Linux с поддержкой жёстких ссылок, например ext4. Если нужны шифрование, дедупликация и хранение в облаке, rsync уже тесноват, посмотрите сравнение Borg и Restic.
Запуск по расписанию: cron и таймер systemd
Сохраните скрипт, например ~/bin/backup.sh, дайте права на запуск chmod +x ~/bin/backup.sh и проверьте его вручную. Потом добавьте строку в crontab -e:
# каждый день в 02:30, вывод в журнал
30 2 * * * /home/ivan/bin/backup.sh >> /home/ivan/backup.log 2>&1
В cron нет вашего окружения и SSH-агента. Для копирования на сервер нужен ключ без пароля, который указан явно через -e "ssh -i ...", иначе задача будет молча падать. Если компьютер бывает выключен ночью, удобнее таймер systemd с Persistent=true: пропущенный запуск выполнится при включении. Оба варианта с примерами описаны в статье про cron и systemd timers.
Раз в месяц проверяйте, что из копии можно что-то достать: откройте файл, сравните размер каталога командой du -sh. Копия, которую ни разу не восстанавливали, это надежда, а не резервная копия.
Если rsync ругается: разбор частых сообщений
rsync: command not found на удалённой стороне
На сервере не установлен rsync. Поставьте пакет там же, где и локально. Если программа лежит в нестандартном месте, укажите путь ключом --rsync-path=/opt/bin/rsync.
Permission denied и failed to set times
Пользователь на приёмнике не может менять владельца или время файлов. На своём диске выдайте права на каталог, на чужом сетевом ресурсе уберите сохранение владельца и группы: -rlt вместо -a или -a --no-o --no-g.
Код выхода 23 и 24
Код 23 значит, что часть файлов не передалась, обычно из-за прав: прокрутите вывод и найдите строки с ошибками. Код 24 говорит, что файлы исчезли во время копирования, для кэша браузера и временных файлов это нормально. В скриптах проверяйте $? и пишите вывод в журнал, иначе о проблеме вы узнаете в день восстановления.
Частые вопросы
Зачем слеш в конце пути источника?
Слеш означает копировать содержимое папки. Без слеша rsync создаст в приёмнике каталог с тем же именем и положит всё в него.
Как посмотреть, что сделает rsync, ничего не меняя?
Добавьте ключ -n или --dry-run. rsync выведет список файлов для копирования и удаления, но не тронет ни одного.
Почему rsync каждый раз копирует всё заново на флешку?
FAT32 и exFAT не хранят права и владельцев и округляют время. Используйте -rtv --modify-window=2 вместо -a.
Нужно ли ставить rsync на сервер?
Да, при работе через SSH rsync запускается и на удалённой стороне. Отдельную службу rsyncd настраивать не нужно.
Можно ли синхронизировать папки в обе стороны?
rsync работает в одну сторону и при конфликте перезапишет файл. Для двусторонней синхронизации берите Syncthing или Unison.
Документация и источники
- rsync(1) manual page, rsync project, Samba, 2026
- rsync, ArchWiki, 2026
- rsync NEWS and security releases, rsync project, 2026
Читайте также
- Резервные копии в Linux: Borg или Restic и схема 3-2-1 дома
- Cron и crontab в Linux: как настроить задания по расписанию
- Как подключиться по SSH из Linux и Windows: от первого входа до туннелей
- Syncthing: приватная синхронизация файлов между устройствами
- Timeshift: как настроить снимки и восстановить систему Linux
- Архивы в Linux: команды tar, zip и 7z с примерами
Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.