Backup с помощью rsyncd

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

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

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

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

Проверка

mail# uname -rsn FreeBSD mail.teachers 6.1-RELEASE mail#
/root/> uname -rsn FreeBSD backup 6.1-RELEASE-p6 /root/>

Настройка

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

# apt-get install rsync

nano rsyncd.conf

# Файл приветствия 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 и шарами) Создаем необходимые файлы и директории
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#

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

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

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

/root/> rsync mail:: HELLO FROM RSYNC etc ETC directory var VAR directory /root/>

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

/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/>

В первый раз я ввел неверный пароль. Все конечно хорошо, но если запускать бэкап по крону, то как вводить пароль? Для этого можно указать password-file:

/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/>

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

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#

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

/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/>

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

/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/>

На сервере:

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#

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

mail# echo "" >> /etc/hosts
mail#

Теперь бэкапим:

/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/>

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