среда, 2 апреля 2014 г.

Full backup of CentOS 6.5 on IBM System x3650 M4


Использую книгу М. Кофлер "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

Комментариев нет:

Отправить комментарий