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

Доброго времени суток.Хотелось бы рассказать Вам свою историю поднятия Xen`а на HP ProLiant DL160 Gen8. Как оказалось, лень подробно изучать спецификацию железа которое ты закупаешь и загодя проверять совместимость с планируемым софтом — сыграли со мной довольно злую шутку. При заказе железа, я глянул на характеристики сервера убедился что raid контроллер в нем присутствует, увы как оказалось сервер оборудован RAID-контроллером Smart Array B120i SATA, который по сути своей является софтовым и нативно не поддерживается и не видится инсталлятором Xen. Эта статья о том как сделать все максимально грамотно оказавшись в подобной ситуации.Небольшое отступление, для экономии времени можно пропустить. Несколько лет использую для работы такую замечательную вещь как XCP 1.6, крутится на 3х физических хостах около 16 серверов, и около десятка тестовых машин для программистов и админов.Начальство вняло мольбам и соблаговолило закупить еще несколько железячек. Среди них — было и два HP DL160 gen 8. Естественно на них тоже будут подняты хосты для виртуальных машин. К моему великому сожалению XCP остановился на версии 1.6. зато XEN 6.2 стал абсолютно «бесплатным». Значит ставить будем его. Качаем образ, проверяем контрольную сумму, перекачиваем образ опять проверяем контрольную сумму, плюем на все закидываем на закачку не фтп, а торрент и в нем перекачиваем все полностью. Записываем образ на флешку. Настраиваем на сервере рейд, устанавливаем загрузку с рейд контроллера, и единоразовую загрузку с флешки. Начинается установка и вот они первые трудности — инссталятор видит диски по рознь, а не как единый рейд массив. Гуглим, бьем в бубен, меняем виды рейда, результат тот же. Гугл говорит о том что вроде как на сайте Citrix есть дрова под этот рейд контроллер для Centos`а, скачиваем дистриб Centos 7, пытаемся скормить ему дрова — рейд по прежнему не видится. Находим статью о том как из консоли во время инсталляции Centos создавать софт рейды. Переделываем статью под себя ставим, и сталкиваемся с новой проблемой, Centos 7 это круто, даже слишком круто для нашего ксена. В общем дальнейшее гугление и несколько дней практического шаманства и родили вот эту статью.

Итак у нас есть следующие исходные данные: HP ProLiant DL160 Gen 84 жестких диска по 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 Собственно вот вроде и все. На почте у нас валяется сообщение о том что с нашими рейдами все хорошо. Мои админы уже издеваются над новыми виртуальными машинками. А я с удовольствием жду Ваши комментарии к этой статье.

Ссылки. Без них было бы все намного сложнее

© Habrahabr.ru