Режимы работы rsync
«listing«
аналог ls -l — команда rsync указывается с аргументом src, без dst:
# rsync /
«local«
локальный режим — копирование в пределах локального хоста — аналог cp:
# rsync /home/provoip/file1 /home/admin
«rsync via ssh«
копирование с/на удаленный хост используя транспорт ssh (или rsh, кто-то использует?):
# rsync /home/provoip/file1 admin@remoteserver.com:/home/admin
«rsync via daemon«
копирование с/на удаленный хост используя rsync демон (на сервере, где запущен rsync-демон, в пути ставим :: и указываем не путь к dst-директории, а модуль, модули настраиваются через конфигурационный файл rsync-демона):
# rsync /home/provoip/file1 jasmin@remoteserver.com::module1
Кусочек man rsync
Local: rsync [OPTION...] SRC... [DEST] Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST:DEST Access via rsync daemon: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
Опции rsync
-a, —archive — режим архивирования, набор опций -rlptgoD (без -H, -A, -X)
-r, —recursive, рекурсивное копирование каталогов;
-l, —links, копирование символических ссылок «как есть», то есть rsync не будет следовать по ним, обращаясь к файлам;
-p, —perms, сохранение прав доступа к файлам;
-t, —times, сохранение времени модификации файлов;
-o, —owner, -g, —group, сохранение владельца и группы файла соответственно;
-D, эквивалентно —devices —specials;
—devices, сохранение файлов устройств (опция будет работать только для суперпользователя);
—specials, сохранение специальных файлов;
-H, —hard-links — сохранять жесткие ссылки;
-A, —acls — сохранять acl;
-X, —xattrs — сохранять расширеные атрибуты;
-R, —relative — использовать относительные пути — ну очень полезная опция
Вот с этим параметром была история. Нужно мне было сохранить на удаленном сервере две директории — /etc и /usr/local/etc. Соответственно, ввожу команду:
rsync -a /etc /usr/local/etc admin@remoteserver.com:/home/admin
и ожидаю увидеть на удаленном сервере в /home/admin две директории с конфигами… Фиг! Rsync сначала добросовестно скопировал директорию /etc, затем при копировании /usr/local/etc отбрасывает путь /usr/local, собирается копировать etc, видит, что на удаленном сервере etc уже какбы есть, поэтому просто добавляет недостающие, по его мнению, файлы c /usr/local/etc — т.е. слил все в одну директорию etc в указанном пути на удаленном сервере и с чувством выполненного долга завершил свою работу.
Для бекапа конфигов, как понимаете, такое положение вещей не подходит. Здесь мне на глаза попалась опция -R, которая была призвана решить мою проблему — на сервере теперь присутсвуют /home/admin/etc и /home/admin/usr/local/etc
-v, —verbose, выводить имена копируемых файлов;
-q, —quiet, не выводить не-error сообщения;
-z, —compress, включает режим сжатия, полезно при передаче больших объемов информации;
-P, —partial, —progress, отображать прогресс при копировании;
-c, —checksum, заставляет rsync проверять файлы по контрольной сумме;
-n, —dry-run, режим тестирования, нужен для проверки, что скопирует rsync, по факту не выполняя самого копирования. Используется с -v и/или -i;
-i, —itemize-changes, показывать, какие изменения выполняются. Используется часто с -n
—delete, удалять из бэкапа файлы, которых уже нет на стороне источника. —delete отличается от —delete-after тем, что удаление производится вначале, а не на завершающей стадии процесса бэкапа.
—delete-after, работает быстрее, так как не требует лишней стадии обхода списка файлов, но требует использования опции —force для обработки таких ситуаций как удаление файла и появление диретории с тем же именем;
—delete-excluded, удалять части которые уже есть на стороне бэкапа, но появились в списке исключения;
Примечания
копирование директорий
— указание пути директории с завершающим слешем приведет к копированию только файлов с этой директории
# rsync /etc/ admin@remoteserver.com:/home/admin => результат — /home/admin/files_from_etc
— указание пути директории без завершающего слеша приведет к копированию целой директории с файлами
# rsync /etc admin@remoteserver.com:/home/admin => результат — /home/admin/etc
копирование нескольких директорий или файлов одновременно
— просто перечисляем через пробел:
# rsync /etc /home /usr admin@remoteserver.com:/home/admin
Простой скрипт резервного копирования с использованием rsync
Скрипт не идеал, но работу свою выполняет. Как работает?
- запускается по cron’у каждый день, при первом запуске делает полную копию указаных директорий, после — только вносит изменения;
- каждое первое чило месяца сохраняет полную копию указаных директорий в каталоге, в имени которого указана дата — yyyymmdd;
- все операции выполняет от имени root’а;
- доступ к удаленному серверу по ключам;
- после выполнения копирования шлет уведомление на почту;
- список копируемых директорий/файлов указываем в переменной BKP_LIST
rsync_backup.sh
#!/bin/sh ################################################################################ # jasmin (c) 15.07.2015 # Scriprt rsync_backup.sh backups config files # defined in list BKP_LIST to backup server # # - daily backup (incremental) # - monthly backup (full backup in folder named with date) - every 1-st day of # the month # # access to backup server with ssh-keys without passwords (user - root) ################################################################################ DATE=`date +%Y%m%d` FIRST_DAY=`date +%d` MAILADDR=admin@pro-voip.com.ua HOSTNAME=www.pro-voip.com.ua DBDIR=/dbbackup REPORT=/tmp/rsync-report.$DATE DST_SERVER=backup-srv.pro-voip.com.ua ( ################################################################################ # if it is 1-st day of the month - make new folder and define new path ################################################################################ if [ $FIRST_DAY == 01 ] then DST_DIR=/usr/home/RSYNK/provoip/$DATE else DST_DIR=/usr/home/RSYNK/provoip fi ################################################################################ # DBDIR - local directory for dumps # Create database dump ################################################################################ if [ ! -d $DBDIR ] then mkdir -p $DBDIR fi /usr/local/bin/mysqldump -u DBUSER -pDBPASSWORD --quick DATABASE > $DBDIR/DATABASE.sql ################################################################################ # BKP_LIST - list of the directories to backup ################################################################################ BKP_LIST="/etc /usr/local/etc /usr/local/www $DBDIR" ################################################################################ # rsync options # -a - archive mode (save owners, permissions etc.) # -R - use relative path names - it is important! # # and make report in tmp-dir ################################################################################ for BKP_ENTRY in `echo $BKP_LIST` do TIME=`date +%Y.%m.%d_%H:%M:%S` /usr/local/bin/rsync -aR --delete $BKP_ENTRY $DST_SERVER:$DST_DIR if [ $? == 0 ] then echo $TIME Rsync $BKP_ENTRY [done] >> $REPORT else echo $TIME Rsync $BKP_ENTRY [error] >> $REPORT fi done ) > $REPORT 2>&1 ################################################################################ # send report to admin email # if report have errors - Status in Subject is ERRROR, other case - OK # then remove report from tmp-dir ################################################################################ grep error $REPORT if [ $? = 0 ] then /usr/bin/mail -s "[$HOSTNAME] rsync backup ERROR" $MAILADDR < $REPORT else /usr/bin/mail -s "[$HOSTNAME] rsync backup OK" $MAILADDR < $REPORT fi rm $REPORT exit 0