Xenserver 6.2 установка на soft raid vs HP ProLiant DL160 Gen8

Автор: vik_kr Дата: . Категория: Статьи

Доброго времени суток.
Хотелось бы рассказать Вам свою историю поднятия Xen`а на HP ProLiant DL160 Gen8. Как оказалось, лень подробно изучать спецификацию железа которое ты закупаешь и загодя проверять совместимость с планируемым софтом — сыграли со мной довольно злую шутку. При заказе железа, я глянул на характеристики сервера убедился что raid контроллер в нем присутствует, увы как оказалось сервер оборудован RAID-контроллером Smart Array B120i SATA, который по сути своей является софтовым и нативно не поддерживается и не видится инсталлятором Xen. Эта статья о том как сделать все максимально грамотно оказавшись в подобной ситуации.


 

Небольшое отступление, для экономии времени можно пропустить.



Итак у нас есть следующие исходные данные:
HP ProLiant DL160 Gen 8
4 жестких диска по 1Tb
Флешка 16Gb(была и на 8Gb0 но как оказалось инсталлу этого маловато)
Необходимо создать 3 рейд массива — md0 и md1 по 4Гб типа raid 1. все остальнео место будет занимать md2 типа raid 10. Первоначально пробовал для все массивов использовать raid 10 — но почему-то xen не грузится с 10 raid`a, в инете встречал информацию что проблемы с загрузкой были только у raid 5. Поэтому конфигурация массивов будет именно такой.
Первоначально задача показалась не очень сложной и следуя инструкциям (ссылки №4-8) все было замечательно до тех пор пока мы не добираемся до этапа загрузки со 2/3 жесткого диска, и вот тут сервер дарит нам массу эмоций так как выбрать конкретное устройство для загрузки нельзя(т.е. если у вас несколько флешек с разными системами или несколько винтов с разными ОС то грузится будет ТОЛЬКО с первой в очереди. никаких вариантов для решения данной проблемы найдено не было. Поэтому был выбран другой путь — поставить систему на флешку а уже потом загрузившись с флешки произвести все необходимые нам действия по конфигурации рейдов и переносу и настройке хост системы. Как я уже сказал — выбрать какую именно флешку использовать для загрузки БИОС нам не дает, а доступ в серверную 24/7 не всегда возможен.И вот тут на помощь нам приходит ILO 4 — нет он не помогает нам выбирать устройтсва для загрузки (максимум удобно выбрать порядок загрузки и назначить конкретный тип устройства для следующей перегрузки, ну и эту самую перегрузку произвести) за-то он дает возможность примонтировать любой образ к виртуальному CD/DVD-ROM и загрузится с него.
Итак последовательность действий такова Монтируем образ через iLO, устанавливаем систему на флешку, грузимся с флешки, конфигурируем рейд и переносим систему на него, допиливаем напильничком — профит.
 

Этап 1


Во время загрузки xen нажимаем F2 и в появившейся строке-приглашении пишем команду:

shell


Загрузится необходимый набор библиотек и драйверов и появится приглашение

bash-3.2# 


Во многих гайдах рекомендуют для определения нужного нам устройства использовать команду:

cat /proc/partitions


Ее выдача не удобна в данном случае, глаза от циферок разбегаются, посему я воспользуюсь вот такой:

 fdisk -l | grep /dev/sd


Согласно выдаче видно что флешка у нас это /dev/sde Проведем небольшую подготовительную работу.
Используя

fdisk /dev/sd*


удаляем все разделы на всех дисках (в результате многократных экспериментов создавалось много разных конфигураций — сейчас они нам не к чему поэтому удаляем их смело (не забыть удалить суперблоки созданных нами ранее рейдов)
Для запуска процесса установки воспользуемся вот такой командой:

/opt/xensource/installer/init


После окончания установки нам предложат удалить все устройства и перегрузится, соглашаемся и попадаем в запущенный нами ранее шелл.
В нем выполняем следующие действия:

mkdir /tmp/sda 
mount -t ext3 /dev/sde1 /tmp/sda 
chmod -R 664 /sys/block 
cp -R /sys/block /tmp/sda/sys/ 


# Возникающие ошибки к нам отношения не имеют — все так и задумано

chroot /tmp/sda 
cd /boot 
ls -a 


# Команда ls покажет нам содержимое каталога

mv initrd-***xen.img initrd-***xen.img.old 
mkinitrd --with-usb initrd-***xen.img ***xen


# Вместо *** вставляем значения, которое нам показала предыдущая команда в каталоге (автодополнение по tab работает):
Должно получиться вот так:

mv initrd-2.6.32.43-0.4.1.xs1.8.0.835.170778xen.img initrd-2.6.32.43-0.4.1.xs1.8.0.835.170778xen.img.old
mkinitrd –with-usb initrd-2.6.32.43-0.4.1.xs1.8.0.835.170778xen.img 2.6.32.43-0.4.1.xs1.8.0.835.170778xen


выходим из chroot`a:

exit


синхронимся

sync


перегружаемся!

reboot


 

Этап 2


Здесь у нас два варианта или используя iLO 4 установить в разделе Virtual media / Boot order — One-Time Boot Status — USB Storage Device или при загрузке сервера нажать F11 и в выпадающем меню выбрать пункт 3. Оба действия в принципе равнозначны, единственное что нельзя воспользоваться настройкой через iLO если сервре уже находится в перегрузке (т.е. сначала залезли в настройки iLO и поставили однократную загрузку с USB, а уж потом набрали в консоли reboot и нажали клавиу Enter).
Дальнейшие действия мы буем совершать в консоли которую нам предоставляет XenCenter. (как оказалось сервер Proliant DL 160 Gen8 довольно капризный, и кроме отсутствия нормально аппаратного рейда, он очень плохо себя ведет в содружестве с KVM свитчом в части передачи изоражения, все дергается и искажается — глаза очень быстро начинают болеть) Для этого дождемся загрузки свежеустановленного ксена и подключим его к нашему XenCentr`у — введем с соответствующие поля IP нашего сервера и пароль для учетной записи root. В качестве еще одного плюса работы через XenCentr хочется добавить возможность копировать и вставлять из буфера что значительно ускорит нашу работу по дальнейшей настройке рейдов.

Перейдем на вкладку Console и нажмем Enter.

Итак для начала посмотрим что у нас с порядком устройств:

fdisk -l | grep /dev/sd


Как видим флешка у нас стала теперь именоваться /dev/sda
Команда

cat /proc/partitions


показывает что на флешке у нас 2 раздела, а команда 

sgdisk -p /dev/sda


дает более удобочитаемую ( для меня) информацию по этим разделам.
Стираем таблицу разделов на всех жестки дисках дисках:

sgdisk --zap-all /dev/sdb
sgdisk --zap-all /dev/sdc
sgdisk --zap-all /dev/sdd
sgdisk --zap-all /dev/sde


Устанавливаем туда GPT таблицу разделов:

sgdisk --mbrtogpt --clear /dev/sdb
sgdisk --mbrtogpt --clear /dev/sdc
sgdisk --mbrtogpt --clear /dev/sdd
sgdisk --mbrtogpt --clear /dev/sde


Создаём таблицу разделов, идентичную таблице первого диска (внимание на цифры, ставим идентичные для соответствующего раздела на исходном диске с установленной системой):

sgdisk --new=1:2048:8388641 /dev/sdb
sgdisk --new=2:8390656:16777249 /dev/sdb
sgdisk --new=3:16779264:$(expr $(sgdisk -p /dev/sdb | awk '/Disk \// {print($3)}') - 34) /dev/sdb


Здесь хочу обратить ваше внимание вот на что, так как мы устанавливаем на флешку только систему и не настраиваем локальное хранилище то размер 3 диска надо подбирать в зависимости от размера вашего диска. В некоторых инструкциях встречается упоминание о том, что надо отдавать не весь диск а чуть чуть меньше (я так понимаю в конце диска хранится резервная копия GPT вот под нее и оставялем место).
Необходимо заменить идентификаторы разделов на fd00 идентификатор раздела содержащего raid.

sgdisk --typecode=1:fd00 /dev/sdb
sgdisk --typecode=2:fd00 /dev/sdb 
sgdisk --typecode=3:fd00 /dev/sdb


Копируем созданные разделы на остальные диски

sgdisk -R /dev/sdc /dev/sdb
sgdisk -R /dev/sde /dev/sdb
sgdisk -R /dev/sdd /dev/sdb


В одном из руководств были комментарии о том что могут возникнуть проблемы если все диски будут иметь одинаковый UUID избавляемся от потенциальной головной боли в будущем.

sgdisk -G /dev/sdb
sgdisk -G /dev/sdc
sgdisk -G /dev/sdd
sgdisk -G /dev/sde


Ставим флаги загрузочного раздела

sgdisk /dev/sdb --attributes=1:set:2
sgdisk /dev/sdc --attributes=1:set:2
sgdisk /dev/sdd --attributes=1:set:2
sgdisk /dev/sde --attributes=1:set:2


В связи с тем что диски до этого были подопытными и для того что бы избежать проблем в дальнейшем выполним вот такие команды что бы убедиться в отсутствии суперблоков от предыдущих рейдов

mdadm --examine /dev/sdb
mdadm --examine /dev/sdb1
mdadm --examine /dev/sdb2
mdadm --examine /dev/sdc
mdadm --examine /dev/sdc1
mdadm --examine /dev/sdc2
mdadm --examine /dev/sdd
mdadm --examine /dev/sdd1
mdadm --examine /dev/sdd2
mdadm --examine /dev/sde
mdadm --examine /dev/sde1
mdadm --examine /dev/sde2


И если хоть на одном из них будут найдены остатки рейда то необходимо выполнить следующие операции:

mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2
mdadm --zero-superblock /dev/sdc1
mdadm --zero-superblock /dev/sdc2
mdadm --zero-superblock /dev/sdd1
mdadm --zero-superblock /dev/sdd2
mdadm --zero-superblock /dev/sde1
mdadm --zero-superblock /dev/sde2


Создание raid массивов.

mdadm --stop /dev/md0
mknod /dev/md0 b 9 0
mknod /dev/md1 b 9 1
mdadm --create /dev/md0 --level=1 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1


На вопрос mdadm — Continue creating array? уверенно отвечаем yes
Теперь создаем 2 рейд:

mdadm --create /dev/md1 --level=10 --raid-devices=4 /dev/sdb2 /dev/sdc2 /dev/sdd2 /dev/sde2


Теперь создаем 3 рейд:

mdadm --create /dev/md2 --level=10 --raid-devices=4 /dev/sdb3 /dev/sdc3 /dev/sdd3 /dev/sde3


Дальше ждем когда mdadm соберет наши разделы в полноценные рейды, для этого либо время от вермени запускаем команду

cat /proc/mdstat

либо воспользуемся вот такой вариацией — которая сама обновляет информацию о состоянии и отображает на экране в реальнмо времени

watch -n 1 cat /proc/mdstat


Если создание 2 рейдов md0 и md1 занимает пару минут, то на сборку md2 ушло примерно 3 часа… так что смело можно идти пить чай с булочками.
Создаем и монтируем файловую систему:

mkfs.ext3 /dev/md0
mount /dev/md0 /mnt 


Копируем туда root файловую систему:

cp -vxpR / /mnt


Вносим изменения в /mnt/etc/fstab – заменяем корневую фалйловую систему на/dev/md0 можно вручную с помощью nano, а можно и вот так.

sed -i 's/LABEL=[a-zA-Z\-]*\s\(.*\)/\/dev\/md0 \1/' /mnt/etc/fstab


Копируем загрузчик на все диски.

mount --bind /dev /mnt/dev
mount -t sysfs none /mnt/sys
mount -t proc none /mnt/proc
chroot /mnt
/sbin/extlinux --raid --install /boot
exit
dd if=/mnt/usr/share/syslinux/gptmbr.bin of=/dev/sdb
dd if=/mnt/usr/share/syslinux/gptmbr.bin of=/dev/sdс
dd if=/mnt/usr/share/syslinux/gptmbr.bin of=/dev/sde
dd if=/mnt/usr/share/syslinux/gptmbr.bin of=/dev/sdd


Создаем новый загрузочный образ и распаковываем его:

mkdir /mnt/root/initrd-raid
mkinitrd -v --fstab=/mnt/etc/fstab /mnt/root/initrd-raid/initrd-`uname -r`-raid.img `uname -r`
cd /mnt/root/initrd-raid
zcat initrd-`uname -r`-raid.img | cpio -i


Отредактируем файл ‘init’ – вставив строчки raidautorun:

sed -i 's/raidautorun \/dev\/md0/raidautorun \/dev\/md0\nraidautorun \/dev\/md1\nraidautorun \/dev\/md2/' init


Скопируйте новый загрузочный образ в каталог /mnt/boot и измените загрузочное меню

find . -print | cpio -o -Hnewc | gzip -c > /mnt/boot/initrd-`uname -r`-raid.img
rm /mnt/boot/initrd-2.6-xen.img
cd /mnt/boot
ln -s initrd-`uname -r`-raid.img initrd-2.6-xen.img


Замените в /mnt/boot/extlinux.conf строку “root=LABEL=root-…” на“root=/dev/md0″ во всех пунктах меню

sed -i 's/LABEL=[a-zA-Z\-]*/\/dev\/md0/' extlinux.conf


Когда все три массива синхронизируются, скопируйте настройки RAID в/etc/mdadm.conf

mdadm --detail --scan >> /etc/mdadm.conf


 

Работа напильником


В целом наш Xenserver установлен и настроен, остается вытащить флешку, указать загрузку с жесткого идска и перегрузить машинку. После чего добавить одну единственную командочку для создания на md2 нашего локального хранилища.

xe sr-create content-type=user type=lvm device-config:device=/dev/md2 shared=false name-label="Local storage"


А для того что бы можно было чуть-чуть спокойнее спать, добавляем к нашему серверу функцию оповещения если что либо случается с нашими рейд массивами.
Для начала добавим в файл /etc/mdadm.conf информацию о нашей почте (куда буду приходить алярмы)

sed -i '1i MAILADDR <наш e-mail>' /etc/mdadm.conf


теперь включим сервис мониторинга за состоянием наших массивов, как оказалось все очень просто:

service mdmonitor start
chkconfig mdmonitor on


Что бы проверить что все настроено и работает, пошлем себе тестовый статус:

mdadm --monitor --test /dev/md0



Собственно вот вроде и все. На почте у нас валяется сообщение о том что с нашими рейдами все хорошо. Мои админы уже издеваются над новыми виртуальными машинками. А я с удовольствием жду Ваши комментарии к этой статье.