вторник, 4 октября 2011 г.

XenServer и LinuxRaid level 1


Материал основан на двух англоязычных статьях:
Я всего лишь постараюсь собрать инструкцию, проверенную на практике, но на родном языке.

Исходные данные:
Сервер, два винчестера одинаковой модели емкостью 500Gb.

Задача:
Поднять на сервере XenServer, но таким образом, чтобы система работала на LinuxRaid уровня 1, настроенном на вышеупомянутых винтах.

Инструкция:
В качестве небольшого предисловия добавлю, что все попытки поставить XenServer на software raid, предоставляемый некоторыми материнскими платами, провалились. Даже при настройке в BIOS оного "девайса", XenServer при установке не видит Raid, а видит отдельные диски-устройства.
Далее, XenServer сам по себе не поддерживает загрузку с LinuxRaid и не предлагает, как, например, Debian при установке, ничего похожего. Но есть возможность "сконвертировать" файловую систему и "перебросить" на нее уже установленный XenServer.
Дело в том, что несмотря на отсутствие встроенной возможности использовать LinuxRaid, в системе после установки есть все необходимые компоненты для его использования. Необходимо только правильно ими воспользоваться......

Итак, будем считать, что в сервер вставлены оба винчестера, первый - загрузочный, дистрибутив XenServer установлен в опт.привод, инсталлятор запущен и отработан, установленная система загрузилась и показала свою синюшную консоль, дистрибутив из привода извлечен.
Далее можно действовать либо с удаленной консоли, либо с родной.
В системе теперь два жестких диска - sda с системой, и sdb - пустой.

Смотрим, что у нас с разделами на sda:
# fdisk -l /dev/sda
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1   *           1         499     4008186   83  Linux
/dev/sda2             500         998     4008217+  83  Linux
/dev/sda3             999       60801   480367597+  83  Linux

В первую очередь необходимо создать точно такую же схему разделов на sdb:
# sfdisk -d /dev/sda | sfdisk /dev/sdb
Здесь внимательно посмотрите на вывод: возможно потребуется добавить ключ "--force".

Проверяем, результат должен быть таким:
# fdisk -l /dev/sdb
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1   *           1         499     4008186   83  Linux
/dev/sdb2             500         998     4008217+  83  Linux
/dev/sdb3             999       60801   480367597+  83  Linux

Меняем тип разделов sdb на "Linux raid autodetect". Так как наиболее удобная для этого утилита cfdisk в системе отсутствует, используем нетривиальный метод:
# echo -e "\nt\n1\nfd\nt\n2\nfd\nt\n3\nfd\nw\nx" | fdisk /dev/sdb

Результат:
# fdisk -l /dev/sdb
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1         499     4008186   fd  Linux raid autodetect
/dev/sdb2             500         998     4008217+  fd  Linux raid autodetect
/dev/sdb3             999       60801   480367597+  fd  Linux raid autodetect

Для чистоты исполнения этого этапа необходимо перегрузиться, чтобы система перечитала и проинициализировала вновь созданную структуру sdb:
# reboot

Следующий этап: подготовка sdb для использования в будущем Raid-массиве.
Создадим три Raid устройства, но с указанием пропущенных девайсов:
# mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sdb3 missing  
# mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing
# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb2 missing 
Таким образом, рейд создан, но только с участием sdb.

Теперь прежде всего копируем данные Xen Storage Manager на созданный Raid. 

ВНИМАТЕЛЬНО: далее "VG_XenStorage-3e954146-82c7-03df-3dd5-0a5464842579" - это uuid существующего в системе хранилища, но на каждой системе он свой. Используемый в вашей системе uuid необходимо предварительно определить с помощью команды "pvscan", а затем вставить в соответствующие команды, указанные ниже.

Создаем новое устройство в хранилище.
# pvcreate /dev/md2

Расширяем
на него хранилище.
# vgextend VG_XenStorage-3e954146-82c7-03df-3dd5-0a5464842579 /dev/md2

Копируем данные хранилища на новое устройство.
# pvmove /dev/sda3 /dev/md2
Эта операция займет некоторое время, после чего останется еще пара команд.

Сужаем пространство хранилища за счет исходного раздела.
# vgreduce VG_XenStorage-3e954146-82c7-03df-3dd5-0a5464842579 /dev/sda3

Удаляем из хранилища исходное устройство.
# pvremove /dev/sda3

Монтируем /dev/md0 и копируем на него файлы системы с исходного раздела:
# mkfs.ext3 /dev/md0
# mount /dev/md0 /mnt
# cd /
# cp -axv . /mnt

Следующий этап: настраиваем процесс загрузки с Raid.

Придется редактировать несколько файлов, для чего используем редактор vi. Надеюсь, что трудностей не возникнет, так как по командам редактора в Интернете достаточно информации.

Итак, во-первых, редактируем /mnt/etc/fstab таким образом, чтобы система монтировала корень с /dev/md0. Для этого заменяем в файле строку "LABEL=/-main" на "/dev/md0", чтобы получилось нечто подобное:
# cat /mnt/etc/fstab
/dev/md0 / ext3 defaults 1 1
/var/swap/swap.001          swap      swap   defaults   0  0
none        /dev/pts  devpts defaults   0  0
none        /dev/shm  tmpfs  defaults   0  0
none        /proc     proc   defaults   0  0
none        /sys      sysfs  defaults   0  0

Создаем образ загрузки и распаковываем его:
# 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

Теперь необходимо внедрить необходимые raid-устройства в загрузку:
# vi init

Тут сразу после строки "echo Scanning and configuring dmraid supported devices" нужно добавить: 
raidautorun /dev/md1
raidautorun /dev/md2

В результате эта часть файла должна выглядеть примерно так:
.
.
.
stabilized --hash --interval 250 /proc/scsi/scsi
mkblkdevs
echo Scanning and configuring dmraid supported devices
raidautorun /dev/md0
raidautorun /dev/md1
raidautorun /dev/md2
resume /var/swap/swap.001
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro /dev/md0
echo Mounting root filesystem.
.
.
.

Копируем новый ram-диск в /mnt/boot и модифицируем меню загрузки:
# find . -print | cpio -o -Hnewc | gzip -c > /mnt/boot/initrd-`uname -r`-raid.img
# rm /mnt/boot/initrd-2.6-xen.img
rm: remove symbolic link `/mnt/boot/initrd-2.6-xen.img’? y
# ln -s initrd-`uname -r`-raid.img /mnt/boot/initrd-2.6-xen.img


# vi /mnt/boot/extlinux.conf

Тут необходимо заменить все вхождения строки "root=LABEL=root-xyz" на "root=/dev/md0", то есть модификацию надо сделать в каждом пункте меню.
Осталось назначить в качестве MBR диск /dev/sdb.
Так как Since XenServer до сих пор использует extlinux вместо GRUB, это нетрудно. Достаточно просто изменить опции bootloader:
# cat /usr/lib/syslinux/mbr.bin > /dev/sdb
# cd /mnt
# extlinux -i boot/

Отцепляем /dev/md0 от временной точки монтирования:
# cd
# umount /dev/md0
# sync

Теперь нужно перегрузиться.

!!! Внимательно: тут перезагрузку нужно выполнить со ВТОРОГО ж.диска, изменив очередь загрузки в BIOS.
Если все было сделано правильно, то система должна загрузиться уже с raid-массива и точка монтирования «/» будет находиться на /dev/md0.

# reboot

Итак, после перезагрузки мы имеем все еще рабочую систему, но уже загруженную с настроенного raid-массива. Осталось теперь подготовить sda для использования в raid и подключить туда его разделы в качестве недостающих устройств.
Изменяем тип файловых разделов sda на «Linus raid autodetect»:
# echo -e "\nt\n1\nfd\nt\n2\nfd\nt\n3\nfd\nw\nx" | fdisk /dev/sda

Результат:
# fdisk -l /dev/sda
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         499     4008186   fd  Linux raid autodetect
/dev/sda2             500         998     4008217+  fd  Linux raid autodetect
/dev/sda3             999       60801   480367597+  fd  Linux raid autodetect

Подключаем недостающие разделы в Raid:
# mdadm -a /dev/md0 /dev/sda1
mdadm: hot added /dev/sda1
# mdadm -a /dev/md1 /dev/sda2
mdadm: hot added /dev/sda2
# mdadm -a /dev/md2 /dev/sda3
mdadm: hot added /dev/sda3

После этого начинается долгий, но приятный процесс синхронизации разделов Raid1, за которым можно проследить:
# watch cat /proc/mdstat

Дожидаемся окончания процесса, и остается еще два важных действия, которые обеспечат правильную работу системы с рейдом.

Копируем конфигурацию запущенного рейда в /etc/mdadm.conf:
# mdadm --detail --scan >> /etc/mdadm.conf

Редактируем /etc/mdadm.conf так, чтобы вначале файла обязательно присутствувала строка «DEVICE partitions». Это необходимо для корректной инициализации дисков при загрузке компонентов рейда.

На этом занавес можно закрывать и распускать зал... :)

Комментариев нет:

Отправить комментарий