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