Установка, настройка и примеры синхронизации 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:
где первая группа параметров, в файле конфигурации, являются общими настройками:
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 непривилегированные учетные записи.
где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
Проверяем, что работает:
-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=<список> - не выполнять компрессию для перечисленных файлов.
(-h) --help — вывод справочной информации по использованию rsync.
Ротация логов rsync
Ранее мы указали в настройках службы rsync ведение лога в файл /var/log/rsyncd.log. Необходимо настроить ротацию этого лога, чтобы он не рос до бесконечности. На больших файловых серверах он очень быстро вырастет до сотен мегабайт и более.
Для этого создаем в папке /etc/logrotate.d файл с конфигурацией ротации:
С такими настройками ротация будет происходить каждый раз, когда файл лога превысит размер в 500 кб. Храниться будут 4 версии лог файла. Эти настройки вы можете сами поменять по своему усмотрению.
Когда используете ротацию по размеру файла, не забывайте проверять, что она у вас корректно работает. В разных дистрибутивах есть нюансы на этот счет.
Копирование и синхронизация файлов с rsync (локально и удаленно)
При локальном режиме работы достаточно задать каталог/файл-источник и каталог/файл-приемник:
Для корректной работы с удаленным узлами необходимо настроить доступ по ключам. Rsync этот метод подключения также поддерживает.
Синхронизация по SSH и Rsync-демон
По умолчанию синхронизация выполняется по протоколу SSH, дополнительные параметры для этого указывать не требуется. Чтобы обращаться напрямую к Rsync, минуя SSH, на сервере-приемнике должен быть запущен демон Rsync. В предыдущем разделе мы как раз уже это сделали, поэтому можем обратиться с удаленного сервера:
Автоматическая синхронизация папок выполняется штатным способом — планировщиком заданий (cron). Планировщиком удобнее выполнять скрипт, так будет упрощается управление конфигурацией синхронизации. Создадим скрипт:
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. А потом по мере необходимости редактируется уже он, добавляется или удаляется с сервера.