Rsync: синхронизация и резервное копирование файлов в Linux

29.04.2026
20:56

Rsync появился в 1996 году как ответ на простой вопрос: как передавать изменения в файлах по сети, не гоняя каждый раз полные копии? Эндрю Триджелл написал алгоритм, который сравнивает блоки данных по контрольным суммам и передаёт только различия. Три десятилетия спустя rsync остаётся инструментом который сисадмины открывают в первые же дни работы с Linux и не закрывают никогда.

Принцип работы прост: rsync анализирует файлы источника и назначения, вычисляет разницу между ними, передаёт только изменённые блоки. Первая синхронизация каталога на 100 GB занимает столько времени сколько требуется для передачи этих данных. Следующая — в разы быстрее, потому что копируется только то что изменилось с прошлого раза. Именно это делает rsync незаменимым для резервного копирования и синхронизации между серверами.

Установка rsync

В большинстве дистрибутивов rsync установлен по умолчанию. Если нет — устанавливается за одну команду.

На Ubuntu/Debian:

apt update && apt install rsync -y

На CentOS/AlmaLinux/Rocky Linux:

dnf install rsync -y

Проверяете версию:

rsync --version

Типичный вывод: rsync version 3.2.7. Версия 3.x уже содержит все современные возможности включая поддержку хеширования xxhash для ускорения сравнения файлов.

Структура команды

Общий синтаксис rsync:

rsync [параметры] источник назначение

Источник и назначение могут быть:

  • Локальными путями: /home/user/data/
  • Удалёнными через SSH: user@server:/path/to/dir/
  • Rsync-демоном: rsync://server/module/

Важная деталь про слеш в конце пути: он меняет поведение rsync. /home/user/data (без слеша) скопирует саму директорию data внутрь назначения. /home/user/data/ (со слешем) скопирует содержимое директории. Эту разницу стоит запомнить сразу — она регулярно вызывает путаницу.

Основные флаги

Большинство задач решается одним набором флагов, который сисадмины набивают на автомате:

rsync -avz источник назначение

Что означает каждый символ:

-a (archive) — комбо-флаг, включает сразу несколько опций: рекурсивное копирование (-r), сохранение символических ссылок (-l), сохранение прав доступа (-p), сохранение временных меток (-t), сохранение владельца (-o) и группы (-g). Флаг -a — стандартный выбор для большинства задач, потому что воспроизводит файлы максимально точно.

-v (verbose) — подробный вывод. Rsync показывает каждый файл который копирует. Полезно при отладке, можно убрать в скриптах для чистого вывода.

-z (compress) — сжатие данных при передаче. Снижает нагрузку на сеть за счёт CPU. Выгодно для текстовых файлов (конфиги, логи, код), для уже сжатых архивов или медиафайлов смысла нет.

Другие часто применяемые флаги:

--progress — отображает прогресс передачи каждого файла. Удобно для больших файлов чтобы видеть что процесс идёт.

--delete — удаляет в назначении файлы которых нет в источнике. Превращает rsync из простого копировщика в зеркальный синхронизатор.

--exclude — исключает файлы или директории из синхронизации по маске.

--dry-run (-n) — запускает rsync без реального копирования, только показывает что было бы сделано. Незаменим для проверки команды перед реальным запуском.

--checksum (-c) — сравнивает файлы по контрольным суммам, а не по размеру и дате. Медленнее, но надёжнее для критичных данных.

--bwlimit — ограничивает пропускную способность в KB/s. Полезно чтобы синхронизация не съедала весь канал.

Локальная синхронизация

Самый простой случай — скопировать данные между директориями на одном сервере.

Синхронизируете веб-сайт в бэкап директорию:

rsync -av /var/www/html/ /backup/www/

Первый запуск скопирует всё. Второй и последующие — только изменения.

Добавляете --delete чтобы бэкап точно отражал источник (удалённые файлы убираются и из бэкапа):

rsync -av --delete /var/www/html/ /backup/www/

Исключаете кеш и временные файлы:

rsync -av --delete \
  --exclude='cache/' \
  --exclude='tmp/' \
  --exclude='*.log' \
  /var/www/html/ /backup/www/

Проверяете что получится без реального копирования:

rsync -av --delete --dry-run /var/www/html/ /backup/www/

Rsync выведет список файлов которые были бы скопированы или удалены. Убедились что всё верно — запускаете без --dry-run.

Синхронизация между серверами по SSH

Rsync работает поверх SSH — никаких дополнительных демонов настраивать не нужно. Достаточно чтобы на целевом сервере был запущен SSH и установлен rsync.

Копируете локальные данные на удалённый сервер:

rsync -avz /var/www/html/ user@192.168.1.100:/backup/www/

Забираете данные с удалённого сервера на локальный:

rsync -avz user@192.168.1.100:/var/www/html/ /local/backup/

Синхронизируете между двумя удалёнными серверами (через локальную машину как промежуточное звено):

rsync -avz user@server1:/data/ user@server2:/data/

При работе через SSH rsync спрашивает пароль при каждом запуске, что неудобно для автоматизации. Решение — настроить SSH ключи:

# Генерируете ключ если его нет
ssh-keygen -t ed25519 -C "rsync backup key"

# Копируете публичный ключ на удалённый сервер
ssh-copy-id user@192.168.1.100

После этого rsync работает без запроса пароля — можно смело ставить в cron.

Нестандартный порт SSH

rsync -avz -e "ssh -p 2222" /var/www/html/ user@192.168.1.100:/backup/www/

Флаг -e указывает rsync какую команду использовать для соединения. Можно передать любые SSH параметры: порт, конкретный ключ, таймауты.

Конкретный ключ для подключения

rsync -avz -e "ssh -i /root/.ssh/backup_key" /data/ user@backup-server:/data/

Инкрементальные бэкапы с историей версий

Простая синхронизация хранит актуальную копию, но не защищает от случайного удаления или повреждения файла — изменение немедленно реплицируется в бэкап. Для истории версий используется техника с жёсткими ссылками (hardlinks).

Идея: каждый бэкап выглядит как полная копия, но неизменившиеся файлы не дублируются — они представлены жёсткими ссылками на файл из предыдущего бэкапа. Это экономит место и одновременно даёт доступ к любому историческому снапшоту.

Флаг --link-dest указывает rsync использовать жёсткие ссылки на файлы из этой директории для файлов которые не изменились.

Скрипт ежедневного бэкапа с хранением 30 дней истории:

#!/bin/bash

SOURCE="/var/www/html/"
DEST="/backup/www"
DATE=$(date +%Y-%m-%d)
LATEST="$DEST/latest"

# Создаём директорию для сегодняшнего бэкапа
mkdir -p "$DEST/$DATE"

# Синхронизируем с использованием вчерашнего бэкапа как базы
rsync -av --delete \
  --link-dest="$LATEST" \
  "$SOURCE" "$DEST/$DATE/"

# Обновляем символическую ссылку latest
ln -sfn "$DEST/$DATE" "$LATEST"

# Удаляем бэкапы старше 30 дней
find "$DEST" -maxdepth 1 -type d -name "????-??-??" \
  -mtime +30 -exec rm -rf {} \;

echo "Backup completed: $DEST/$DATE"

Результат через неделю работы скрипта:

/backup/www/
├── 2026-04-22/   (полная копия)
├── 2026-04-23/   (только новые файлы + hardlinks)
├── 2026-04-24/   (только новые файлы + hardlinks)
├── 2026-04-25/   (только новые файлы + hardlinks)
├── 2026-04-26/   (только новые файлы + hardlinks)
├── 2026-04-27/   (только новые файлы + hardlinks)
├── 2026-04-28/   (только новые файлы + hardlinks)
└── latest -> 2026-04-28  (симлинк на последний)

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

Автоматизация через cron

Ручной запуск rsync полезен для разовых задач, но смысл инструмента раскрывается в автоматическом режиме.

Открываете crontab:

crontab -e

Бэкап каждую ночь в 3:00:

0 3 * * * rsync -az --delete /var/www/html/ /backup/www/ >> /var/log/rsync-backup.log 2>&1

Синхронизация с удалённым сервером раз в час:

0 * * * * rsync -az -e "ssh -i /root/.ssh/backup_key" /data/ backup@192.168.1.100:/data/ >> /var/log/rsync.log 2>&1

Бэкап баз данных (дамп + rsync) каждые 6 часов:

0 */6 * * * /usr/local/bin/backup-db.sh

Где backup-db.sh:

#!/bin/bash
DATE=$(date +%Y%m%d-%H%M)
mysqldump -u root -p'пароль' --all-databases > /tmp/db-$DATE.sql
rsync -az /tmp/db-$DATE.sql backup@192.168.1.100:/backup/db/
rm /tmp/db-$DATE.sql

Для продакшн скриптов добавляйте уведомления о результате. Простой вариант через email:

0 3 * * * rsync -az --delete /var/www/ /backup/www/ && echo "Backup OK" | mail -s "Backup success" admin@your-domain.com || echo "Backup FAILED" | mail -s "Backup ERROR" admin@your-domain.com

Мониторинг и логирование

Rsync сам по себе не пишет постоянный лог — каждый запуск выводит результат в stdout. Чтобы сохранять историю передаёте вывод в файл.

Базовое логирование через перенаправление:

rsync -av /data/ /backup/ >> /var/log/rsync.log 2>&1

Для более структурированного лога используете --log-file:

rsync -av --log-file=/var/log/rsync.log /data/ /backup/

С добавлением временных меток:

rsync -av --log-file=/var/log/rsync.log \
  --log-file-format="%t %f %b" \
  /data/ /backup/

Формат %t %f %b выводит: временную метку, имя файла, переданные байты.

Чтобы лог не разрастался бесконечно — настраиваете logrotate. Создаёте файл /etc/logrotate.d/rsync:

/var/log/rsync.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
}

Logrotate ежедневно архивирует лог, хранит 30 версий и сжимает старые. Файл растёт предсказуемо.

Проверяете последние строки лога:

tail -50 /var/log/rsync.log

Считаете сколько файлов передано за последний запуск:

grep "Number of files transferred" /var/log/rsync.log | tail -1

Rsync-демон для регулярной синхронизации

Для ситуаций когда к серверу обращается много клиентов или нужна тонкая настройка прав на модули — настраивается rsync-демон. Он слушает порт 873 и не требует SSH.

Создаёте конфиг /etc/rsyncd.conf:

# Глобальные настройки
uid = rsync
gid = rsync
use chroot = yes
max connections = 10
timeout = 300
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

# Модуль для бэкапов
[backup]
    path = /backup/data
    comment = Backup storage
    read only = no
    list = yes
    auth users = backupuser
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.1.0/24
    hosts deny = *

Файл с паролями /etc/rsyncd.secrets:

backupuser:надёжный-пароль

Права на файл с паролями — обязательно 600, иначе rsync откажется стартовать:

chmod 600 /etc/rsyncd.secrets

Запускаете демон:

systemctl enable rsync
systemctl start rsync

Подключение клиента к демону:

rsync -av backupuser@192.168.1.100::backup /local/backup/

Двойное двоеточие :: указывает что работаем с rsync-демоном, одиночное : — через SSH.

Полезные сценарии использования

Синхронизация при деплое

При обновлении сайта rsync минимизирует время недоступности — только изменившиеся файлы заменяются на новые:

rsync -avz --delete \
  --exclude='.git' \
  --exclude='node_modules' \
  --exclude='.env' \
  ./build/ user@production-server:/var/www/html/

Бэкап конфигов системы

Регулярно снимаете слепок системных конфигов:

rsync -avz \
  /etc/ \
  /home/ \
  /root/ \
  backup@backup-server:/system-backup/$(hostname)/

Зеркало между несколькими серверами

Синхронизируете общий каталог загрузок между узлами кластера:

for server in web1 web2 web3; do
  rsync -az /var/www/uploads/ $server:/var/www/uploads/
done

Частичное восстановление после сбоя

Rsync прерванную передачу возобновляет с того места где остановился — особенно ценно для больших файлов. Флаг --partial сохраняет частично переданные файлы:

rsync -avz --partial --progress \
  user@backup-server:/backup/large-archive.tar.gz \
  /restore/

Типичные ошибки и решения

Permission denied при работе с корневыми директориями

Rsync запущен от обычного пользователя пытается скопировать файлы с правами root. Решение — запускать от root или использовать --rsync-path для запуска rsync с повышенными правами на удалённой стороне:

rsync -avz --rsync-path="sudo rsync" user@server:/etc/ /backup/etc/

Слишком медленная синхронизация больших каталогов

Rsync тратит время на сборку списка файлов перед началом передачи. Для каталогов с миллионами файлов это занимает минуты. Ускорение — использовать --no-inc-recursive чтобы rsync строил список инкрементально:

rsync -avz --no-inc-recursive /huge-directory/ /backup/

Файлы с пробелами и спецсимволами в именах

Rsync обрабатывает их корректно, но если передаёте список файлов через --files-from — убедитесь что файл содержит пути по одному на строку без дополнительного экранирования.

Rsync падает по таймауту при медленном канале

Добавляете --timeout для задания таймаута соединения в секундах:

rsync -avz --timeout=300 user@slow-server:/data/ /backup/

Разные версии rsync на источнике и назначении

Старые версии могут не поддерживать некоторые флаги. Если работаете с legacy системой — проверяете версию и убираете несовместимые опции. Минимальный набор флагов (-av) работает везде.

Производительность и оптимизация

Rsync по умолчанию использует MD5 для контрольных сумм. Современные версии поддерживают более быстрые алгоритмы:

rsync -avz --checksum-choice=xxh128 /data/ /backup/

xxHash в несколько раз быстрее MD5, особенно заметно на больших объёмах данных. Доступен в rsync 3.2.0+.

Если скорость передачи важнее безопасности (работа в приватной сети) — указываете быстрый SSH шифр:

rsync -avz -e "ssh -c aes128-gcm@openssh.com" /data/ user@server:/backup/

AES128-GCM быстрее стандартного ChaCha20 на современных процессорах с аппаратным ускорением AES.

Параллельная синхронизация нескольких директорий через GNU parallel:

parallel rsync -az {} backup-server:/backup/{/} ::: /var/www /var/mail /home

Каждая директория синхронизируется в отдельном процессе одновременно.

Rsync vs альтернативы

Rsync vs scp

SCP — простая утилита для однократного копирования. Rsync — для регулярной синхронизации. SCP всегда передаёт файл целиком, rsync — только изменения. Для разового перемещения небольшого файла разница несущественна. Для регулярного бэкапа больших директорий rsync выигрывает на порядок.

Rsync vs rclone

Rclone — аналог rsync для облачных хранилищ (S3, Google Drive, Backblaze, Dropbox). Если нужно бэкапировать на локальный сервер или между Linux машинами — rsync быстрее и надёжнее. Если цель — облако — rclone.

Rsync vs Restic

Restic — современный инструмент бэкапа с дедупликацией, шифрованием, поддержкой облачных хранилищ. Сложнее в настройке, но умеет больше. Rsync проще, быстрее для локальных задач, не шифрует данные по умолчанию.

Rsync vs Lsyncd

Lsyncd — обёртка над rsync которая отслеживает изменения файловой системы через inotify и запускает синхронизацию в реальном времени. Подходит когда нужна синхронизация без задержки — например, зеркало для нескольких серверов приложений.

Часто задаваемые вопросы

Что такое rsync и для чего он используется?

Rsync — утилита командной строки для синхронизации и резервного копирования файлов в Linux. Главное отличие от простого копирования: rsync передаёт только изменённые части файлов, а не файлы целиком. Это делает повторные запуски значительно быстрее. Используется для бэкапов серверов, синхронизации данных между машинами, деплоя файлов на production.

Как запустить rsync без запроса пароля?

Настраиваете SSH-ключи: генерируете пару ключей командой ssh-keygen -t ed25519, копируете публичный ключ на удалённый сервер через ssh-copy-id user@server. После этого rsync подключается автоматически без пароля — удобно для cron-заданий и скриптов.

В чём разница между rsync с флагом --delete и без него?

Без --delete rsync только добавляет и обновляет файлы в назначении — удалённые из источника файлы там остаются. С --delete назначение становится точным зеркалом источника: файлы которых нет в источнике удаляются и из назначения. Для бэкапов лучше использовать --delete, но перед первым запуском проверяйте через --dry-run.

Как сделать инкрементальный бэкап с историей версий через rsync?

Используете флаг --link-dest — он создаёт жёсткие ссылки на неизменившиеся файлы из предыдущего бэкапа вместо полного копирования. Каждый бэкап выглядит как полная копия, но занимает на диске лишь место изменившихся файлов. Типичный подход: ежедневные снапшоты с хранением 30 дней, автоматическая очистка через find -mtime +30.

Как ограничить скорость rsync чтобы не перегружать канал?

Используете флаг --bwlimit=ЧИСЛО где число — лимит в KB/s. Например, rsync -avz --bwlimit=10240 /data/ user@server:/backup/ ограничит скорость до 10 MB/s. Полезно при синхронизации через медленные каналы или когда rsync работает параллельно с продакшн трафиком.

Можно ли использовать rsync на Windows?

Напрямую rsync не поддерживает Windows. На стороне Linux rsync работает штатно, на Windows нужен Cygwin, WSL или специальные порты (DeltaCopy, cwRsync). Для регулярной синхронизации между Windows и Linux проще использовать rclone или WinSCP с поддержкой SCP/SFTP.

Итоги

Rsync решает большинство задач связанных с переносом и синхронизацией файлов в Linux. Три десятилетия активного применения и нулевых альтернатив для конкретного класса задач говорят сами за себя.

Для начала достаточно запомнить два шаблона:

Локальная синхронизация:

rsync -avz --delete /источник/ /назначение/

Удалённая через SSH:

rsync -avz --delete /источник/ user@server:/назначение/

Дальше — добавляете флаги по мере возникновения потребностей: исключения, ограничение скорости, проверка по контрольным суммам, инкрементальные снапшоты. Rsync масштабируется от простого копирования файла до корпоративной системы резервного копирования с историей версий — всё это одним инструментом.

VPS на THE.Hosting с NVMe дисками в RAID-10 — хорошая основа для сервера бэкапов. Высокая скорость I/O ускоряет как запись инкрементальных снапшотов, так и восстановление данных в критичный момент. Поддержка доступна 24/7 через Telegram для вопросов по настройке инфраструктуры.

Содержание:
-15% на White и Black Pearl
На заказ нового выделенного сервера в США и Нидерландах
Выбрать сервер

Другие статьи

29.04.2026
3
База знаний / Инструкции - THE.Hosting
Как перенести домен на THE.Hosting
29.04.2026
3
База знаний / Все о доменах
Доменная зона .CLINIC
29.04.2026
3
База знаний / Все о доменах
Доменная зона .INTERNATIONAL