Бекап файлов с помощью dump и восстановление – restore.

Система бекапов уже была описана здесь, это второй способ с помощью dump & restore. Итак, имеется сервер 1(192.168.210.1) на котором есть раздел /mnt/da1d, расшаренный через samba, где хранится юзерская информация, которую нельзя потерять. Имеется второй бекапный сервер 2(192.168.210.20) с большим винчестером, в котором для бекапов выделен раздел /backup. Идея такова – по крону на основном сервере запускается скрипт, который по NFS монтирует раздел /backup бекапного сервера, делает туда дамп всей файловой системы /mnt/da1d и по окончании размонтирует NFS.

Настраиваем NFS. На сервере 1, с которого нужно бекапить настраивается nfs-client: прописываем в /etc/rc.conf: nfs_client_enable=”YES”(на практике у меня клиент конектился к серверу и без этого определения). На бекапном сервере 2 настраивается nfs-server – в /etc/rc.conf прописываем:

rpcbind_enable=”YES”
nfs_server_enable=”YES”
nfs_server_flags=”-u -t -n 4 -h 192.168.210.20″
mountd_flags=”-r”

Тут указывается, что запускаются 4 копии nfs-сервера, работают и по tcp и по udp, слушается интерфейс на котором прописан IP номер 192.168.210.20. Если не указывать IP номер nfs-сервер будет слушать все интерфейсы. Создаем файл /etc/exports:
/backup -maproot=root 192.168.210.1
Тут указано, что для 192.168.210.1 расшаривается доступ к разделу /backup только для root. Перезапускаем NFS-сервер. На NFS-клиенте (сервер1) пишем в /etc/crontab:
00 4 1 * * root /usr/my_config/dump0.sh
00 4 2-31 * * root /usr/my_config/dump1.sh

Тут указано, что первого числа каждого месяца в 4.00 запускать /usr/my_config/dump0.sh, в остальные дни – usr/my_config/dump0.sh. Теперь рассмотрим эти скрипты.

/usr/my_config/dump0.sh:
#/bin/sh
mount 192.168.210.20:/backup /mnt/dump
cd /mnt/dump
mkdir `date ‘+%B-%Y’`
cd `date ‘+%B-%Y’`
dump -0u -L -f- /mnt/da1d > `date ‘+%d-%B-%Y’`-0.img
chown nobody `date ‘+%d-%B-%Y’`-0.img
cd /
umount 192.168.210.20:/backup /mnt/dump

/usr/my_config/dump1.sh:
#/bin/sh
mount 192.168.210.20:/backup /mnt/dump
cd /mnt/dump/`date ‘+%B-%Y’`
dump -1u -L -f- /mnt/da1d > `date ‘+%d-%B-%Y’`-1.img
chown nobody `date ‘+%d-%B-%Y’`-1.img
cd /
umount 192.168.210.20:/backup /mnt/dump

В скрипте dump1.sh монтируется раздел /backup бекапного сервера2 в точку монтирования /mnt/dump (необходимо зарание созать директорию), переходим в /mnt/dump, создаем директорию ‘месяц-год’, переходим сюда и делаем дамп нулевого уровня – полностью дампится вся файловая система и сохраняется в файл ‘день-месяц-год-0′.img, ставим права доступа для nobody, выходим из текущей директории, например в / и размонтируем. Опции:
-u – в /etc/dumpdates пишется информация о том когда был создан дамп какого уровня и какой файловой системы;
-L – сохранение живой файловой системы;
-f – дампить в файл, файлом может быть стандартный вывод(-) как в нашем случае, /dev/sa0 – ленточный носитель, /dev/fd1 – флопик;
/mnt/da1d – файловая система, которая дампится.
Если охота сжать можно вывод отправить через трубу на gzip:
dump -0u -L -f- /mnt/da1d|gzip > `date ‘+%d-%B-%Y’`-0.img

Во втором скрипте dump1.sh делается дамп первого уровня – дампятся только файлы, которые изменились в сравнении с нулевым. При создании нулевого дампа на файлах ставится флаг NODUMP, который удаляется при редактировании его. Получается при создании первого дампа будут сохраны только те у которых нет этого флага, это очень удобно, т.к. позволяет экономить место на диске. Скрипт в уже созданной директории /mnt/dump/’месяц-год’ создает дамп первого уровня ‘день-месяц-год’-1.img, и по кончании размонтирует удаленный раздел. Перед размонтированием нужно выходить из текущего раздела, т.к. он не размонтируется и будет писать device busy (занят). Теперь у нас на первое число каждого месяца будет нулевой дамп а в остальные дни разносный – первый.

Теперь рассмотрим resore – восстановление. Прежде всего рассмотрим с какими ключами может работать restore:

-i – интерактивный режим восстановления, после чтения информации о директории из бекапа подаем в shell, можно ходить по каталогам смотреть какие есть файлы и выбирать те, котрые нам надо восстановить;
-r – восстановление всей файловой системы, она должна быть заранее создана (newfs /dev/da1s1a), смонтирована и необходимо перейти в директорию монтирования. также опцию указывают при распаковке инкрементных архивов, после того как арзив нулевого уровня уже распакован;
-x – извлечение указанного файла, если есть такая директория она вся извлекается со всеми поддиректорями и файлами;
-f – читает из файла, еcли указать /dev/sa0 – из стримера, /dev/ da1c – из флопика, “-” – из стандартного вывода.

Итак нам необходимо восстановить определенную директорию из архива, в примере восстанавливаем директорию base. Восстаналивает в текущую директорию, поэтому нужно изначально перейти туда, куда мы хотим извлечь архив:

# restore -xf /backup/July-2008/15-July-2008-1.img base

Для восстановления всей файловой системы переходим в подмонтированную директорию и запускаем:

# restore -rf /backup/July-2008/15-July-2008-1.img

Наиболее интересный интерактивный режим(ключик -i), тут мы можем ходить по архиву и указывать файлы и каталоги,которые хотим восстановить. Итак запускаем:

# restore -if /backup/July-2008/15-July-2008-1.img
restore >help
Available commands are:
ls [arg] – list directory
cd arg – change directory
pwd – print current directory
add [arg] – add `arg’ to list of files to be extracted
delete [arg] – delete `arg’ from list of files to be extracted
extract – extract requested files
setmodes – set modes of requested directories
quit – immediately exit program
what – list dump header information
verbose – toggle verbose flag (useful with “ls”)
help or `?’ – print this list
If no `arg’ is supplied, the current directory is use

Получаем проглашение, вводим команду quit и смотрим какие команды можно использовать. Чтобы посмотреть список файлов воодим ls, перейти в другой каталог – cd, add – добавить директорию в список извлечения, файлы, которые будут извекаться помечаются звездочкой (*), когда их просмативать ls, delete – удалить из списка извлечения, если задан каталог применяется и на все файлы в нем и подкаталоги. Таким способом можно сначала указать add dir, потом ввойти в нее и указать delete file or dir тем самым извлекаются только нужные файлы директории.

Если бекап заархивирован, команда следующая:

# gzcat 15-July-2008-1.gz | restore -if-

Источник информации:
1. http://www.lissyara.su/?id=1481
2. http://www.lissyara.su/?id=1482
3. http://www.opennet.ru/docs/RUS/linuxsos/ch22_2.html

© Mau, 2008.