Rsync настройка бэкапа на CentOS / Debian / Ubuntu
- ОСОБЕННОСТИ RSYNC
- СИНТАКСИС RSYNC
- ОПЦИИ RSYNC
- НАСТРОЙКА СЕРВЕРА RSYNC
- ПРИМЕРЫ СИНХРОНИЗАЦИИ RSYNC
- 1. КОПИРОВАНИЕ И СИНХРОНИЗАЦИЯ ФАЙЛОВ НА ЛОКАЛЬНОМ КОМПЬЮТЕРЕ
- 2. СИНХРОНИЗАЦИЯ ПАПОК НА ЛОКАЛЬНОЙ МАШИНЕ
- 3. СИНХРОНИЗАЦИЯ С УДАЛЕННЫМ СЕРВЕРОМ
- 4. СИНХРОНИЗАЦИЯ ФАЙЛОВ ПО SSH
- 5. ПРОСМОТР ПРОГРЕССА ПРИ СИНХРОНИЗАЦИИ
- 6. СИНХРОНИЗАЦИЯ НЕ ВСЕХ ФАЙЛОВ В RSYNC
- 7. УДАЛЕНИЕ ПРИ СИНХРОНИЗАЦИИ
- 8. МАКСИМАЛЬНЫЙ РАЗМЕР ФАЙЛОВ
- 9. УДАЛЕНИЕ ИСХОДНЫХ ФАЙЛОВ
- 10. РЕЖИМ СИМУЛЯЦИИ RSYNC
- 11. ОГРАНИЧИТЬ СКОРОСТЬ ПЕРЕДАЧИ
- 12. АВТОМАТИЧЕСКАЯ СИНХРОНИЗАЦИЯ ПАПОК RSYNC
- Установка rsync на CentOS 8
- Установка rsync на CentOS 7
- Установка rsync на Debian/Ubuntu
- Настройка rsync
- Копирование rsync через ssh
- Настройка исключений
- Ротация логов rsync
- Пример бэкапа windows сервера с помощью rsync
Существует много способов организации 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
Здесь мы задаем путь к нашей папке для синхронизации, разрешаем доступ к серверу только с ip адреса (192.168.56.1) и запрещаем все остальные подключения. Параметры uid и gid указывают пользователя и группу, от которых будет запущен демон. Лучше не использовать root, а указать пользователя nobody и выдать ему права на ту папку, в которую будет выполняться синхронизация каталогов rsync.
Настройка rsync завершена, остается сохранить файл, запустить сервер rsync и добавить его в автозагрузку:
sudo systemctl start rsync
sudo systemctl enable rsync
Сервер будет предоставлять доступ к файлам без запроса пароля.
к содержанию ↑ПРИМЕРЫ СИНХРОНИЗАЦИИ RSYNC
Дальше давайте рассмотрим использование rsync, примеры синхронизации.
1. КОПИРОВАНИЕ И СИНХРОНИЗАЦИЯ ФАЙЛОВ НА ЛОКАЛЬНОМ КОМПЬЮТЕРЕ
Rsync позволяет синхронизировать файлы и папки в пределах одной машины. Давайте сначала рассмотрим использование rsync для синхронизации файла на локальном компьютере:
rsync -zvh file /tmp/backups/
Указав опцию —progress вы можете видеть сколько процентов уже скопировано, а сколько еще осталось:
rsync -zvh --progress file /tmp/backups/
2. СИНХРОНИЗАЦИЯ ПАПОК НА ЛОКАЛЬНОЙ МАШИНЕ
Синхронизация папок rsync выполняется так же просто, как и файлов:
rsync -zvh /home/user/documents /tmp/backups/
Если вы хотите, чтобы все атрибуты файлов, такие, как дата изменения и создания сохранялись, необходимо использовать опцию -a:
rsync -azvh /home/user/documents /tmp/backups/
3. СИНХРОНИЗАЦИЯ С УДАЛЕННЫМ СЕРВЕРОМ
Ненамного сложнее синхронизировать файлы с удаленным сервером. Скопируем локальную папку documents, на удаленный сервер:
rsync -avz /home/sergiy/tmp/ root@192.168.56.102:/home/
По умолчанию rsync попытается использовать транспорт ssh. Если вы хотите использовать ранее созданный сервер rsync, нужно указать это явно:
rsync -avz /home/sergiy/tmp/ rsync://192.168.56.102:/share
Точно также можно синхронизировать файлы с rsync из удаленного сервера:
rsync -avz root@192.168.56.102:/home/ /home/sergiy/tmp/
Адрес удаленного сервера записывается в таком формате:
имя_пользователя@адрес_машины/папка/на/удаленной_машине
Синхронизация папок rsync будет выполняться на стандартном порту.
к содержанию ↑4. СИНХРОНИЗАЦИЯ ФАЙЛОВ ПО SSH
Чтобы задать протокол подключения используется опция -e. При использовании SSH все передаваемые данные шифруются и передаются по защищенному каналу, таким образом, чтобы никто не мог их перехватить. Для использования SSH вам нужно знать пароль пользователя в системе.
Синхронизация файлов rsync с удаленного сервера по ssh будет выглядеть вот так:
rsync -avzhe ssh root@192.168.56.102:/root/install.log /tmp/
Если вы используете другой порт для ssh, то здесь его можно указать:
rsync -avzhe "ssh -p 22" root@192.168.56.102:/root/install.log /tmp/
А теперь передадим данные на тот же сервер:
rsync -avzhe ssh backup.tar root@192.168.0.101:/backups/
5. ПРОСМОТР ПРОГРЕССА ПРИ СИНХРОНИЗАЦИИ
Для просмотра прогресса копирования файла с одной машины на другую используется опция progress:
rsync -avzhe ssh --progress /home/user/documents root@192.168.56.102:/root/documents
6. СИНХРОНИЗАЦИЯ НЕ ВСЕХ ФАЙЛОВ В RSYNC
Опции include и exclude позволяют указать какие файлы нужно синхронизировать, а какие исключить. Опции работают не только с файлами но и с директориями.
Например, скопируем все файлы, начинающиеся на букву R:
rsync -avze ssh --include 'R*' --exclude '*' root@192.168.56.102:/root/documents/ /root/documents
7. УДАЛЕНИЕ ПРИ СИНХРОНИЗАЦИИ
Во время синхронизации можно удалять файлы, которых нет на машине откуда идет rsync синхронизация, для этого используется опция —delete.
Например:
rsync -avz --delete root@192.168.56.102:/documents/ /tmp/documents/
Если перед выполнением этой команды создать в папке файл которого нет на удаленном сервере, то он будет удален.
к содержанию ↑8. МАКСИМАЛЬНЫЙ РАЗМЕР ФАЙЛОВ
Вы можете указать максимальный размер файлов, которые нужно синхронизировать. Для этого используется опция —max-size. Например, будем синхронизировать только файлы меньше 200 килобайт:
rsync -avzhe ssh --max-size='200k' /user/documents/ root@192.168.56.102:/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/ root@192.168.56.102:/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 sk@192.168.1.250
Теперь можем переходить к настройке расписания 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
Если у вас еще нет настроенной системы, то используйте мои статьи по установке и настройке 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:
# 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 будет проходить по своему отдельному порту 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 root@10.1.6.221:/data/mysql_dump /backup
Если для подключения вы используете публичный ключ или нестандартный порт ssh, указать эти параметры можно следующим образом.
# /usr/bin/rsync -avz --progress --delete -e "ssh -p 1234 -i /root/.ssh/id_rsa.pub" root@10.1.6.221:/data/mysql_dump /backupк содержанию ↑
Настройка исключений
Вы можете настроить исключение файлов или каталогов при копировании с помощью rsync. Делается это с помощью ключа —exclude или —exclude-from. Первый позволяет указать исключение непосредственно в команде на исполнение. Второй позволяет загружать список исключений из файла. Пример первого варианта:
# /usr/bin/rsync -avz --progress --delete --exclude='*.jpeg' root@10.1.6.221:/var/www/html /backup
Вы скопируете директорию с сайтом, исключив из нее все картинки с расширением .jpeg. Таких исключений можно добавить сколько угодно в одной команде. Но удобнее их выносить в отдельный файл. Примерно так.
# /usr/bin/rsync -avz --progress --delete --exclude-from=exclude.lst root@10.1.6.221:/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 версии. Нужно только внимательно следить за путями к директориям, примеры есть в конфигах.