Чтобы сделать полную резервную копию 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 folderEXCLUDE_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 folderBASENAME="basename $SOURCE_FOLDER"ROTATE_PERIOD=10# datestamp has a formatted datedatestamp=`date +"%d-%m-%Y"`#### Display command usage ########usage(){cat << EOFUSAGE:backuprot [OPTIONS] /source_folder/ /destination_folder/Back up and entire folder, creates tgz and ,performs x day rotation of backups Must provide source anddestination foldersOPTIONS:-p Specify Rotation period in days - default is $ROTATE_PERIODEXAMPLES:backuprot -p 5 [/source_folder/] [/destination_folder/]EOF}#### Getopts #####while getopts "p: " opt; docase "$opt" inp) ROTATE_PERIOD=${OPTARG};;\?) echo "$OPTARG is an unknown option"usageexit 1;;esacdoneshift $((OPTIND-1))if [ -z "$1" ] || [ -z "$2" ]; thenusageelse# Backup and gzip the directorySOURCE_FOLDER=$1BASENAME=`basename "$SOURCE_FOLDER"`TGZFILE="$BASENAME-$datestamp.tgz"LATEST_FILE="$BASENAME-Latest.tgz"DESTINATION_FOLDER=$2echo "\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" ] ; thenecho "SOURCE ($SOURCE_FOLDER) or DESTINATION ($DESTINATION_FOLDER) folder doesn't exist/ or is misspelled, check & re-try."exit 0;fiecho "\nCreating $SOURCE_FOLDER/$TGZFILE ... "tar zcpvf $SOURCE_FOLDER/$TGZFILE $EXCLUDE_FOLDERS $SOURCE_FOLDERecho "\nCopying $SOURCE_FOLDER/$TGZFILE to $LATEST_FILE ... "cp $SOURCE_FOLDER/$TGZFILE $SOURCE_FOLDER/$LATEST_FILEecho "\nMoving $TGZFILE -- to --> $DESTINATION_FOLDER "cp $SOURCE_FOLDER/$TGZFILE $DESTINATION_FOLDER && rm $SOURCE_FOLDER/$TGZFILEecho "\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 backupsFILE_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 ]; thenecho "Removing backups older than $ROTATE_PERIOD in $DESTINATION_FOLDER"echo "Removing these old backup files..."find $DESTINATION_FOLDER -mtime +$ROTATE_PERIOD -exec rm {} \;elseecho "Only $FILE_COUNT file, NOT removing older backups in $DESTINATION_FOLDER "fifiecho "----------------"echo "Backup_rot Complete. :"echo "to extract file >> tar -xzpvf $TGZFILE "
После создания скрипта, дайте права на запуск:
# 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 tokey_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 1101395 K bytes of memoryHope 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/