{{tag>backup sync shell ssh server rsync}}

==== Использование Rsync  как сервер ====

Реализация Rsync-сервера построена следующим образом. Есть отдельный сервер куда будут складываться все бэкапы. С этого сервера запускается по крону команда rsync с параметрами, которая реализует коннект к удаленным машинам в сети. На всех машинах работает Rsync-служба, в конфиге которой прописано какие именно каталоги нужно синхронизировать.

==== Настройка Rsync - службы, на удаленных серверах ====

Правим конфиг Rsync-сервера. Где искать в разных дистрибутивах:

<code>
FreeBSD
/usr/local/etc/rsyncd.conf

Gentoo
/etc/rsyncd.conf

HP-UX 11.xx
/etc/rsyncd.conf
</code>

rsyncd.conf:

<code>
#если запускать через inetd то pid file не используем
pid file = /var/run/rsyncd.pid

# Файл приветствия (Можно описать информацию о самом сервере, полезно когда серверов будет много)
motd file = /etc/hello_rsync

# Файл логов
log file = /var/log/rsyncd.log

# Писать в лог о скачиваемых файлах
transfer logging = true

# Описание секции для синхронизации /etc/
[etc]
        path = /etc/                                 # Путь к директории
        uid = root                                   # Пользователь под каким запускать крипт
        gid = sys                                    # По умолчанию будет gid = nobody, что недаст    #работать
        read only = yes                              # Только чтение (а больше и не нужно)
        list = yes                                   # Разрешать просмотр файлов
        comment = ETC - derectory                    # Комментарий
        hosts allow = 192.168.0.6,192.168.0.52       # Хосты с которых разрешен коннект
        auth users = backup                          # Разрешенный пользователи службы rsync 
        secrets file = /root/rsyncd.scrt             # Файл с паролем
#если не указывать auth users то можно будет работать анонимно и не заморачиваться secrets file'ами

</code>

Теперь создадим файл приветствия, файлы для логов и пароля.

<code>

pdc# vim /etc/hello_rsync

#################################################################
#                                                               #
#         Hello from rsync server  (pdc.myhost.com)             #
#         Server Adress : 192.168.1.254                         #
#         Server        : AMD Computer Corp                     #
#         Hardware      : 1x AMD(R)2X CPU, 2180MB RAM           #
#         Contact Name  : admin@myhost.com                      #
#                                                               #
#################################################################


pdc# touch /var/log/rsyncd.log
pdc# chmod 0600 /var/log/rsyncd.log
pdc# chown root:wheel /var/log/rsyncd.log
pdc# cat > /root/rsyncd.scrt
backup:rsync_passwd
pdc# chown root:wheel /root/rsyncd.scrt
pdc# chmod 0600 /root/rsyncd.scrt
</code>

Внимание! ВАЖНО.
Очень важны права доступа к файлу с паролем. Если права будут отличными от тех что нужно, у вас не будет проходить аутентификация.

Теперь добавим службу rsync в автоматический запуск:

<code>

FreeBSD
mv /usr/local/etc/rc.d/rsyncd /usr/local/etc/rc.d/rsyncd.sh
echo rsyncd_enable=\"YES\" >> /etc/rc.conf
/usr/local/etc/rc.d/rsyncd.sh start

Gentoo
rc-update add rsyncd default
/etc/init.d/rsyncd start

Для запуска через inetd например в HP-UX

добавляем строку в /etc/services:
rsync 873/tcp

а в /etc/inetd.conf добавляем строку:
rsyc  stream tcp nowait root /usr/local/bin/rsync rsyncd --daemon

(/usr/local/bin/rsync меняем на то место куда на вашей системе был установлен rsync)

</code>



Теперь переходим на сервер, куда будут собираться все наши BackUp.

==== Настройка Rsync - скрипта, на BAckUp - сервере ====

На Нашем BackUp - сервере создаем директории, куда будут складываться все наши резервные копии. 

<code>
saturn# mkdir -p /home/backup/pdc.myhost.com/etc/
saturn# chmod -R 0700 /home/backup/pdc.myhost.com/etc/
</code>

Теперь создаем файл с паролем. По правилам хорошего тона, прячем его в /root/

<code>
saturn# cat > /root/rsyncd.scrt
rsync_passwd
saturn# chown root:wheel /root/rsyncd.scrt
saturn# chmod 0600 /root/rsyncd.scrt
</code>

Теперь проверяем:

<code>

saturn ~ # rsync pdc::
#################################################################
#                                                               #
#         Hello from rsync server  (pdc.myhost.com)             #
#         Server Adress : 192.168.1.254                         #
#         Server        : AMD Computer Corp                     #
#         Hardware      : 1x AMD(R)2X CPU, 2180MB RAM           #
#         Contact Name  : admin@myhost.com                      #
#                                                               #
#################################################################

etc             ETC - derectory

</code>


Теперь делаем полную синхронизацию следующей командой.

<code>
rsync -uvroght --delete-after --password-file=/root/rsyncd.scrt backup@pdc.myhost.com::etc  /home/backup/pdc.myhost.com/etc/
</code>

Для автоматизации, я создал два файла /root/rsync_day.sh, который запускается по крону каждый час, в нем у меня синхронизируется svn-репозиторий. И /root/rsync_night.sh - который запускается только ночью. В нем у меня синхронизируется /etc/ /home/ и прочее. Кому что синхронизировать, решать вам.

==== Детальное описание ключей rsync ====


  * '''-v''', '''--verbose'''               увеличение отладочной информации
  * '''-u''', '''--update'''                пропускать обновление файлов, которые новее исходных
  * '''-r''', '''--recursive'''             рекурсия в директориях
  * '''-o''', '''--owner'''                 сохранить владельца (только под root)
  * '''-g''', '''--group'''                 сохранить группу
  * '''-h''', '''--human-readable'''        вывод цифр в читаемом виде (Кб, Мб, Гб)
  * '''-t''', '''--times'''                 сохранить дату изменения
  * '''-p''', '''--perms'''                 сохранить права доступа
  * '''--delete-after'''              удалить после. Если в основном месте был удален какой-то файл, или каталог, то после синхронизации в backup сервере, в каталоге он тоже будет удален--password-file             Путь, где находится файл с паролем.


Обязательно включите ключ -v, --verbose, тогда в консоль вам будет выводиться вся информация о процессе. Если у вас настроено отсылка сообщений службой ssmtp, то вы сможете получать письма с информацией о том как отработал cron. И соответственно как прошла синхронизация.


==== Преимущества и недостатки ====

Преимущества такого вида резервной синхронизации я вижу в полной автоматизации процесса. Так же письменное уведомление, о том как проходит процесс. (При условии что настроена служба ssmtp).  Так же к преимужествам можно отнести что мы имеем полную рабочую версию каталогов, с правами доступа. Это дает нам преимущества быстрого переключения на резервный сервер служб, которые постоянно работают. К примеру svn-репозиторий, web-хостинг. Мы не тратим время на разархивирование, копирование и прочее. Переключаем на шлюзе порты, и работаем над восстановлением упавшего сервака.

К недостаткам можно отнести какую-то несовместимость rsync с svn-базами. Кто знает подробности, можете описать.

=== Простое использование rsync ===

  rsync -vaHx --progress --numeric-ids --delete \
    --exclude-from=asylum_backup.excludes --delete-excluded \
    root@asylum:/home/asylum/ /backup/rsync/asylum/_home_asylum.demo/

  * Опции
   * '''-v, --verbose''' - говорливость, выводит имена обрабатываемых файлов;
   * '''-a, --archive''' - работа в режиме архивирования, сохраняются права доступа и информация о владельцах;
   * '''-H, --hard-links''' - сохранять жесткие ссылки, оставляя их на другом конце бэкапа;
   * '''-x, --one-file-system''' - не выходить за пределы текущей точки монтирования;
   * '''--progress''' - показывать сколько процентов осталось до завершения и скорость передачи;
   * '''--numeric-ids''' - не транслировать имена владельца и группы в цифровые UID и GID, оставить на удаленной стороне номера как есть;
   * '''--delete''' - удалять из бэкапа файлы, которых уже нет на стороне источника;
   * '''--exclude-from=asylum_backup.excludes''' - список файлов исключенных из бэкапа, допускается использование масок, напирмер  "htdocs/*/*.jpg";
   * '''--delete-excluded''' - удалять части которые уже есть на стороне бэкапа, но появились в списке исключения;
   * '''root@''' - под каким пользоателем осущестляются подключение;
   * '''asylum''' - имя хоста к которому производится подключение;
   * '''/home/asylum/''' - директория источник, которую нужно бэкапить;
   * '''/backup/rsync/asylum/_home_asylum.demo/''' - куда сохранять бэкап;
  * Для определения транспорта нужно задать переменную


RSYNC_RSH "ssh -c arcfour -o Compression=no -x"


  * '''ssh''' - транспорт ssh (можно задать через "-e ssh");
  * '''-c arcfour''' - тип шифрования;
  * '''-o Compression=no''' - отключить сжатие средствами ssh, rsync сам сжимает данные;
  * '''-x''' - отключаем X туннелинг;

  * Другие полезные опции:
   * '''-n, --dry-run''' - режим тестирования, реально никаких действий по копированию не производится, только эмуляция;
   * '''-W, --whole-file''' - передает файлы целиком, а не блоками, как задумано в [http://www.opennet.ru/base/dev/rsync_algorythm.txt.html оригинальном алгоритме rsync];
   * '''-c, --checksum''' - использование сверки по контрольным суммам, а не по времени изменения и размеру;
   * '''-S, --sparse''' - допускает оптимизацию дискового пространства через создание "дырявых" файлов;
   * '''--delete''' отличается от '''--delete-after''' тем, что удаление производится вначале, а не на завершающей стадии процесса бэкапа. '''--delete-after''' работает быстрее, так как не требует лишней стадии обхода списка файлов, но требует использования опции '''--force''' для обработки таких ситуаций как удаление файла и появление диретории с тем же именем;
   * '''-T, --temp-dir=DIR''' - сохранять временные файлы в отдельной диретории, а не в текущей;
   * '''--compare-dest=DIR''' - сохранять новые и измененные файлы в отдельной директории, не трогая на время коприрования основную директорию назначения, в конце - разом, путем переименования, обновить содержимое бэкапа;
   * '''--link-dest=DIR''' - использовать жесткие ссылки на файлы в DIR, например, для создания подобия снапшотов;
   * '''--bwlimit''' - ограничение пропускной способности, чтобы не забивать канал;
   * '''--ignore-errors''' - продолжать копирование и удаление после появления ошибок;
   * '''--max-delete''' - ограничение максимально числа удаляемых за один раз файлов и каталогов;
   * '''-z, --compress''' - включить сжатие передаваемых данных;
   * '''-A, --acls''' - сохранять не только права доступа, но и ACL;
   * '''-D''' - сохранять файлы устройств
   * '''--files-from=FILE''' - задать список директорий и файлов для бэкапа в файле;
   * '''--times''' - синхронизировать время модификации файлов;
   * '''--backup''' - старые измененные или удаленные файлы не теряются а переименовываются или перемещаются в заданную чере '''--backup-dir=DIR''' директорию. Пример инкрементального бэкапа:

      rsync --force --ignore-errors --delete --delete-excluded --exclude-from=exclude_file \
        --backup --backup-dir=`date +%Y-%m-%d` -av


==== Заметки ====

  * rsync потребляет примерно 100 байт на каждый файл в списке, поэтому при передаче огромного числа файлов к памяти нужно относиться аккуратно;
  * Шаблон начинающийся с '/' проверяется с начала строки, иначе с конца;
  * Для задания шаблона только для директорий нужно указать в конце '/';
  * Если необходимо исключить все поддиректории в /dir, кроме /dir/best, в список исключений нужно поместить:

      + /dir/best/
      - /dir/*

==== Ссылки ====

  * Повествование построено на основе статьи "[http://www.sanitarium.net/golug/rsync_backups.html Backups using rsync]"
  * http://rsync.samba.org/ &#8212; страница проекта rsync
  * [http://www.opennet.ru/man.shtml?topic=rsync&category=1&russian=0 man rsync] на русском языке
  * Статья: [http://www.opennet.ru/base/sys/rsync_backup.txt.html Бекап файловой системы Linux-сервера с помощью rsync]
  * Статья: [http://www.linuxfocus.org/Russian/March2004/article326.shtml Rsync: лучшая система резервного копирования]
  * [http://rsync.samba.org/FAQ.html Rsync FAQ]
  * [http://rsync.samba.org/examples.html Пример на сайте rsync]
  * Статья: [http://www.mikerubel.org/computers/rsync_snapshots/ Easy Automated Snapshot-Style Backups with Linux and Rsync]
  * Статья: [http://www.linux.com/article.pl?sid=04/11/04/0346256 Making secure remote backups with Rsync]
  * Статья: [http://ezine.daemonnews.org/200211/ports.html Trawling the Ports Collection - rsync: The intelligent way to copy files]