Архив метки: rsync

RSYNC: Резервное копирование. Простой backup-скрипт

http://pro-voip.com.ua freebsd

Режимы работы 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