{{tag>shell utils network rsync rsyncd backup}}

====== Backup с помощью rsyncd ======

Решил настроить backup. Первая мысль была: ночью сжимать все в один большой архив и отправлять по сети с помощью scp, например.. Но этот
вариант не устраивал меня как минимум по двум причинам:

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

Прогуглив этот вопрос нашел замечательную утилиту rsync ее и стал мучить. ))

Итак, работать все будет следующим образом: на компьютере, который мы будем бэкапить, ставим и настраиваем rsync сервер, на backup сервере настраиваем
rsync клиент. После этого синхронизиркем данные на backup сервере с данными на других серверах. Для примера, имя бэкап сервера будет: backup, 
а имя машины с которой мы будем синхронизировать данные — mail:

===== Проверка =====

<code sh>
  mail# uname -rsn
  FreeBSD mail.teachers 6.1-RELEASE
  mail#
</code>

<code sh>
  /root/> uname -rsn
  FreeBSD backup 6.1-RELEASE-p6
  /root/>
</code>

===== Настройка =====

Сначала настроим rsync сервер. Идем в порты ставить:

  # apt-get install rsync

**nano rsyncd.conf**
<code sh>
  # Файл приветствия
  motd file = /etc/new_motd

  # Лог файл
  log file = /var/log/rsyncd.log

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

  # Описание секции ETC
  [etc]
          # Путь к директории
          path = /etc/

          # Под каким uid'ом работать
          uid = root

          # Только чтение
          read only = yes

          # Разрешать просмотр файлов
          list = yes

          # Комментарий
          comment = ETC directory

          # Хосты, которым разрешен доступ
          hosts allow = 192.168.1.249

          # Разрешенные пользователи
          auth users = backup

          # Путь к файлу с паролями
          secrets file = /usr/local/etc/rsyncd.scrt

  # Далее может идти описание других секций(по аналогии с samba и шарами)
  Создаем необходимые файлы и директории
</code>

<code sh>
  mail# cat > /etc/new_motd
  HELLO FROM RSYNC

  mail# touch /var/log/rsyncd.log
  mail# chmod 0600 /var/log/rsyncd.log
  mail# chown root:wheel /var/log/rsyncd.log
  mail# cat > /usr/local/etc/rsyncd.scrt
  backup:123456
  mail# chown root:wheel /usr/local/etc/rsyncd.scrt
  mail# chmod 0600 /usr/local/etc/rsyncd.scrt
  mail# mv /usr/local/etc/rc.d/rsyncd /usr/local/etc/rc.d/rsyncd.sh
  mail# echo rsyncd_enable=\"YES\" >> /etc/rc.conf
  mail# /usr/local/etc/rc.d/rsyncd.sh start
  Starting rsyncd.
  mail# ps ax | grep rsyn
  97920  ??  Ss     0:00.00 /usr/local/bin/rsync --daemon
  97922  p0  S+     0:00.01 grep rsyn
  mail#
</code>

Теперь перейдем к настройке клинта, точнее настраивать там ничего не надо... Нужно просто проверить как все работает:

<code sh>
  /root/> cd /usr/ports/net/rsync/
  /usr/ports/net/rsync/> make install clean
  ... skipped ...
  /usr/ports/net/rsync/> rehash
  /usr/ports/net/rsync/>
</code>

Проверяем работу сервера:

<code sh>
  /root/> rsync mail::
  HELLO FROM RSYNC


  etc             ETC directory
  var             VAR directory
  /root/>
</code>

Теперь пробуем авторизоваться:

<code sh>
  /usr/ports/net/rsync/> rsync backup@mail::etc
  HELLO FROM RSYNC


  Password:
  @ERROR: auth failed on module etc
  rsync error: error starting client-server protocol (code 5)
   at main.c(1296) [receiver=2.6.8]
  /usr/ports/net/rsync/> rsync backup@mail::etc
  HELLO FROM RSYNC


  Password:
  drwxr-xr-x        2048 2006/10/05 21:27:03 .
  lrwxrwxrwx          12 2006/09/15 21:24:09 aliases
  -rw-r--r--       16384 2006/09/17 14:27:21 aliases.db
  -rw-r--r--         209 2006/05/07 08:00:23 amd.map
  -rw-r--r--        1234 2006/05/07 08:00:23 apmd.conf
  -rw-r--r--         231 2006/05/07 08:00:23 auth.conf
  -rw-r--r--         737 2006/05/07 08:00:23 crontab
  -rw-r--r--         108 2006/05/07 08:00:23 csh.cshrc
  -rw-r--r--         481 2006/05/07 08:00:23 csh.login
  -rw-r--r--         110 2006/05/07 08:00:23 csh.logout
  ... skipped ...

  /usr/ports/net/rsync/>
</code>

В первый раз я ввел неверный пароль. Все конечно хорошо, но если запускать бэкап по крону, то как вводить пароль? Для этого можно указать password-file:
  
<code sh>
  /usr/ports/net/rsync/> cat > /usr/local/etc/rsyncd.scrt
  123456
  /usr/ports/net/rsync/> chown root:wheel /usr/local/etc/rsyncd.scrt
  /usr/ports/net/rsync/> chmod 0600 /usr/local/etc/rsyncd.scrt
  /usr/ports/net/rsync/> rsync --password-file=/usr/local/etc/rsyncd.scrt \
  ? backup@mail::etc
  HELLO FROM RSYNC

  drwxr-xr-x        2048 2006/10/05 21:27:03 .
  lrwxrwxrwx          12 2006/09/15 21:24:09 aliases
  -rw-r--r--       16384 2006/09/17 14:27:21 aliases.db
  -rw-r--r--         209 2006/05/07 08:00:23 amd.map
  -rw-r--r--        1234 2006/05/07 08:00:23 apmd.conf
  -rw-r--r--         231 2006/05/07 08:00:23 auth.conf
  -rw-r--r--         737 2006/05/07 08:00:23 crontab
  -rw-r--r--         108 2006/05/07 08:00:23 csh.cshrc
  -rw-r--r--         481 2006/05/07 08:00:23 csh.login
  -rw-r--r--         110 2006/05/07 08:00:23 csh.logout
  ... skipped ...
  /usr/ports/net/rsync/>
</code>

На сервере, в логах будет примерно следующее:

<code sh>
  mail# tail -3 /var/log/rsyncd.log
  2006/10/05 21:53:21 [98220] connect from backup.teachers (192.168.1.249)
  2006/10/05 21:53:21 [98220] rsync on etc from backup@backup.teachers (192.168.1.249)
  2006/10/05 21:53:21 [98220] sent 1807 bytes  received 99 bytes  total size 411665
  mail#
</code>

На backup сервере создадим директорию, где будут храниться забэкаппенные файлы и начинаем backup:

<code sh>
  /root/> df -alh | grep backup
  /dev/ad1s1d    144G    2.0K    133G     0%    /backup
  /root/> mkdir -p /backup/mail.teachers/etc/
  /root/> chmod -R 0700 /backup/mail.teachers/
  /root/> ls -la /backup/mail.teachers/
  total 6
  drwx------  3 root  wheel  512 Oct  5 22:01 .
  drwxr-xr-x  3 root  wheel  512 Oct  5 22:01 ..
  drwx------  2 root  wheel  512 Oct  5 22:01 etc
  /root/> rsync --update --recursive \
  ? --password-file=/usr/local/etc/rsyncd.scrt backup@mail::etc \
  ? /backup/mail.teachers/etc/
  HELLO FROM RSYNC


  skipping non-regular file "aliases"
  skipping non-regular file "namedb"
  skipping non-regular file "rmt"
  skipping non-regular file "termcap"
  /root/>
</code>

Ссылочки rsync качать не стал. ;). Смотрим, что у нас получилось:

<code sh>
  /root/> ls -la /backup/mail.teachers/etc/
  total 528
  drwx------  18 root  wheel   2048 Oct  5 22:03 .
  drwx------   3 root  wheel    512 Oct  5 22:01 ..
  drwxr-xr-x   2 root  wheel    512 Oct  5 22:03 X11
  -rw-r--r--   1 root  wheel  16384 Oct  5 22:03 aliases.db
  -rw-r--r--   1 root  wheel    209 Oct  5 22:03 amd.map
  -rw-r--r--   1 root  wheel   1234 Oct  5 22:03 apmd.conf
  -rw-r--r--   1 root  wheel    231 Oct  5 22:03 auth.conf
  drwxr-xr-x   2 root  wheel    512 Oct  5 22:03 bluetooth
  -rw-r--r--   1 root  wheel    737 Oct  5 22:03 crontab
  -rw-r--r--   1 root  wheel    108 Oct  5 22:03 csh.cshrc
  -rw-r--r--   1 root  wheel    481 Oct  5 22:03 csh.login
  -rw-r--r--   1 root  wheel    110 Oct  5 22:03 csh.logout
  ... skipped ...
  /root/>
</code>

На сервере:

<code sh>
  mail# tail -3 /var/log/rsyncd.log
  2006/10/05 22:00:05 [98379] send backup.teachers 
  [192.168.1.249] etc (backup) ssh/sshd_config 3042
  2006/10/05 22:00:05 [98379] send backup.teachers 
  [192.168.1.249] etc (backup) ssl/openssl.cnf 7869
  2006/10/05 22:00:05 [98379] sent 1286010 bytes  
  received 7581 bytes  total size 1264419
  mail#
</code>

Как видите, у нас передалась вся директория etc и все поддиректории. Давайте добавим в файл /etc/hosts пробел и попробуем сделать бэкап:

  mail# echo "" >> /etc/hosts
  mail#
  
Теперь бэкапим:

<code sh>
  /root/> rsync --update --verbose --recursive \ 
  ? --password-file=/usr/local/etc/rsyncd.scrt \
  ? backup@mail::etc /backup/mail.teachers/etc/
  HELLO FROM RSYNC


  receiving file list ... done
  skipping non-regular file "aliases"
  skipping non-regular file "namedb"
  skipping non-regular file "rmt"
  skipping non-regular file "termcap"
  hosts

  sent 126 bytes  received 6567 bytes  4462.00 bytes/sec
  total size is 1264421  speedup is 188.92
  /root/>
</code>

Как видите, у нас передался только файл hosts, потому что изменился только он.

