Резервное копирование linux сервера
Задача: резервное копирование linux сервера.
Хотя грамотно настроенный сервер на базе ОС Linux весьма надежен, тем не менее, необходимо предусмотреть сценарий восстановления в случае возникновения непредвиденных ситуаций.
У меня давняя нелюбовь к клонированию из-за избыточного места занимаемого образами системы. Посему мой выбор – резервное копирование основных конфигурационных файлов. Периодичность? Как минимум раз в неделю. Резервные копии хранятся как локально на сервере, так и на удаленных серверах windows и linux.
Для возможности копирования архива на удаленные сервера необходимо создать соответствующие учетные записи как на удаленном windows сервере, так и на удаленном linux сервере.
Локально на компьютере, где производится резервное копирование, устанавливаем smbclient для работы по протоколу SMB/CIFS.
aptitude install smbclient
Для доступа к удаленному linux серверу генерируем ключи для работы с удаленным сервером linux посредством ssh, пароль ключа при этом оставляем пустым:
ssh-keygen -t rsa -b 4094
Копируем публичный ключ на сервер
ssh-copy-id -i $HOME/.ssh/id_rsa.pub backup_server
Сам скрипт резервного копирования.
#!/bin/sh # Скрипт резервного копирования системы # Автор: Захаров Сергей Васильевич # e-mail: sv(собака)sadmin.pp.ua # icq: 222212387 # Сайт: http://www.sadmin.pp.ua # Дата создания файла: 2010-02-10 # имя компьютера COMP=server # имя и расположение tar TAR=/bin/tar SCRIPT_DIR=`pwd` # Что бекапим DIR_SOURCE="/boot \ /etc \ /root \ /usr/local \ /var/cache/bind \ /var/log" # Лог LOG="/srv/backup/system_state/archive_$COMP.log" ERRORLOG="/srv/backup/system_state/archive_error_$COMP.log" # Временный каталог DIR_TEMP="/srv/backup/system_state" # Где храним бекапы DIR_TARGET="/srv/backup/system_state/$COMP" # Параметры доступа к mysql MYSQL_DUMP=/usr/bin/mysqldump MYSQL_PARAM="--add-drop-table -uUSER -pPASSWORD --databases" # Параметры копирования на win-сервер SMBSERVER="//backup_server_win/backup$ -U backup_user%password" SMBCOMMAND="cd system_state\server; lcd $DIR_TEMP; prompt; mput *.gz" # Параметры копирования на linux-сервер SCPCOMMAND="-i /srv/backup/.ssh/id_rsa $DIR_TEMP/*.gz" SCPSERVER="[email protected]_server_linux:/srv/backup/system_state/$COMP" echo "$(date +%F_%R:%S) #################### Start script ####################" >> $LOG echo "$(date +%F_%R:%S) Начало архивации" >> $LOG # Информация которая может пригодится при восстановлении /sbin/fdisk -l > $SCRIPT_DIR/fdisk.bak 2> /dev/null /usr/sbin/dmidecode > $SCRIPT_DIR/dmidecode.bak 2> /dev/null /bin/cat /etc/fstab > $SCRIPT_DIR/fstab.bak 2> /dev/null /usr/bin/dpkg -l > $SCRIPT_DIR/dpkg.bak 2> /dev/null /bin/dmesg > $SCRIPT_DIR/dmesg.bak 2> /dev/null /usr/bin/lspci > $SCRIPT_DIR/lspci.bak 2> /dev/null # Если используете LVM может пригодиться следующее /sbin/pvdisplay > $SCRIPT_DIR/pvdisplay.bak 2> /dev/null /sbin/vgdisplay > $SCRIPT_DIR/vgdisplay.bak 2> /dev/null /sbin/lvdisplay > $SCRIPT_DIR/lvdisplay.bak 2> /dev/null #У меня в качестве MTA - exim echo "$(date +%F_%R:%S) Дамп бд mysql и exim" >> $LOG #database mysql, exim $MYSQL_DUMP $MYSQL_PARAM exim > $SCRIPT_DIR/exim.sql $MYSQL_DUMP $MYSQL_PARAM mysql > $SCRIPT_DIR/mysql.sql if $TAR -cpf $DIR_TEMP/full-$(date +%F_%H-%M).tar.gz $DIR_SOURCE $SCRIPT_DIR/{*.bak,*.sql,*.sh} 2>> $ERRORLOG then echo "$(date +%F_%R:%S) Архивация прошла успешно" >> $LOG else echo "$(date +%F_%R:%S) При архивации произошла ОШИБКА" >> $LOG fi echo "$(date +%F_%R:%S) Копирование архива на win-сервер" >> $LOG if smbclient $SMBSERVER -c "$SMBCOMMAND" 2>> $ERRORLOG then echo "$(date +%F_%R:%S) Архив успешно скопирован на win-сервер" >> $LOG else echo "$(date +%F_%R:%S) При копировании на win-сервер произошла ОШИБКА" >> $LOG fi echo "$(date +%F_%R:%S) Копирование архива на linux-сервер" >> $LOG if scp $SCPCOMMAND $SCPSERVER then echo "$(date +%F_%R:%S) Архив успешно скопирован на linux-сервер" >> $LOG else echo "$(date +%F_%R:%S) При копировании на linux-сервер произошла ОШИБКА" >> $LOG fi # Перемещение архива из временного каталога в локальное хранилище if mv $DIR_TEMP/*.gz $DIR_TARGET then find $DIR_TARGET -type f -ctime +62 -name "*.gz" -exec rm {} \; #Удаление из локального хранилища файлов двух месячной давности else echo "$(date +%F_%R:%S) При перемещении архива из временного каталога в локальное хранилище возникла ОШИБКА" >> $LOG fi rm -f $SCRIPT_DIR/{*.bak,*.sql} echo "$(date +%F_%R:%S) ##################### End script #####################" >> $LOG echo "" >> $LOG
В файл /etc/crontab добавляем задание
# System_state 0 18 * * 7 root /srv/backup/system_state.sh
выполнять резервное копирование каждое воскресенье в шесть вечера.
Получаемый лог:
2010-02-12_14:29:29 #################### Start script #################### 2010-02-12_14:29:29 Начало архивации 2010-02-12_14:29:45 Архивация прошла успешно 2010-02-12_14:29:45 Копирование архива на win-сервер 2010-02-12_14:30:04 Архив успешно скопирован на win-сервер 2010-02-12_14:30:04 Копирование архива на linux-сервер 2010-02-12_14:30:18 Архив успешно скопирован на linux-сервер 2010-02-12_14:30:18 ##################### End script #####################
оригинал: тут
|