RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Процедуры резервного копирования и восстановления [2011]
Для компьютера под управлением OS FreeBSD на примере корпоративного сервера Proxy3 под управлением FreeBSD 8.2 PRERELASE #0
Предисловие.
В нашей "конторе" выход в интернет обеспечивал долгое время компьютер с громким именем прокси-сервер. Работал он на windows 2003 R2 в связке с WinGate, Trafmetr в качестве шейпера, и стенка из Outpost pro. Не самая красивая связка, но исторически сложилась и нормально работала, пока канал во внешний мир был 256К. Когда канал вырос до 1М машинка стала тупить и не справляться. Екстенсивное решение заменой железа помогло, но не на долго. На горизонте маячило расширение канала, благо цены падали. Поэтому стал вопрос о создании нового решения. Выбор пал на FreeBSD. Три месяца чтения Лукаса, Таймена, эксперименты с кратким руководством от Корниенко и другими источниками принесли свои плоды - заработал под новый год сервер под FreeBSD. Может не все так как хотелось, но заработал.
Дальнейшее изучение FreeBSD и модернизация этой системы на рабочем сервере при отсутствии серьезного опыта потребовало обязательного решения по резервированию и восстановлению системы на случай неизбежных ошибок. Эксперименты с пересборкой ядра и мира, плавный переход с версии 8.1 на 8.2 на этапе экспериментов решался клонированием системы на другой жесткий диск перед каждым более или менее радикальным шагом. Процедура клонирования занимала около часа и при введении сервера в эксплуатацию стала не приемлемой. Стал вопрос о нормальной процедуре резервирования и восстановления. Результат чтения различных источников и нескольких экспериментов был задокументирован на случай сбоев и для других сотрудников нашей "конторы". Хочу заметить, что процедура резервного копирования системы под FreeBSD в интернете освещена более или менее подробно, а вот по восстановлению подробного описания найти не удалось.
Процедура резервного копирования. http://www.freebsd.org/doc/ru/books/handbook/backup-basics.html Вам нужно выполнить всего лишь четыре шага для того, чтобы быть готовым к любому сбою. Во-первых, распечатайте разметку диска для всех ваших дисков (к примеру, bsdlabel da0 | lpr), таблицу файловых систем (/etc/fstab) и все сообщения, выводимые при загрузке, каждого по два экземпляра. -Т.01---------------------------------------------------------------------------
160G SATA2 ASPI "Слики" всего 71679 МБ ad4s1 всего 80947 МБ ad4s2 ? не размечено, резерв
-Т.04-------------------------------------------------------------------------— Во-вторых, запишите CD диск с 'livefs'. Этот диск позволяет загружаться в режим аварийного восстановления FreeBSD, давая возможность пользователю выполнять ряд утилит, среди которых dump(8), restore(8), fdisk(8), bsdlabel(8), newfs(8), mount(8) и т.д. Образ CD с 'livefs' для FreeBSD/i386 8.1-RELEASE находится по адресу FreeBSD-8.1-RELEASE-i386-livefs.iso (в нашем случае FreeBSD-8.2-RC2-i386-livefs.iso или FreeBSD-8.2-RC2-i386-livefs.iso
Примечание: для восстановления системы можно использовать и полный образ системы объемом примерно 2G, для DVD, используемый при инсталляции. Например из файла "FreeBSD-8.1-RELEASE-i386-dvd1.iso". В нем так же, как и в образе CD с 'livefs', есть все необходимое. Могу предположить что для восстановления может подойти любой диск от 7, 8 или даже 9-й версии. Но не проверял.
Длительность процедуры резевирования для компьютера следующей комплектации:
Intel Pentium 4 630, 3000 MHz (15 x 200) Asus P5GDC Pro (Intel Grantsdale i915P) ATI Radeon X550 (RV370) (128 Мб) 2048 Мб (2x1G Мб PC3200 DDR SDRAM Samsung) SAMSUNG HD160JJ (160 Гб, 7200 RPM, SATA-II) сеть 1)Onboard (Marvell Yukon 88E8053 PCI-E Gigabit Ethernet Controller) 2)External (Intel(R) PRO/100+)
составляет 42.14 мин или по разделам
раздел сек архив,мб ------------------------ root 217 116.72 usr 1914 1187.1 var 175 374.9 tmp 0 0.016 home 222 1669.8 ------------------------ summ 2528 3348.5
Недостатком этого способа можно назвать двукратное превышение объема из за рекурсии информации на томе home (файл 20110119.4.home.img.gz) содержит копии всех предыдущих файлов 20110119.4.*.img.gz. Возможно этого избежать путем записи файлов на разные тома с последующим перемещением или изменения последовательности резервирования (например сначала копировать том home). В любом случае после копирования информацию необходимо переместить на другой носитель (либо резервный HDD в составе того-же компьютера, либо на другой компьютер, либо на сменный носитель - DVD-R/RW и прочая). Это еще дополнительно время (около получаса).
2) Во избежание недостатков первого способа были проведены следующие действия: 2.1) Обеспечен доступ к ftp серверу (В моем случае по адресу 192.168.1.3 на сервере под управлением MS Windows 2003 R2 создан в IIS узел ftp на порту 8022 с полным доступом для учетной записи proxy3 c паролем proxy3 и резервом дискового пространства порядка 50G.) 2.2) Создан следующий скрипт "/home/backup/backup2.sh"
#!/bin/sh
###############################################################################
# Резервное копирование системы
# по мотивам
#http://hotfreebsd.ru/rezervnoe-kopirovanie-freebsd-pri-pomoshhi-dump-i-restore
#http://rm-rf.ucoz.ru/publ/11-1-0-14
###############################################################################
#
# собственно типовая функция бакапа на ftp Сервер
dump_to_ftp () {
############################################################################
#ftp -i -A -P 8022 -u ftp://proxy3:proxy3@192.168.1.3/ 20110119.*
#ftp -i -A -P 8022 -u ftp://proxy3:proxy3@192.168.1.3/20110119.2.var.img.gz -
echo "------- Begin dump party '/${party}' copy to ftp ----------------"
dump -0 -L -f - /${party} | gzip -9 | ftp ${ftpkeys} -u \
ftp://${usr}:${pass}@${ftpsrv}/${DATE}.${num}.${partyn}.img.gz -
res=${?}
echo "------- End dump '/${party}', sleep 4c ----"
sleep 4
echo ' '
return ${res}
}
DATE=`date +%Y%m%d%H`
ftpkeys="-i -a -A -P 8022"
usr="proxy3"
pass=${usr}
ftpsrv="192.168.1.3"
num="0"
party=""
partyn="root"
dump_to_ftp
echo ${?}
num=`exp ${num}+1`
party="usr"
partyn=${party}
dump_to_ftp
echo ${?}
num=`exp ${num}+1`
party="var"
partyn=${party}
dump_to_ftp
echo ${?}
num=`exp ${num}+1`
party="tmp"
partyn=${party}
dump_to_ftp
echo ${?}
num=`exp ${num}+1`
party="home"
partyn=${party}
dump_to_ftp
echo ${?}
sleep 1
echo '---- End dump all party ----------'
Запуск скрипта второго варианта позволяет создать файлы резервной копии сразу на другом компьютере. К недостаткам можно отнести обязательную необходимость нормального функционирования ftp сервера. Общий объем файлов резервной копии составляет около 1.7G.
3) Для дополнительной страховки, каждый раз создавайте загрузочный CD диск с 'livefs'. Храните одну из копий в каком-то удаленном месте и НЕ в том же здании, где находится ваш офис. Достаточно большое количество компаний во Всемирном Торговом Центре изучило это на своей шкуре. Это удаленное хранилище должно быть физически отделено на большое расстояние от ваших компьютеров и дисковых устройств.
Процедура тестового восстановления:
3.1) Берем компьютер следующей комплектации Intel Celeron D 325, 2533 MHz (19 x 133) Asus P4P800-VM i865G Inboard (Intel(R) 82865G Graphics Controller (64 Мб) 1G (1 PC3200 DDR SDRAM) HDD 160 Гб, 7200 RPM, Ultra-ATA/133 сеть 1)Onboard (Intel(R) PRO/100 S) 2)External (Intel(R) PRO/100+)
Запускаемся с USB DVD-RW с диском 'livefs' см.выше Т.04)
После загрузки:
1) На экран будет выведено оригинальное меню установки. Выберите требуемую страну, потом в меню "Custom" там разбиваем жёсткий диск – меню "3 Partition". Попадаем в программу, чем-то напоминающую fdisk для DOS. Подсказки по меню расположены внизу экрана.Основные команды – клавиша "C" (создать раздел), "D" (удалить раздел). Cоздаем слайк(slice, Partirion) нужного размера (71679М, в принципе можно и больше и меньше объем, но для теста делаю так). Выходим отсюда клавишей "Q", выбираем стандартный загрузчик (Standard)
2) И приступаем к разметке – пункт меню "4 Label". Мы попадаем в ещё одну утилиту, напоминающую fdisk. Подсказки так же отображены внизу экрана. Последовательность действий следующая: нажимаем "C" (создать), определяем размер (например 512M или 2G), выбираем "file system" это у нас будет или "swap" и определяем имя файловой системы, начиная от корневого каталога. Первым нужно создать корневой каталог "/", затем swap, затем все остальные, например "/var". Если что-то создали не так, нажмите "D" (удалить). Типы и размеры разделов выбираем как выше, в Т.01. Выходим отсюда клавишей "Q". Замечание: имена томов могу отличаться. Например, сам слайк(slice, Partirion) в оригинальной системе именуется "ad4s1" а в резервной у меня "ad0s1". Соответственно изменяться имена томов. эту разницу нужно будет потом учесть позже, до первой загрузки, изменив файл "/etc/fstab".
3) Применяем изменения (пункт 7 "Coommit")
4) Выбираем пункт меню "Fixit - Repair mode with CDROM/DVD/floppy or start a shell.", а в нём выберите пункт CDROM/DVD - Use the live filesystem CDROM/DVD.
Cмотрим, какие разделы есть, что есть, не факт что ad*, но в моем случае
Для раздела swap (/dev/ad0s1b) можно сразу выполнить активацию раздела
Fixit# swapon /dev/ad0s1b
теперь монтируем каждый том
Fixit# mount /dev/ad0s1a /mnt/root
Fixit# mount /dev/ad0s1d /mnt/var
Fixit# mount /dev/ad0s1e /mnt/tmp
Fixit# mount /dev/ad0s1f /mnt/usr
Fixit# mount /dev/ad0s1g /mnt/home
Настраиваем сеть:
Для начала посмотрим, какие сетевые интерфейсы у нас в системе есть:
Fixit# ifconfig
Вы должны увидеть список сетевых интерфейсов системы, среди которых есть ваши сетевые карты (у меня fxp0 и msk0 - в оригинальной системе, fxp0 и fxp1 в клонируемой) В будущем, после восстановления, нужно пройтись по всем файлам настроек, где фигурируют имена интерфейсов, и их изменить соответствующим образом (/etc/rc.conf, /etc/rc.firewall, /etc/ppp/ppp.conf и другие). Присвоим нашему восстанавливаемому компьютеру внутренний IP 192.168.1.89, в целях эксперимента - отличный от оригинального (192.168.1.80). Для этих целей используется команда ifconfig, в нашем случае:
переходим смонтированный каталог, достаточного объема для всех файлов резервных копий и который не обязательно восстанавливать. Я выбрал "/mnt/tmp"
Fixit# cd /mnt/tmp
Из этого каталога заходим на ftp, включаем в режим бинарной передачи, забираем все необходимые файлы, выходим (ниже лишний вывод удален, только команды):
Fixit# ftp -A ftp://proxy3:proxy3@192.168.1.3:8022/
ftp> binary
ftp> get 2011012016.0.root.img.gz
ftp> get 2011012016.1.usr.img.gz
ftp> get 2011012016.2.var.img.gz
ftp> get 2011012016.3.tmp.img.gz
ftp> get 2011012016.4.home.img.gz
ftp> exit
Fixit#
Вместо того что бы набирать имя каждого файла в команде ftp> get можно воспользоваться командой ftp> mget с шаблоном:
ftp> mget 2011012016*
на вопрос команды ответить "a" (да, в смысле, все хочу, all). В общем после относительно длительного окончания копирования файлов выходим из ftp по команде exit. Запускаем restore с извлечением из архива и выводом на консоль и передачей в поток команде restore:
Если надо восстановить том "/tmp", следует перекинуть его файл 2011012016.3.tmp.img.gz (или все файлы 2011012016.*.*.img.gz), например, в каталог "/mnt/home" (или другой, где после восстановления достаточно места)
Fixit# cd /mnt/home
Fixit# gzip -d -c 2011012016.3.tmp.img.gz | ( cd /mnt/tmp ; restore -rf - )
Примечание: вообще то после команда restore файлы, которые были на целевом томе, остаются. Но их целостность я не проверял, а интернете пишут что команда restore - деструктивная. Я думаю пока имена существующих файлов не совпадают с именами восстанавливаемых, проблем не будет. Для чистоты эксперимента я предполагаю что restore уничтожает все файлы на целевом томе при восстановлении. Поэтому выше используется команда "mv". Теперь смотрим результат
акуратно меняем все ad4s? на ad0s? чтобы удалить символ - подводим курсор под него (под "4") и давим "x", чтобы вставить символ - подводим курсор, давим "i", вставляем символ ("0"), давим "ESC" для возврата в командный режим. Как отредактировали - выходим с сохранением, давим в командном режиме ":wq" и выходим. Обязательно внимательно проверьте результаты, например командой
Fixit# cat etc/fstab
т.к. если будет ошибка, вы не загрузитесь нормально. Для исправления прийдется опять загружаться с диска восстановления, монтировать раздел root и вносить исправления. В процессе эксперимента я еще исправил etc/rc.conf, в частности: 1) Заменил имена интерфейсов msk0 на fxp0, fxp0 на fxp1. 2) Изменил адрес сетевого интерфейса (теперь fxp0) c 192.168.1.80 на 192.168.1.89 чтобы не "задеть" нормально работающий сервер. Практика показала что не он задевается, но лучше поберечься. 3) изменил hostname c "proxy3" на "proxy3d" 4) Закомментировал строку
т.к. на другом железе режим наверняка будет другой. Его позже можно определить командой vidcontrol -i mode, но уже загрузившись со своего ядра, т.к. в ядре используемом "Fixit" этот набор очень ограничен.
Если не хотите работать с vi, то перед первой загрузкой откиньте сетевые кабели, загрузитесь в восстановленной системе и правьте этот и другие файлы в другом редакторе (например, mcedit).
Ну вот, думаю, пробное восстановление закончено, осталось выйти
Fixit# reboot
и перегрузиться, нажимая все возможные "Сansel", "Exit". Успехов.