Установка, настройка и примеры синхронизации 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
Исключить каталог:
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
Делаем права на чтение только 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. А потом по мере необходимости редактируется уже он, добавляется или удаляется с сервера.