Использую книгу М. Кофлер "Linux. Установка, настройка, администрирование" 2013 года (далее - книгу), в основном Главу 25 Резервное копирование.
http://rutracker.org/forum/viewtopic.php?t=4617248
Для начала инсталлирую еще один архиватор:
# yum install lzop
Устанавливаю и настраиваю webmin, т. к. там есть Filesystem Backup.
1) Обзор вариантов резервирования.
1.1) Образ загрузочного тома и других (которые не LVM).
Создается и восстанавливается с помощью dd:
# dd if=/dev/sda1 of=/backup/boot.dd
1.2) Образ LVM-тома.
Создается снапшот, затем cat snapshot сжимается в image.lzo (в книге есть пример).
Попробовал вместо cat использовать dd для чтения тома LVM - результат одинаков.
1.2.1) Для чего делают бакап образом?
Если, к примеру, данные на томе - это образ виртуальной машины. Если утрировать: том со свапом не сархивировать, его можно забакапить лишь образом.
Видел в инете инструкцию, где, используют исталляционный диск и устанавливают систему с такого файла-образа (Debian).
1.2.2) Провел тест считывания образа логических томов LVM:
# time cat /dev/vg01/lv_home > /mnt/squid/lv_home.img
real 7m31.971s
-rw-r--r-- 1 root root 53687091200 Feb 26 10:50 lv_home.img
# time cat /dev/vg01/lv_home | lzop -c > /mnt/squid/lv_home.img.lzo
real 3m39.066s
-rw-r--r-- 1 root root 223889323 Feb 26 11:00 lv_home.img.lzo
Вывод: просто считанный файл-образ получается размером с том, хотя данных 200 МБ, а со сжатием намного эффективнее.
1.2.3) Как восстанавливать с образа?
1.2.3.1) Так восстанавливают прямо со снапшота (инет): # dd if=/dev/vg00/lv_root_snap of=/dev/vg00/lv_root
1.2.3.2) Я попробовал считать (как указано выше п.1.2.2) и аналогично записать образ /home обратно, и это сработало:
# umount /home
# mkfs.ext4 /dev/vg01/lv_home (форматирую, чтобы стереть все данные)
# lzop -dc /mnt/squid/lv_home.img.lzo > /dev/vg01/lv_home
# mount /home
1.3) Архив LVM-тома.
Создается снапшот, затем содержимое снапшота сжимается в tar.gz (в книге есть пример).
1.3.1) Как сохранить конфигурацию LVM? Чтобы создать такие же группу и тома для восстановления.
Ежедневная резервная копия должна включать содержимое каталога /etc/lvm.
Создать архив метаданных в /etc/lvm/backup можно с помощью команды vgcfgbackup. Восстановить метаданные можно с помощью vgcfgrestore.
2) Резервирование.
2.1) Для начала разделил то "что надо резервировать", то "что не надо" и "куда резервировать" на отдельные тома.
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg01-lv_root 50G 3.6G 44G 8% /
tmpfs 16G 0 16G 0% /dev/shm
/dev/sda2 485M 67M 394M 15% /boot
/dev/sda1 200M 260K 200M 1% /boot/efi
/dev/mapper/vg01-lv_squid 148G 91G 50G 65% /mnt/squid
/dev/mapper/vg01-lv_home 50G 196M 47G 1% /home
/dev/mapper/vg01-lv_log 50G 445M 47G 1% /var/log
/dev/mapper/vg01-lv_mysql 99G 224M 94G 1% /var/lib/mysql
/dev/mapper/vg01-lv_www 197G 8.6G 179G 5% /var/www
/dev/mapper/vg01-lv_backup 296G 52G 229G 19% /mnt/backup
2.2) Схема создания архива LVM-тома:
- Создавать снапшот
- Создавать архив (можно Filesystem Backup в webmin)
- Удалять снапшот
2.2.1) Написал скрипт создания снапшота.
# cat ./create_snap_before_backup
#!/bin/bash
# Если не переданы имя снапшота и расширение архива, то выход
if test $# -ne 2; then
echo "Enter name of snapshot and archive extention"
exit 1
fi
# Указываю значение переменных
snap_name="${1}_snap"
archive_ext=$2
backup_path="/mnt/backup"
snap_lv="/dev/vg01/$snap_name"
lv="/dev/vg01/lv_$1"
log="$backup_path/$snap_name.log"
# Логирую начало запуска скрипта
echo "BEGINING $0 for $snap_name.$archive_ext" &>> $log
date &>> $log
echo "" &>> $log
# Создаю директорию для монтирования снапшота
# -p no error is existing
mkdir -p "$backup_path/$snap_name"
# Создаю снапшот и монтирую
lvcreate -s -L 1G -n $snap_name $lv &>> $log
mount -t ext4 $snap_lv "$backup_path/$snap_name" &>> $log
# Делаю ротацию архивов (4 штуки)
for i in 2 1 0; do
if test $i -ne 0; then j=$i; i=$[$j+1]
else j=''; i=1; fi
if test -f "$backup_path/$snap_name$j.$archive_ext"; then
mv -f "$backup_path/$snap_name$j.$archive_ext" "$backup_path/$snap_name$i.$archive_ext" &>> $log; fi
done
2.2.2) Написал скрипт удаления снапшота.
# cat ./remove_snap_after_backup
#!/bin/bash
# Если не передан параметр название снапшота, то выход
if test $# -ne 1; then
echo "Enter name of snapshot"
exit 1
fi
# Устанавливаю значения переменных
snap_name="${1}_snap"
backup_path="/mnt/backup"
snap_lv="/dev/vg01/$snap_name"
log="$backup_path/$snap_name.log"
# Удаляю снапшот с логированием в файл-лог
lvdisplay $snap_lv &>> $log
umount "$backup_path/$snap_name" &>> $log
lvremove -f $snap_lv &>> $log
# Логирую окончание процесса резервирования
date &>> $log
echo "ENDING $0 $snap_name Backup" &>> $log
echo "" &>> $log
echo "" &>> $log
2.2.3) In Webmin Filesystem Backup делаю Add a new backup of directory.
2.2.3.1) Для /var/www
Directories to backup /mnt/backup/www_snap
Backup to /mnt/backup/www_snap.tgz
Compress archive? yes, with gzip
Command to run before backup /home/sergeiki/bin/create_snap_before_backup www tgz
Command to run after backup /home/sergeiki/bin/remove_snap_after_backup www
Scheduled backup enabled? Enabled, at times chosen below.. Sunday 3:00
2.2.3.2) Для /
Directories to backup /mnt/backup/root_snap
Backup to /mnt/backup/root_snap.tgz
Files and directories to skip /boot /mnt/backup /mnt/squid /home /var/lib/mysql /var/log /var/www /sys /proc
Compress archive? yes, with gzip
Limit backup to one filesystem? No
Ignore read errors on files? Yes
Command to run before backup /home/sergeiki/bin/create_snap_before_backup root tgz
Command to run after backup /home/sergeiki/bin/remove_snap_after_backup root
Scheduled backup enabled? Enabled, after: /mnt/backup/www_snap to /mnt/backup/root_snap.tgz
2.2.3.2.1) Попробовал резервировать lv_root с исключением подмонтированного (Limit backup to one filesystem? Yes), много каталогов не забакапилось.
Я рассчитывал, что это будут /home, /mtn/*, /var/log и т.д. как мне и надо, но не забакапились и /dev, /proc, /sys...
Поэтому, указываю резервировать с подмонтированным, но исключаю /boot /mnt/backup /mnt/squid /home /var/lib/mysql /var/log /var/www /sys /proc
2.2.3.3) И т.д. для остальных LVM-томов.
2.2.4) Написал скрипт, создающий архивы образов /boot, /boot/efi, / и поставил его в cron на Sunday 2:00.
# cat ./create_snap_image |more
#!/bin/bash
# Путь для резервных копий
backup_path="/mnt/backup"
# Задаю имя логического диска, файл-лог, расширение архива
snap_name="sda1"
log="$backup_path/$snap_name.log"
archive_ext="gz"
# Логирую начало
echo "BEGINING $0 for $snap_name.$archive_ext Backup (/boot/efi)" &>> $log
date &>> $log
echo "" &>> $log
# Делаю ротацию архивов (4 штуки)
for i in 2 1 0; do
if test $i -ne 0; then j=$i; i=$[$j+1]
else j=''; i=1; fi
if test -f "$backup_path/$snap_name$j.$archive_ext"; then
mv -f "$backup_path/$snap_name$j.$archive_ext" "$backup_path/$snap_name$i.$archive_ext" &>> $log; fi
done
# Создаю архив образа логического тома и делаю запись в лог
(dd if=/dev/sda1 | gzip -c > $backup_path/$snap_name.$archive_ext) &>> $log
echo "" &>> $log
# Логирую окончание
date &>> $log
echo "ENDING $0 $snap_name Backup (/boot/efi)" &>> $log
echo "" &>> $log
echo "" &>> $log
snap_name="sda2"
log="$backup_path/$snap_name.log"
archive_ext="gz"
echo "BEGINING $0 for $snap_name.$archive_ext Backup (/boot)" &>> $log
date &>> $log
echo "" &>> $log
for i in 2 1 0; do
if test $i -ne 0; then j=$i; i=$[$j+1]
else j=''; i=1; fi
if test -f "$backup_path/$snap_name$j.$archive_ext"; then
mv -f "$backup_path/$snap_name$j.$archive_ext" "$backup_path/$snap_name$i.$archive_ext" &>> $log; fi
done
(dd if=/dev/sda1 | gzip -c > $backup_path/$snap_name.$archive_ext) &>> $log
echo "" &>> $log
date &>> $log
echo "ENDING $0 $snap_name Backup (/boot)" &>> $log
echo "" &>> $log
echo "" &>> $log
snap_name="root_snap"
log="$backup_path/$snap_name.log"
archive_ext="lzo"
echo "BEGINING $0 for $snap_name.$archive_ext Backup" &>> $log
date &>> $log
echo "" &>> $log
for i in 2 1 0; do
if test $i -ne 0; then j=$i; i=$[$j+1]
else j=''; i=1; fi
if test -f "$backup_path/$snap_name$j.$archive_ext"; then
mv -f "$backup_path/$snap_name$j.$archive_ext" "$backup_path/$snap_name$i.$archive_ext" &>> $log; fi
done
# Создаю снапшот (т. к. это LVM-том, а не обычный, как два предыдущих sda1 и sda2)
/sbin/lvcreate -s -L 1G -n $snap_name /dev/vg01/lv_root &>> $log
echo "" &>> $log
(dd if=/dev/vg01/root_snap | lzop -c > $backup_path/$snap_name.$archive_ext) &>> $log
echo "" &>> $log
# Удаляю снапшот
/sbin/lvremove -f /dev/vg01/root_snap &>> $log
echo "" &>> $log
date &>> $log
echo "ENDING $0 $snap_name Backup" &>> $log
echo "" &>> $log
echo "" &>> $log
Комментариев нет:
Отправить комментарий