LinuxRuLinux без лишней теории
Копирование

rsync в Linux: синхронизация папок и резервные копии на примерах

Редакция LinuxRu6 мин чтенияИнструкции

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

rsync в Linux: синхронизация папок и резервные копии на примерах
Фото: Oscarandrea, CC BY-SA 4.0, Wikimedia Commons
Содержание
  1. Зачем rsync
  2. Синтаксис и слеш
  3. Основные ключи
  4. Через SSH
  5. Синхронизация папок
  6. Снимки --link-dest
  7. По расписанию
  8. Ошибки
  9. Частые вопросы

Чем 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.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.