Backup системы через tar

Almas 2016-3-16 00:00
775
0
0
1

Чтобы сделать полную резервную копию Linux системы, не обязательно для этого использовать dd, поможет обычный архиватор tar. Решение очень старое и многими проверенное. Архивная копия созданная с пом

Чтобы сделать полную резервную копию Linux системы, не обязательно для этого использовать dd, поможет обычный архиватор tar. Решение очень старое и многими проверенное.  Архивная копия созданная с помощью tar, имеет некоторые преимущества по сравнению с dd - размер архива может быть очень маленьким, создание архива делается за короткое время, при создании исключаются не нужные файлы и каталоги, например каталог /tmp.

BACKUP СИСТЕМЫ

Введите в консоле команду:

# tar cvpzf /mnt/disk3tb/backup.tgz --exclude=/tmp --exclude=/root --exclude=/mnt --exclude=/proc --exclude=/lost+found --exclude=/backup --exclude=/dev --exclude=/sys --exclude=/boot --exclude=/etc/fstab --exclude=/etc/sysconfig/network-scripts/ --exclude=/etc/udev/rules.d/70-persistent-net.rules /

В архив помещаются все файлы за исключением системных.

Здесь опции: 
c - создаем архивный файл 
v - включает показ подробной информации о  ходе архивации.

z - включаем компрессию
p - сохраняет права на файлы и каталоги. 
f  - указывает имя создаваемого архивного файла и путь где он должен лежать /mnt/disk3tb/backup.tgz 
--directory - говорит архиватору что бы он переключил корень на каталог / 
--exclude - исключенные директории и файлы из резервной копии, система создает каталог с содержимым которое динамически изменяется. Мы исключили такие каталоги. Если у вас Asterisk, то полезно будет включить исключение на каталог /var/spool/asterisk/monitor, чтобы не сохранять километровые записи разговоров (--exclude=/var/spool/asterisk/monitor)

/mnt/disk3tb/backup.tgz - имя и путь к создаваемому архиву, у нас в качестве хранителя резервных копий, выступает диск объемом в 3Тб.

Важно: В архив не попадают сетевые настройки и монтированные устройства /etc/fstab. Это сделано для того, чтобы избежать проблем с сетью и монтированием устройств на новом ПК.

 

ВОССТАНОВЛЕНИЕ СИСТЕМЫ ИЗ BACKUP

Находим новый ПК (виртуальную машину) с установленной Linux. Копируем в корень файл backup.tgz через scp (winscp).

Заходим в корень и вводим команду:

# cd /

# tar -zxvpf /backup.tgz

Здесь опции: 
v - включает показ подробной информации о  ходе раз архивации.

x - включает опцию распаковки, ставится вместо опции "c" (создание архива).

z - говорит что файл сжатый
p - восстанавливает права на файлы и каталоги 
f  - указывает имя архивного файла для распаковки /backup.tgz

Можно добавить опцию "--exclude=" по аналогии выше, например "tar -zxvpf 04.05.2016-Latest.tgz --exclude=var/lib --exclude=etc --exclude=opt --exclude=var/log"

Важно: После распаковки, обязательно настройте сеть в ручную, также необходимо примонтировать внешние устройства через /etc/fstab, если они нужны. А также может потребоваться создать некоторые каталоги которые были исключены через опцию --exclude.

 

СКРИПТ ДЛЯ АВТОМАТИЧЕСКОЙ АРХИВАЦИИ СИСТЕМЫ

Скрипт для автоматического создания резервной копии системы с ротацией:

# backuprot -p 5 /source_folder/ /destination_folder/

Здесь параметры:

-p 5 - указывает сколько хранить бекапов, в примере 5, по умолчанию делается 10 копий.

/source_folder/ - каталог который требуется архивировать

/destination_folder/ - каталог назначения, куда будет сохранятся backup

 

САМ СКРИПТ:

#!/bin/bash
#########################
# Backups to DESTINATION_FOLDER / Zips and performs basic rotation
##########################
SOURCE_FOLDER="/source/" # source folder
EXCLUDE_FOLDERS="--exclude=/tmp --exclude=/root --exclude=/mnt --exclude=/proc --exclude=/lost+found --exclude=/backup --exclude=/dev --exclude=/sys --exclude=/boot --exclude=/etc/fstab --exclude=/etc/sysconfig/network-scripts/ --exclude=/etc/udev/rules.d/70-persistent-net.rules"
DESTINATION_FOLDER="/backup/" # mounted folder
BASENAME="basename $SOURCE_FOLDER"
ROTATE_PERIOD=10
# datestamp has a formatted date
datestamp=`date +"%d-%m-%Y"`
#### Display command usage ########
usage()
{
cat << EOF
USAGE:
backuprot [OPTIONS] /source_folder/ /destination_folder/
Back up and entire folder, creates tgz and ,
performs x day rotation of backups Must provide source anddestination folders
OPTIONS:
-p Specify Rotation period in days - default is $ROTATE_PERIOD
EXAMPLES:
backuprot -p 5 [/source_folder/] [/destination_folder/]
EOF
}
#### Getopts #####
while getopts "p: " opt; do
case "$opt" in
p) ROTATE_PERIOD=${OPTARG};;
\?) echo "$OPTARG is an unknown option"
usage
exit 1
;;
esac
done
shift $((OPTIND-1))
if [ -z "$1" ] || [ -z "$2" ]; then
usage
else
# Backup and gzip the directory
SOURCE_FOLDER=$1
BASENAME=`basename "$SOURCE_FOLDER"`
TGZFILE="$BASENAME-$datestamp.tgz"
LATEST_FILE="$BASENAME-Latest.tgz"
DESTINATION_FOLDER=$2
echo "\nStarting Backup and Rotate "
echo "\n-----------------------------"
echo "\nSource Folder : $SOURCE_FOLDER"
echo "\nTarget Folder : $DESTINATION_FOLDER"
echo "\nBackup file : $TGZFILE "
echo "\n-----------------------------"
if [ ! -d "$SOURCE_FOLDER" ] || [ ! -d "$DESTINATION_FOLDER" ] ; then
echo "SOURCE ($SOURCE_FOLDER) or DESTINATION ($DESTINATION_FOLDER) folder doesn't exist/ or is misspelled, check & re-try."
exit 0;
fi
echo "\nCreating $SOURCE_FOLDER/$TGZFILE ... "
tar zcpvf $SOURCE_FOLDER/$TGZFILE $EXCLUDE_FOLDERS $SOURCE_FOLDER
echo "\nCopying $SOURCE_FOLDER/$TGZFILE to $LATEST_FILE ... "
cp $SOURCE_FOLDER/$TGZFILE $SOURCE_FOLDER/$LATEST_FILE
echo "\nMoving $TGZFILE -- to --> $DESTINATION_FOLDER "
cp $SOURCE_FOLDER/$TGZFILE $DESTINATION_FOLDER && rm $SOURCE_FOLDER/$TGZFILE
echo "\nMoving $LATEST_FILE -- to --> $DESTINATION_FOLDER "
cp $SOURCE_FOLDER/$LATEST_FILE $DESTINATION_FOLDER && rm $SOURCE_FOLDER/$LATEST_FILE
# count the number of file(s) in the appropriate folder Rotate the logs, delete older than
# ROTATE_PERIOD days, if their are at_least 7 backups
FILE_COUNT=`find $DESTINATION_FOLDER -maxdepth 1 -type f | wc -l`
echo "\n Rotation period $ROTATE_PERIOD for $DESTINATION_FOLDER "
echo "\n $FILE_COUNT files found in $DESTINATION_FOLDER folder"
echo "\n find $DESTINATION_FOLDER -mtime +$ROTATE_PERIOD"
echo "\n -----------------------------------"
if [ $FILE_COUNT -gt $ROTATE_PERIOD ]; then
echo "Removing backups older than $ROTATE_PERIOD in $DESTINATION_FOLDER"
echo "Removing these old backup files..."
find $DESTINATION_FOLDER -mtime +$ROTATE_PERIOD -exec rm {} \;
else
echo "Only $FILE_COUNT file, NOT removing older backups in $DESTINATION_FOLDER "
fi
fi
echo "----------------"
echo "Backup_rot Complete. :"
echo "to extract file >> tar -xzpvf $TGZFILE "
 

 

В скрипте при создании архива, исключены следующие каталоги: /tmp, /root, /mnt, /proc, /lost+found, /backup, /dev, /sys, /boot, /etc/fstab, /etc/sysconfig/network-scripts/, /etc/udev/rules.d/70-persistent-net.rules. Чтобы добавить свои исключения, смотрите переменную EXCLUDE_FOLDERS.

После создания скрипта, дайте права на запуск:

# chmod +x backuprot

 

НАСТРОЙКА ЕЖЕДНЕВНОЙ АРХИВАЦИИ

Отредактируем файл планировщика cron:

# crontab -e

Вставим туда запуск нашего скрипта

59 23 * * * /opt/backuprot -p 3 / /mnt/disk3tb/fullbackup

 

Здесь:

59 23 * * * - запускает задание каждый день в 23:59

/opt/backuprot - запускаемый скрипт

-p 3 - число копий для хранения

/ - корневой каталог системы

/mnt/disk3tb/fullbackup - при монтированный диск 3 Тб.

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

 

ПРОБЛЕМА ПОСЛЕ ПЕРЕНОСА БАЗ MYSQL

После переноса системы с СУБД MySQL, может выйти примерно следующая ошибка:

It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 1101395 K  bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

Удалите следующие файлы:

# rm /var/lib/mysql/ibdata1  ib_logfile0 ib_logfile1

 

ЗАКЛЮЧЕНИЕ

Скрипт в записке облегчил резервное копирование системы, функция ротации позволяет контролировать количество резервных копий чтобы не заполнить все место на диске. Архивная копия системы имеет малый объем и при желании данные можно легко восстановить на новый сервер. Единственное - если вы делаете бекап CentOS 6, то и на новом сервере должна быть такая же чистая система. Нельзя восстановить архив старой CentOS 6 на новую CentOS 7.

Данное решение подходит и для резервного копирования отдельных каталогов, для этого просто меняется корневой каталог на любой другой, например /etc/postfix или /etc/asterisk.

Только один минус - базу MySQL необходимо копировать отдельно средствами самой СУБД.

 

Ссылки:

https://ru.wikipedia.org/wiki/Регулярные_выражения

http://www.abrandao.com/2014/01/linux-backup-and-rotate-script/

https://habrahabr.ru/post/136313/

http://linuxguru.ru/administration/kak-otpravit-pismo-iz-konsoli-ssh-sendmail/

http://www.cyberciti.biz/faq/linux-unix-bash-ksh-csh-sendingfiles-mail-attachments/

Оцените пост

1

Комментарии

Чтобы написать комментарий нужно войти в систему