Citrix Xen Server при том что основан на дистрибутиве Linux в процессе установки не позволяет управлять размерами разделов и конфигурацией жестких дисков под устанавливаемую систему. По умолчанию при установке он спрашивает только диск на который требуется установка с автоматической разметкой дискового пространства под свои нужды. В процессе установки на выбранном диске создается 3 primary раздела. Два по 4Гб и один на все оставшееся место. (Кстати, может кто подскажет, для чего нужен второй раздел на 4Гб? Предполагаю, что на случай обновлений, восстановлений системы там лежит копия первого раздела с установленной системой, но точной информации не нашел.)
Столкнувшись с необходимостью поднять Xen Server на трех дисках задумался об обеспечении хоть какой то сохранности данных. Итак схема итогового массива примет следующий вид:
Далее как это реализуется.
Установка системы.
Для начала ставим систему на первый диск. Установку проходить по шагам не будем, потому как материалов об этом хватает в сети более чем. Единственно хочу отметить что при установке надо отказаться от подключения хранилища виртуальных машин. Для этого
на экране Virtual Machine Storage надо в первой строке снять галочку. Хранилище подключим после создания массива. А если создать его сейчас огребем лишнюю головную боль по последующему его переносу.
Конфигурация массива.
Создание разделов на втором и третьем диске.
После установки системы и загрузки переходим в консоль и начинаем создавать массив. Для начала теория. Мы на работающей системе сидим на первом диске. Создаем битый массив на двух оставшихся дисках. Делаем копию работающей системы на созданном массиве. Перезагружаемся с битого массива. Подключаем изначальный диск к массиву и ждем восстановления целостности массива. После этого создаем хранилище для виртуальных машин. И так, приступим.
Загрузившись в систему смотрим структуру диска созданного установщиком.
sgdisk -p /dev/sda
Вывод будет представлять что то подобное:
Disk /dev/sda: 5860533168 sectors, 2.7 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): 77D7DEB8-2759-490F-9BA9-7269A5F9247C
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 5860533134
Partitions will be aligned on 2048-sector boundaries
Total free space is 6042 sectors (3.0 MiB)
Number Start (sector) End (sector) Size Code Name
1 2048 8388641 4.0 GiB 0700
2 8390656 16777249 4.0 GiB 0700
3 16779264 5860533134 2.7 TiB 8E00
Нам важны цифры стартового и конечного секторов.
Стираем таблицу разделов на втором и третьем диске:
sgdisk --zap-all /dev/sdb
sgdisk --zap-all /dev/sdc
Устанавливаем туда GPT таблицу разделов:
sgdisk --mbrtogpt --clear /dev/sdb
sgdisk --mbrtogpt --clear /dev/sdc
Создаём таблицу разделов, идентичную таблице первого диска (внимание на цифры, ставим идентичные для соответствующего раздела на исходном диске с установленной системой):
sgdisk --new=1:2048:8388641 /dev/sdb
sgdisk --new=2:8390656:16777249 /dev/sdb
sgdisk --new=3:16779264:5860533134 /dev/sdb
sgdisk --new=2:8390656:16777249 /dev/sdc
sgdisk --new=1:2048:8388641 /dev/sdc
sgdisk --new=3:16779264:5860533134 /dev/sdc
А вот идентификаторы разделов надо заменить. Я делал идентичные исходному диску и убил много время на фикс проблемы что система не хотела запускаться с массива. fd00 идентификатор раздела с raid
sgdisk --typecode=1:fd00 /dev/sdb
sgdisk --typecode=2:fd00 /dev/sdb
sgdisk --typecode=3:fd00 /dev/sdb
sgdisk --typecode=1:fd00 /dev/sdc
sgdisk --typecode=2:fd00 /dev/sdc
sgdisk --typecode=3:fd00 /dev/sdc
Ставим флаги загрузочного раздела
sgdisk /dev/sda --attributes=1:set:2
sgdisk /dev/sdb --attributes=1:set:2
sgdisk /dev/sdc --attributes=1:set:2
Создание raid массивов.
mdadm --stop /dev/md0
mknod /dev/md0 b 9 0
mknod /dev/md1 b 9 1
mknod /dev/md2 b 9 2
mdadm --create /dev/md0 --level=1 --raid-devices=3 missing /dev/sdb1 /dev/sdc1
mdadm --create /dev/md1 --level=1 --raid-devices=3 missing /dev/sdb2 /dev/sdc2
mdadm --create /dev/md2 --level=5 --raid-devices=3 missing /dev/sdb3 /dev/sdc3
mdadm --grow /dev/md0 -b internal
mdadm --grow /dev/md1 -b internal
mdadm --grow /dev/md2 -b internal
В данном случае особое внимание уделю только строкам mdadm --create. Как можно догадаться --level тип массива. На первых двух разделах создаем зеркало. Третьи разделы объединяем в RAID 5. --raid-devices кол-во устройств входящих в массив. missing означает массив в деградированном состоянии и в конце разделы входящие в массив через пробел. Естественно два из трех. Разделы на диске sda добавим в массив после.
Копируем рабочую систему на созданный массив.
Создаем и монтируем файловую систему.
mkfs.ext3 /dev/md0
mount /dev/md0 /mnt
Копируем.
cp -vxpR / /mnt
Заменяем в файле /mnt/etc/fstab имя корня файловой системы на /dev/md0. Просто отредактируйте конфигурационный файл.
Копируем загрузчик на второй и третий диск.
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с
Генерируем новый образ системы.
chroot /mnt
mkinitrd -v -f --theme=/usr/share/splash --without-multipath /boot/initrd-`uname -r`.img `uname -r`
exit
Исправляем конфиг загрузки. Для этого открываем в текстовом редакторе файл /mnt/boot/extlinux.conf и заменяем (root=LABEL=xxx) на root=/dev/md0.
От монтируем все разделы подключенные ранее и перезагружаем систему. Загружаемся теперь не с первого диска, а с любого другого входящего в битый массив.
Добавление первого диска в массив.
Меняем тип разделов и добавляем разделы первого диска к нашему массиву.
sgdisk --typecode=1:fd00 /dev/sda1
sgdisk --typecode=2:fd00 /dev/sda2
sgdisk --typecode=3:fd00 /dev/sda3
mdadm -a /dev/md0 /dev/sda1
mdadm -a /dev/md1 /dev/sda2
mdadm -a /dev/md2 /dev/sda3
После этого автоматически запустится ребилд массива. В зависимости от объема дисков может занять довольно продолжительное время. Наблюдать за состоянием и временем до окончания можно просматривая файл /proc/mdstat Для постоянного мониторинга:
watch -n 1 cat /proc/mdstat
Можно попробовать увеличить скорость ребилда. Гугл вдает много страниц на эту тему. Глубоко не копаясь по этой статье я просто увеличил величину stripe_cache_size и успокоился.
Создание хранилища данных.
Собственно одной командой на устройстве /dev/md2 создается хранилище.
xe sr-create content-type=user type=lvm device-config:device=/dev/md2 shared=false name-label="Local storage"
Все. Система готова к использованию. В итоге мы имеем систему поверх программного массива, не привязанное к конкретному аппаратному контроллеру. Массив можно переместить в другой сервер и быстро поднять работающую систему. Думаю надо будет прописать только новые сетевые карты в системе. Надеюсь тем кто дочитал до конца пригодится подобное руководство.
Автор: Lector15