Перейти к содержанию

Установка, настройка и примеры синхронизации Rsync

Rsync — утилита для удаленной синхронизации и копирования файлов. Ее еще можно назвать «SCP на стероидах». Из преимуществ: позволяет не передавать файлы полностью, а только изменения в них, синхронизирует директории и файлы, имеет встроенный механизм сжатия.

Возможности Rsync

Ключевое преимущество утилиты — синхронизация структуры директорий целиком или файлов по-отдельности. Можно синхронизировать данные между узлами сети, сетевыми хранилищами, дисками и каталогами.

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

Rsync использует алгоритм сжатия данных Deflate c помощью модифицированной библиотеки zlib, поэтому пропускная способность каналов связи используется экономичнее в сравнении с утилитой SCP.

Вместе с файлами или каталогами, Rsync реплицирует также и разрешения на них. Вместе с этим, для работы не требуются права root, поэтому Rsync подойдет для целей резервного копирования и восстановления данных.

Как установить, настроить и выполнить запуск Rsync

на CentOS 8

Установка Rsync на Centos 8 выполняется из репозитория операционной системы, стандартным пакетным менеджером dnf:

dnf -y install rsync rsync-daemon

Команда установит саму утилиту rsync (клиентскую часть) и демон rsync (серверную часть). Серверная часть нужна для приема входящих обращений на синхронизацию через rsync без использования SSH. Позже покажем как обратиться к ней с внешнего сервера.

на Debian/Ubuntu

Установка Rsync на Debian/Ubuntu

apt-get install rsync

Открываем следующий файл:

mcedit /etc/default/rsync

Находим запись:

RSYNC_ENABLE=false

И меняем на:

RSYNC_ENABLE=true

Создаем пустой файл конфигурации etc/rsyncd.conf, он нужен для запуска службы. Позже мы его заполним настройками.

touch /etc/rsyncd.conf

Настройка

Перед началом работы необходимо выполнить настройку. Конфигурация выполняется в файле /etc/rsyncd.conf:

mcedit /etc/rsyncd.conf

И настраиваем его, примерно, следующим образом:

pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log

[share]
path = /tmp/share/
hosts allow = localhost 192.168.56.1
hosts deny = *
list = true
uid = nonroot
gid = nonroot
read only = false
comment = Shared folder

или вот еще пример, для настройка двух ресурсов:

max connections = 10
exclude = lost+found/
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 *.rar *.7z *.mp3 *.jpg

[data1]
    path = /data1/
    comment = Public folders
    read only = yes
    list = yes
    auth users = rsync_d1
    secrets file = /etc/rsyncd.scrt
    hosts allow = localhost 192.168.0.15 192.168.0.20
    hosts deny = *


[data2]
    uid = root
    gid = root
    path = /data2/
    comment = Private folders
    read only = yes
    list = yes
    auth users = rsync_d2, backup
    secrets file = /etc/rsyncd.scrt
    hosts allow = localhost 192.168.0.16 192.168.0.21
    hosts deny = *

где первая группа параметров, в файле конфигурации, являются общими настройками:

  • pid file — файл, в котором будет храниться номер процесса демона Rsync
  • lock file — файл блокировки для защиты от повторного запуска Rsync
  • log file — журнал сообщений, генерируемых демоном Rsync в процессе работы
  • max connections — максимальное число одновременных подключений. Стоит задать, чтобы не перегружать сервер.
  • exclude — папки, которые стоит исключить из синхронизации. В конкретном примере каталог для размещения восстановленных после проверки диска файлов.
  • dont compress — указываем, какие файлы не нужно сжимать при отправке. Имеет смысл указать те, сжатие которых не даст результата, например, архивы, сжатые аудио и изображения.

а также каждый ресурс настраивается отдельно (в нашем примере share, data1 и data2):

  • path — путь до каталога, для которого выполняется синхронизация или копирование;
  • hosts allow — хосты, которым явно разрешено подключаться к демону Rsync для передачи файлов;
  • hosts deny — хосты, которым явно запрещено подключаться к демону Rsync для передачи файлов (в примере выше со всех, кроме разрешенных);
  • list — флаг разрешения/запрета чтения каталога;
  • uid — пользователь, от имени которого будет выполняться синхронизация для конкретного ресурса;
  • gid — группа, от имени которой будет выполняться синхронизация для конкретного ресурса;
  • read only — флаг для защиты имеющихся данных от изменения или удаления;
  • comment — описание конфигурации.
  • auth users — проверка подлинности, вводом логина с паролем.
  • secrets file — файл, в котором размещены логин и пароль.

Рекомендуем использовать для переменных uid и gid непривилегированные учетные записи.

Создаем файл для аутентификации:

mcedit /etc/rsyncd.scrt

Следующего содержания:

rsync_d1:password1
rsync_d2:password2
backup:password3
  • где rsync_d1:password1соответственно, пользователь rsync_d1 с паролем password1.

В целях безопасности, устанавливаем доступ только для владельца:

chmod 600 /etc/rsyncd.scrt

Перезапускаем сервис одной из команд:

systemctl restart rsyncd
/etc/init.d/rsync restart

Если необходимо, добавляем порты в брандмауэр.

Firewalld:

firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --reload

Iptables:

iptables -I INPUT 1 -p tcp --dport 873 -j ACCEPT
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

Перед запуском утилиты, нужно также создать указанную в конфигурации директорию:

mkdir /tmp/share

На этом настройка Rsync в Linux завершена и можно запускать утилиту:

Запускаем rsync:

systemctl enable --now rsync
Synchronizing state of rsync.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable rsync
Проверяем, что работает:
или
/etc/init.d/rsync start

Проверяем, что работает:

netstat -tulnp | grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      2232/rsync
tcp6       0      0 :::873                  :::*                    LISTEN      2232/rsync

или

systemctl statusrsync

Если включен SELinux и Firewall. Теперь выполним настройки безопасности. Чтобы Rsync работал корректно, важно настроить SELinux и сетевой экран:

setsebool -P rsync_full_access on
firewall-cmd --add-service=rsyncd --permanent
firewall-cmd --reload

Синтаксис Rsync

В этом разделе мы приведем основные параметры, с которыми выполняется Rsync. Синтаксис в общем виде выглядит так:

rsync -options <source> <destination>
  • -options — параметры, с которыми должна выполняться утилита.

  • — каталог или файл, который является источником.

  • — каталог или файл, который является приемником.

Ниже приведены основные параметры, с которыми вызывается Rsync:

  • -v, —verbose — для отображения отладочной информации в процессе синхронизации.
  • -q, —quiet — для запрета вывода об ошибках.
  • --no-motd - не выводит приветствие в MOTD
  • --no-<опция> - отключает конкретную опцию, например, вышеописанная no-motd.
  • -c, —checksum — для сравнения файлов по контрольной сумме, вместо даты/времени изменения или размера.
  • -a, —archive — включение сжатия данных.
  • -r, —recursive — для включения режима рекурсивного копирования директорий.
  • -R, --relative - использовать относительные пути.
  • --no-implied-dirs - выключить параметр --relative.
  • -b, —backup — для активации режима режима резервного копирования, чтобы создавались резервные копии оригинальных файлов при обновлении.
  • —backup-dir=<каталог> — каталог, в котором будут храниться резервные копии.
  • —suffix=SUFFIX — суффикс для файлов, сохраняемых в режиме резервного копирования.
  • -d, --dirs - не использовать рекурсию для каталогов.
  • -u, —update — для пропуска обновления файлов с более поздней датой изменения.
  • -l, —links — для сохранения символических ссылок.
  • -L, --copy-links - копировать не симлинк а ее содержимое (трансформировать симлинк в каталог).
  • -k, --copy-dirlinks - преобразовать симлинк на каталог в обычный каталог.
  • -K, --keep-dirlinks - в папке назначения обрабатывать симлинк как каталог.
  • -H, —hard-links — для сохранения жестких ссылок.
  • -p, —perms — для сохранения разрешений объекта (файла или каталога).
  • -E, —executability — для сохранения прав на исполнение.
  • -A, --acls - сохранить права ACL.
  • -X, --xattrs - сохранить атрибуты файлов.
  • —chmod=<права> — для изменения прав доступа на конкретные объекты (файлы или каталоги).
  • -o, —owner — для сохранения владельца объекта.
  • -g, —group — для сохранения группы владельца.
  • -S, —sparse — для выполнения дефрагментации одновременно с копированием данных.
  • -t, --times - сохранять временные отметки.
  • --existing - не создавать новые файлы в каталоге назначения.
  • -n, —dry-run — для тестирования без копирования;
  • --remove-source-files - источник удаляет свои файлы после выполнения синхронизации.
  • -e, --rsh=<команда> - указать оболочку для использования, например SSH.
  • --devices - копировать файлы-устройства (разрешено только при выполнении команды с правами суперпользователя).
  • --copy-devices - копировать файлы устройства как обычные файлы.
  • -D - заменяет --devices и --specials одновременно.
  • --ignore-existing - не обновлять существующие файлы в каталоге назначения.
  • --specials - сохранять специальные файлы.
  • -B, --block-size=<размер> - принудительно фиксировать размер блока контрольной суммы
  • -W, —whole-file — для копирования файлов целиком, по умолчанию копируется только часть с изменениями.
  • -x, --one-file-system - не разрешает переходить границы файловой системы. Например, если в один из синхронизируемых каталогов может быть примонтирована сетевая файловая система, ее копирование может вызвать неудобства.
  • —delete — для удаления старых файлов, если их уже нет в источнике копирования.
  • —delete-before — для удаления файлов в папке назначения до начала синхронизации.
  • --delete-during - удалить файлы в папке назначения в момент синхронизации.
  • --delete-delay - поиск файлов на удаление в момент синхронизации, а удаление после.
  • --delete-after - удалить файлы в папке назначения после синхронизации.
  • --delete-excluded - удалить исключенные из синхронизации файлы в каталоге назначения.
  • --ignore-errors - удалять файлы даже при ошибках ввода/вывода.
  • --force - принудительное удаление не пустых каталогов.
  • —max-delete=<количество файлов> — для ограничения максимального числа удаляемых файлов.
  • —max-size=<размер файлов> — для ограничения максимального размера передаваемых файлов.
  • —min-size=<размер файлов> — для ограничения минимального размера передаваемых файлов.
  • --partial - оставлять файлы, которые переданы не до конца (процесс копирования завершился в процессе).
  • --partial-dir=<каталог> - хранить частично переданные файлы в специальном каталоге.
  • --timeout=<секунды> - установить время ожидания от системы ввода/вывода.
  • --contimeout=<секунды> - установить время ожидания для подключения к демону rsync.
  • -I, --ignore-times - все равно копировать файлы, если они имеют одинаковые разметы или время изменения.
  • --size-only - не копировать только те файлы, которые имеют одинаковые размеры.
  • -T, --temp-dir=<каталог> - все временные файлы размещать в определенном каталоге.
  • -z, —compress — для включения сжатия файлов во время передачи.
  • —compress-level=<число> — для установки уровня сжатия от 0 до 9.
  • --skip-compress=<список> - не выполнять компрессию для перечисленных файлов.
  • -C, --cvs-exclude - исключить от копирования файлы, которые исключаются CVS (RCS/ SCCS/ CVS/ .svn/ CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo ~ # .#* ,* .old *.bak *.BAK *.orig *.rej .del- *.a *.o *.obj *.so *.Z *.elc *.ln core)
  • -f, --filter=<правило> - добавить правило для фильтра.
  • —exclude=<имена файлов> — для исключения из синхронизации файлов.
  • —exclude-from=<имя файла> — для исключения из синхронизации файлов, указанных в файле.
  • —include=<имена файлов> — для включения в синхронизацию файлов.
  • —include-from=<имя файла> — для включения в синхронизацию файлов, указанных в файле.
  • --files-from=<файл> - читать список имен исходных файлов из файла.
  • --address= - привязать IP-адрес для исходящего сокета.
  • —port=<порт> — для установки сетевого порта для подключения на удаленном узле.
  • --sockopts=OPTIONS - использовать специальные опции для TCP.
  • --blocking-io - использовать блокирующий ввод-вывод для удаленной оболочки
  • --stats - вывод статистики по передаче данных.
  • -h, --human-readable - вывод чисел в удобном для чтения формате.
  • —progress — для включения строки прогресса при синхронизации.
  • —log-file=<файл> — для указания места расположения лог-файла.
  • —password-file=<файл> — При аутентификации пароль можно хранить в специальном файле. Это необходимо для автоматизации выполнения команды без пароля.
  • —list-only — для отображения имен файлов без копирования.
  • -P - то же самое, что --partial и --progress.
  • -i, --itemize-changes - выводить сводку изменений для всех обновлений
  • —bwlimit=<число> — для ограничения скорости передачи в Кбит/c.
  • --protocol=<число> - принудительно использовать более старую версию протокола.
  • --iconv=<кодировка> - запрос кодировки преобразования имен файлов.
  • -4, —ipv4 — приоритет использования IPv4.
  • -6, —ipv6 — приоритет использования IPv6.
  • —version — для вывода версии Rsync.
  • (-h) --help — вывод справочной информации по использованию rsync.

Ротация логов rsync

Ранее мы указали в настройках службы rsync ведение лога в файл /var/log/rsyncd.log. Необходимо настроить ротацию этого лога, чтобы он не рос до бесконечности. На больших файловых серверах о*н очень быстро вырастет до сотен мегабайт и более*.

Для этого создаем в папке /etc/logrotate.d файл с конфигурацией ротации:

mcedit /etc/logrotate.d/rsyncd
/var/log/rsyncd.log {
size=500k
compress
rotate 4
missingok
notifempty
}

С такими настройками ротация будет происходить каждый раз, когда файл лога превысит размер в 500 кб. Храниться будут 4 версии лог файла. Эти настройки вы можете сами поменять по своему усмотрению.

Когда используете ротацию по размеру файла, не забывайте проверять, что она у вас корректно работает. В разных дистрибутивах есть нюансы на этот счет.

Копирование и синхронизация файлов с rsync (локально и удаленно)

При локальном режиме работы достаточно задать каталог/файл-источник и каталог/файл-приемник:

rsync -avzhHl /path/of/source/folder /path/to/destination/folder
rsync -avzhHl --progress sat_cache.mbtiles.partaa /tmp

Если копирование нужно выполнить с удаленным узлом, добавляется имя пользователя и IP-адрес или имя узла:

rsync -avzhHl /path/of/source/folder root@192.168.56.1:/path/to/destination/folder

Для корректной работы с удаленным узлами необходимо настроить доступ по ключам. Rsync этот метод подключения также поддерживает.

Синхронизация по SSH и Rsync-демон

По умолчанию синхронизация выполняется по протоколу SSH, дополнительные параметры для этого указывать не требуется. Чтобы обращаться напрямую к Rsync, минуя SSH, на сервере-приемнике должен быть запущен демон Rsync. В предыдущем разделе мы как раз уже это сделали, поэтому можем обратиться с удаленного сервера:

rsync -avz /tmp/share rsync://192.168.56.101:/tmp/share

Автоматическая синхронизация папок

Автоматическая синхронизация папок выполняется штатным способом — планировщиком заданий (cron). Планировщиком удобнее выполнять скрипт, так будет упрощается управление конфигурацией синхронизации. Создадим скрипт:

mcedit rsync_to_cron.sh

Содержание скрипта

!/bin/sh

RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
KEY=/root/.ssh/id_rsa
RUSER=root
RHOST=192.168.56.1
RPATH=/remote/dir
LPATH=/local/dir

$RSYNC -az -e "$SSH -i $KEY" $RUSER@$RHOST:$RPATH $LPATH

Далее создадим задание в планировщике:

crontab -e

Вводим

0 22 * * * /root/scripts/rsync_to_cron.sh

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

Просмотр прогресса синхронизации

Для просмотра прогресса синхронизации, вместе с запуском утилиты необходимо использовать ключ —progress:

rsync -avzhHl --progress /path/of/source/folder root@192.168.56.1:/path/to/destination/folder

Удаление при синхронизации

В процессе синхронизации можно удалять файлы на сервере-приемнике, которых уже нет на сервере-источнике. Для этого используется опция —delete:

rsync -avzhHl --delete /path/of/source/folder root@192.168.56.1:/path/to/destination/folder

Ограничение максимального размера и скорости передачи

Rsync также имеет встроенную возможность ограничения максимального размера синхронизируемого файла. Для этого нужно использовать опцию —max-size:

rsync -avzhHl --max-size=’100M’ /path/of/source/folder root@192.168.56.1:/path/to/destination/folder

Для ограничения скорости передачи предназначена опция —bwlimit (значение указывается в Кбит/с):

rsync -avzhHl --bwlimit=’100’ /path/of/source/folder root@192.168.56.1:/path/to/destination/folder

Опции include и exclude

Специальные опции —include и —exclude позволяют включать или исключать из синхронизации файлы с определенными именами:

rsync -avzhHl --include='.txt' --exclude='' /path/of/source/folder root@192.168.56.1:/path/to/destination/folder

Есть возможность перечислить включаемые или исключаемые имена в файле, для этого используются опции —include-from и —exclude-from соответственно:

rsync -avzhHl --include-from='/root/rsync_include.conf' --exclude='/root/rsync_exclude.conf' /path/of/source/folder root@192.168.56.1:/path/to/destination/folder

Простая команда для синхронизации двух каталогов:

rsync -a --delete-after user@192.168.0.15::data_source /data_destination

Команда для резервного копирования:

rsync -ab --delete-after user@192.168.0.15::data_source /data_destination

Выполнение синхронизации по SSH:

rsync -a --delete-after -e "ssh -p 22" user@192.168.0.15:/data_source /data_destination
  • по SSH запросы идут не через rsync server. В данном примере подключение будет выполнено по 22 порту, под учетной записью user.

Копирование файлов на удаленную машину:

rsync -a --delete-after /data_destination user@192.168.0.15::data_source

Синхронизация в обе стороны (запускаем две команды по очереди):

rsync -a --delete-after user@192.168.0.15::data_source /data_destination
rsync -a --delete-after /data_destination user@192.168.0.15::data_source

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

rsync -a --include='*.txt' --exclude='*' user@192.168.0.15::data_source /data_destination
* в этом примере будут синхронизированы только файлы с расширением txt.

Исключить каталог:

rsync -a --exclude='folder/*' user@192.168.0.15::data_source /data_destination

Еще пример готового скрипта для синхронизации папок

Скрипт довольно прост:

#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

password_file='/etc/rsyncd.scrt'
user='opros'
ip='192.168.0.15'
source='data1'
destination='/tmp/'

rsync -a --delete-after --password-file=$password_file $user@$ip::$source $destination
* где:

  • password_file — пароль, в котором будет храниться пароль.
  • user — учетная запись для авторизации.
  • ip — IP-адрес сервера rsync.
  • source — имя ресурса на сервере.
  • destination — каталог, в который синхронизируем файлы.

После создаем файл с паролем:

mcedit /etc/rsyncd.scrt
Содержимое файла:
password

  • в данном файле указываем только пароль без имени учетной записи.

После задаем права:

chmod 600 /etc/rsyncd.scrt

Автоматизировать синхронизацию можно с помощью CRON:

crontab -e
Прописываем
0 */1 * * * /scripts/syncing.sh

  • где /scripts/syncing.sh — наш скрипт. В данном примере задание будет выполняться каждый час.

Rsync настройка бэкапа

Создаем файл конфигурации rsync:

# mcedit /etc/rsyncd.conf
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
transfer logging = true
munge symlinks = yes

# папка источник для бэкапа
[data]
path = /data
uid = root
read only = yes
list = yes
comment = Data backup Dir
auth users = backup
secrets file = /etc/rsyncd.scrt

Создаем файл с учетными данными для подключения:

mcedit /etc/rsyncd.scrt
backup:12345
где backup - имя пользователя, 12345 - пароль.

Делаем права на чтение только root, иначе rsync не запустится:

chmod 0600 /etc/rsyncd.scrt

После настройки перезапускаем rsync. На Centos:

systemctl restart rsyncd

На Debian/Ubuntu:

systemctl restart rsync

Теперь идем на сервер приемник, в котором будут храниться архивные копии с серверов источников. Там создаем скрипт инкрементного бэкапа c использованием rsync:

mcedit /root/bin/backup-server1.sh
Содержание скрипта

#!/bin/bash
date
# Папка, куда будем складывать архивы
syst_dir=/backup/
# Имя сервера, который архивируем
srv_name=server1
# Адрес сервера, который архивируем
srv_ip=10.10.1.55
# Пользователь rsync на сервере, который архивируем
srv_user=backup
# Ресурс на сервере для бэкапа
srv_dir=data
echo "Start backup ${srv_name}"
# Создаем папку для инкрементных бэкапов
mkdir -p ${syst_dir}${srv_name}/increment/
# Запускаем непосредственно бэкап с параметрами
/usr/bin/rsync -avz --progress --delete --password-file=/etc/rsyncd.scrt ${srv_user}@${srv_ip}::${srv_dir} ${syst_dir}${srv_name}/current/ --backup --backup-dir=${syst_dir}${srv_name}/increment/`date +%Y-%m-%d`/
# Чистим папки с инкрементными архивами старше 30-ти дней
/usr/bin/find ${syst_dir}${srv_name}/increment/ -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
date
echo "Finish backup ${srv_name}"

Делаем скрипт исполняемым:

chmod 0744 /root/bin/backup-server1.sh

Создаем файл с паролем для авторизации на сервере источнике:

mcedit /etc/rsyncd.scrt
Содержание файла
12345

Делаем права на чтение только root, иначе rsync выдаст ошибку:

ERROR: password file must not be other-accessible
Исправляем это:
chmod 0600 /etc/rsyncd.scrt

На этом все, теперь можно запускать скрипт и ожидать его выполнения. Если получите ошибку на клиенте:

rsync: opendir "/." (in data) failed: Permission denied (13)
и вот эту на сервере:
SELinux is preventing rsync from getattr access on the file

Проверьте настройки SELinux. Это он блокирует доступ к файлам. Нужно либо отключить selinux, либо настроить. В данном случае настройка простая:

setsebool -P rsync_full_access on

Осталось добавить скрипт в cron:

mcedit /etc/crontab
Добавляем
30 23 * * * root /root/bin/backup-server1.sh

Обычно создается несколько скриптов для каждого сервера отдельно. Потом объединяются их запуск в одном общем скрипте и уже его добавляю в cron. А потом по мере необходимости редактируется уже он, добавляется или удаляется с сервера.