MetrikaYandex

Rsync настройка бэкапа на CentOS / Debian / Ubuntu

0
6148
Rsync настройка бэкапа на CentOS / Debian / Ubuntu

Существует много способов организации backup на CentOS/Debian/Ubuntu серверах — бесплатные утилиты, самописные скрипты с использованием tar, система бэкапа bacula и много другое. Все это в той или иной мере я использовал или использую в своей работе. Сегодня я хочу с вами поделиться своим методом организации простого, удобного и быстрого способа настройки инкрементного backup с использованием популярной утилиты rsync на серверах под управлением CentOS/Debian/Ubuntu. Способ одинаково работает на этих системах, небольшие отличия только в самой установке rsync, о чем я отдельно упомяну для каждой системы.

к содержанию ↑

ОСОБЕННОСТИ RSYNC

Давайте сначала рассмотрим примечательные особенности Rsync:

  • Возможность поддерживать синхронизацию целых деревьев каталогов;
  • Можно сохранять символические ссылки, жесткие ссылки,  владельцев и права файла, метаданные и время создания;
  • Не требует особых привилегий;
  • Передача файлов одним потоком;
  • Поддержка RSH, SSH в качестве транспорта;
  • Поддержка анонимного Rsync.

СИНТАКСИС RSYNC

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

 sudo apt-get install rsync

А теперь, уже по традиции подобных статей, рассмотрим синтаксис команды rsync:

$ rsync опции источник приемник

В качестве источника и приемника может выступать удаленная или локальная директория. Например, ssh, rsync, samba сервер или локальная директория. Опции задают дополнительные параметры rsync.

к содержанию ↑

ОПЦИИ RSYNC

Теперь давайте кратко рассмотрим параметры rsync. Здесь перечислены не все опции. Для более подробной информации смотрите man rsync:

  • -v — Выводить подробную информацию о процессе копирования;
  • -q — Минимум информации;
  • -c — Проверка контрольных сумм для файлов;
  • -a — Режим архивирования, когда сохраняются все атрибуты оригинальных файлов;
  • -R — Относительные пути;
  • -b — Создание резервной копии;
  • -u — Не перезаписывать более новые файлы;
  • -l — Копировать символьные ссылки;
  • -L — Копировать содержимое ссылок;
  • -H — Копировать жесткие ссылки;
  • -p — Сохранять права для файлов;
  • -g — Сохранять группу;
  • -t — Сохранять время модификации;
  • -x — Работать только в этой файловой системе;
  • -e — Использовать другой транспорт, например, ssh;
  • -z — Сжимать файлы перед передачей;
  • —delete — Удалять файлы которых нет в источнике;
  • —exclude — Исключить файлы по шаблону;
  • —recursive — Перебирать директории рекурсивно;
  • —no-recursive — Отключить рекурсию;
  • —progress — Выводить прогресс передачи файла;
  • —stat — Показать статистику передачи;
  • —version — Версия утилиты.
к содержанию ↑

НАСТРОЙКА СЕРВЕРА RSYNC

Как вы понимаете, нельзя просто так взять и закинуть на первую попавшуюся машину файлы без установки на нее специального программного обеспечения. На удаленной машине должен быть установлен и настроен RSYNC, SSH, Samba или FTP сервер, с помощью которого Rsync сможет авторизоваться на машине и передавать туда файлы.

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

Сначала создайте конфигурационный файл со следующим содержимым:

 sudo vi /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 = 192.168.56.1
hosts deny = *
list = true
uid = root
gid = root
read only = false

Rsync настройка бэкапа на CentOS / Debian / Ubuntu

Здесь мы задаем путь к нашей папке для синхронизации, разрешаем доступ к серверу только с ip адреса (192.168.56.1) и запрещаем все остальные подключения. Параметры uid и gid указывают пользователя и группу, от которых будет запущен демон. Лучше не использовать root, а указать пользователя nobody и выдать ему права на ту папку, в которую будет выполняться синхронизация каталогов rsync.

Настройка rsync завершена, остается сохранить файл, запустить сервер rsync и добавить его в автозагрузку:

 sudo systemctl start rsync

 sudo systemctl enable rsync

Rsync настройка бэкапа на CentOS / Debian / Ubuntu

Сервер будет предоставлять доступ к файлам без запроса пароля.

к содержанию ↑

ПРИМЕРЫ СИНХРОНИЗАЦИИ RSYNC

Дальше давайте рассмотрим использование rsync, примеры синхронизации.

1. КОПИРОВАНИЕ И СИНХРОНИЗАЦИЯ ФАЙЛОВ НА ЛОКАЛЬНОМ КОМПЬЮТЕРЕ

Rsync позволяет синхронизировать файлы и папки в пределах одной машины. Давайте сначала рассмотрим использование rsync для синхронизации файла на локальном компьютере:

 rsync -zvh file /tmp/backups/

Rsync настройка бэкапа на CentOS / Debian / Ubuntu

 

Указав опцию —progress вы можете видеть сколько процентов уже скопировано, а сколько еще осталось:

rsync -zvh --progress file /tmp/backups/

Rsync настройка бэкапа на CentOS / Debian / Ubuntu

к содержанию ↑

2. СИНХРОНИЗАЦИЯ ПАПОК НА ЛОКАЛЬНОЙ МАШИНЕ

Синхронизация папок rsync выполняется так же просто, как и файлов:

 rsync -zvh /home/user/documents /tmp/backups/

Если вы хотите, чтобы все атрибуты файлов, такие, как дата изменения и создания сохранялись, необходимо использовать опцию -a:

 

rsync -azvh /home/user/documents /tmp/backups/

Rsync настройка бэкапа на CentOS / Debian / Ubuntu

к содержанию ↑

3. СИНХРОНИЗАЦИЯ С УДАЛЕННЫМ СЕРВЕРОМ

Ненамного сложнее синхронизировать файлы с удаленным сервером. Скопируем локальную папку documents, на удаленный сервер:

 rsync -avz /home/sergiy/tmp/ [email protected]:/home/

 

По умолчанию rsync попытается использовать транспорт ssh. Если вы хотите использовать ранее созданный сервер rsync, нужно указать это явно:

rsync -avz /home/sergiy/tmp/ rsync://192.168.56.102:/share

 

 

 

Точно также можно синхронизировать файлы с rsync из удаленного сервера:

rsync -avz [email protected]:/home/ /home/sergiy/tmp/

Адрес удаленного сервера записывается в таком формате:

имя_пользователя@адрес_машины/папка/на/удаленной_машине

Синхронизация папок rsync будет выполняться на стандартном порту.

к содержанию ↑

4. СИНХРОНИЗАЦИЯ ФАЙЛОВ ПО SSH

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

Синхронизация файлов rsync с удаленного сервера по ssh будет выглядеть вот так:

 rsync -avzhe ssh [email protected]:/root/install.log /tmp/

Если вы используете другой порт для ssh, то здесь его можно указать:

rsync -avzhe "ssh -p 22" [email protected]:/root/install.log /tmp/

Rsync настройка бэкапа на CentOS / Debian / Ubuntu

А теперь передадим данные на тот же сервер:

 rsync -avzhe ssh backup.tar [email protected]:/backups/

к содержанию ↑

5. ПРОСМОТР ПРОГРЕССА ПРИ СИНХРОНИЗАЦИИ

Для просмотра прогресса копирования файла с одной машины на другую используется опция progress:

 rsync -avzhe ssh --progress /home/user/documents [email protected]:/root/documents

6. СИНХРОНИЗАЦИЯ НЕ ВСЕХ ФАЙЛОВ В RSYNC

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

Например, скопируем все файлы, начинающиеся на букву R:

 rsync -avze ssh --include 'R*' --exclude '*' [email protected]:/root/documents/ /root/documents

7. УДАЛЕНИЕ ПРИ СИНХРОНИЗАЦИИ

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

Например:

 rsync -avz --delete [email protected]:/documents/ /tmp/documents/

Если перед выполнением этой команды создать в папке файл которого нет на удаленном сервере, то он будет удален.

к содержанию ↑

8. МАКСИМАЛЬНЫЙ РАЗМЕР ФАЙЛОВ

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

 rsync -avzhe ssh --max-size='200k' /user/documents/ [email protected]:/root/documents

9. УДАЛЕНИЕ ИСХОДНЫХ ФАЙЛОВ

Есть возможность удалять исходные файлы после завершения синхронизации с удаленным сервером:

 rsync --remove-source-files -zvh backup.tar /tmp/backups/

Таким образом, файл backup.tar будет удален после завершения копирования в папку /tmp/backups.

10. РЕЖИМ СИМУЛЯЦИИ RSYNC

Если вы новичок, и еще не использовали rsync, то возможно захотите посмотреть как отработает команда без применения реальных действий в файловой системе. Для этого есть опция dry-run. Команда только выведет все выполняемые действия в терминал, без выполнения реальных изменений:

 rsync --dry-run --remove-source-files -zvh backup.tar /tmp/backups/

11. ОГРАНИЧИТЬ СКОРОСТЬ ПЕРЕДАЧИ

Вы можете ограничить использование пропускной способности сети с помощью опции —bwlimit:

 rsync --bwlimit=100 -avzhe ssh /user/home/documents/ [email protected]:/root/documents/

Как я уже писал выше, rsync синхронизирует только части файла, если вы хотите синхронизировать файл целиком используйте опцию -W:

 rsync -zvhW backup.tar /tmp/backups/backup.tar
backup.tar

к содержанию ↑

12. АВТОМАТИЧЕСКАЯ СИНХРОНИЗАЦИЯ ПАПОК RSYNC

Можно расписать автоматическую синхронизацию с помощью cron. Но в случае доступа к серверу по SSH необходимо будет создать ключ и загрузить его на сервер, чтобы аутентификация проходила без запроса пароля.

Создаем ключ:

 ssh-keygen -t rsa

Загружаем ключ на сервер к с которым собираемся синхронизироваться:

 ssh-copy-id -i /home/sk/.ssh/id_rsa.pub [email protected]

Теперь можем переходить к настройке расписания cron. Будем запускать синхронизацию каждый день:

 crontab -e

 00 05 * * * rsync -azvre ssh /home/user/Downloads/ 192.168.56.102:/share

rsync синхронизация каталогов будет выполняться каждый день в пять утра. Подробнее о настройке расписаний Cron можно почитать в отдельной статье.

к содержанию ↑

Установка rsync на CentOS 8

Чаще всего rsync уже присутствует в базовой версии centos 8, но скорее всего без версии, работающей в качестве службы. Так что устанавливаем обоих:

# dnf install rsync rsync-daemon

Rsync настройка бэкапа на CentOS / Debian / Ubuntu

Если у вас еще нет настроенной системы, то используйте мои статьи по установке и настройке centos 8. Запускаем rsyncd и добавляем в автозагрузку.

# systemctl enable --now rsyncd
Created symlink /etc/systemd/system/multi-user.target.wants/rsyncd.service → /usr/lib/systemd/system/rsyncd.service.

Проверяем автозагрузку:

# systemctl list-unit-files --type service | grep rsyncd
rsyncd.service enabled

Проверяем, слушает ли служба сетевой порт.

# netstat -tulpn | grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      40814/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      40814/rsync         

Все в порядке, можно приступать к настройке rsync. Если вам не нужен ipv6, то можете его отключить.

к содержанию ↑

Установка rsync на CentOS 7

Ставим rsync:

# yum install rsync

Добавляем в автозагрузку:

# systemctl enable rsyncd

ln -s '/usr/lib/systemd/system/rsyncd.service' '/etc/systemd/system/multi-user.target.wants/rsyncd.service'

Проверяем автозагрузку:

# systemctl list-unit-files --type service | grep rsyncd

rsyncd.service enabled

Запускаем rsync:

# systemctl start rsyncd

Проверяем, как запустился:

# netstat -tulpn | grep rsync

tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      2782/rsync

Все в порядке, можно приступать к настройке rsync.

к содержанию ↑

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

Онлайн курсы по Микротик
Rsync настройка бэкапа на CentOS / Debian / Ubuntu

Устанавливаем rsync:

# apt install rsync

Правим конфиг:

# mcedit /etc/default/rsync

Находим строку RSYNC_ENABLE=false и меняем на true:

RSYNC_ENABLE=true

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

# touch /etc/rsyncd.conf

Запускаем 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

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

# 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          

Все в порядке, можно приступать к настройке rsync.

к содержанию ↑

Настройка rsync

Теперь приступаем к настройке. Логика наших бэкапов будет следующая. При первом запуске мы делаем полный бэкап интересующей нас информации в папку current. Потом раз в сутки мы сверяем имеющийся архив с источником и делаем его вновь актуальным, перезаписывая все изменившиеся файлы, но при этом не удаляем их, а складываем в папку increment, где каждый день создается папка с именем в виде даты, в которую складываются все измененные файлы за текущий день. Таким образом, у нас всегда будет полный архив, актуальный на момент последней синхронизации, плюс набор папок за каждый день с изменившимися в этот день файлами. Сколько дней хранить, можно выбрать по необходимости.

Получается у нас такая картинка:

rsync

При этом подключение и работа rsync будет проходить по своему отдельному порту tcp 873. Не забудьте настроить iptables и открыть этот порт. Приступаем к реализации. В первую очередь настраиваем rsync на серверах источниках информации, с которых мы будем забирать данные для backup.

Создаем файл конфигурации 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. А потом по мере необходимости редактирую уже его, добавляю или удаляю сервера.

к содержанию ↑

Копирование rsync через ssh

Rsync может работать через ssh. Это избавляет от необходимости настраивать отдельно службу и авторизацию, но при этом будут использоваться системные учетные записи. У меня есть предположение, что производительность при подключении по ssh будет ниже, но я нигде не видел подтверждения этому.

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

# /usr/bin/rsync -avz --progress --delete [email protected]:/data/mysql_dump /backup
Будьте внимательны при использовании ключа —delete. Не перепутайте источник, откуда качаете файлы, с приемником, куда копируете. Если их перепутать и в качестве источника указать пустую папку, а в качестве приемника с файлами, файлы будут удалены моментально и без предупреждения.

Если для подключения вы используете публичный ключ или нестандартный порт ssh, указать эти параметры можно следующим образом.

# /usr/bin/rsync -avz --progress --delete -e "ssh -p 1234 -i /root/.ssh/id_rsa.pub" [email protected]:/data/mysql_dump /backup
к содержанию ↑

Настройка исключений

Вы можете настроить исключение файлов или каталогов при копировании с помощью rsync. Делается это с помощью ключа —exclude или —exclude-from. Первый позволяет указать исключение непосредственно в команде на исполнение. Второй позволяет загружать список исключений из файла. Пример первого варианта:

# /usr/bin/rsync -avz --progress --delete --exclude='*.jpeg' [email protected]:/var/www/html /backup

Вы скопируете директорию с сайтом, исключив из нее все картинки с расширением .jpeg. Таких исключений можно добавить сколько угодно в одной команде. Но удобнее их выносить в отдельный файл. Примерно так.

# /usr/bin/rsync -avz --progress --delete --exclude-from=exclude.lst [email protected]:/var/www/html /backup

Содержимое файла exclude.lst.

*/bitrix/managed_cache/MYSQL/*
*/bitrix/backup/*
*/bitrix/html_pages/site.ru/*
*/upload/resize_cache/*
*/bitrix/cache/*
*/log.txt
*/rating/logs/my_file.log

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

к содержанию ↑

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

Мы ранее указали в настройках службы rsyncd ведение лога в файл /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 версии лог файла. Эти настройки вы можете сами поменять по своему усмотрению.

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

к содержанию ↑

Пример бэкапа windows сервера с помощью rsync

Еще один пример из моей практики. Допустим, у нас есть windows сервер с некоторой информацией, которую мы хотим так же бэкапить. Никаких проблем, это делается достаточно просто.

Создаем на windows сервере сетевую шару с информацией. Создаем пользователя и добавляем его в доступ к этой папке. Этого пользователя мы будем использовать для подключения виндовой шары к linux серверу.

Монтируем шару с информацией, которую будем бэкапить:

# mount -t cifs //192.168.0.16/docs /mnt/docs -o user=backup,password=12345,iocharset=utf8,codepage=cp866

192.168.0.16 — адрес виндовой шары
backup и 12345 — пользователь и пароль виндовой машины с доступом к шаре docs.

Все, теперь папку /mnt/docs можно использовать в качестве приемника в нашем скрипте бэкапа с rsync. Если папка примонтирована непосредственно к серверу с бэкапами, то нужно на нем самом настроить конфиг rsyncd на примере серверов источников, запустить на нем rsyncd и в скрипте в качестве ip адреса сервера указывать 127.0.0.1.

Я в таких случаях создаю несколько скриптов: на монтирование шары, бэкап и размонтирование, объединяю их в один и запускаю последовательно. В итоге получается, что подключаем диск, делаем бэкап и отключаем его.

Так же есть возможность установить на Windows Server rsync с помощью cygwin. Подобный функционал собран в готовом приложении — cwRsync server. Его настройка ничем принципиально не отличается от настройки linux версии. Нужно только внимательно следить за путями к директориям, примеры есть в конфигах.

Оставьте свой ответ