Выполнено по мотивам https://habr.com/post/307234/ , однако - некоторые моменты сделаны более аккуратно. На mdadm RAID переносим рабочую систему с виртуалками на борту. Виртуалки нужно останавливать только на время переноса со старой SR на новую.
Назначение разделов
https://docs.citrix.com/en-us/xenserver/current-release/install/partition-layout.html
На свежеустановленном Xenserver 7.6 диск разбивается на 6 разделов:
sda1 - 18.0 GiB / type ext3 sda2 - 18.0 GiB backup partition sda3 - XenStorage LVM Physycal Volume sda4 - 512.0 MiB /boot/efi type vfat sda5 - 4.0 GiB /var/log type ext3 sda6 - 1.0 GiB swap
Подготовка первого диска массива RAID
Подразумевается, что у нас два одинаковых диска, на /dev/sda установлен Xenserver 7.6. Копируем таблицу разделов с /dev/sda на /dev/sdb.
sgdisk -R /dev/sdb /dev/sda
Делаем прописываем новым разделам тип fd00 и создаем массивы:
sgdisk --typecode=1:fd00 /dev/sdb sgdisk --typecode=2:fd00 /dev/sdb sgdisk --typecode=3:fd00 /dev/sdb sgdisk --typecode=4:fd00 /dev/sdb sgdisk --typecode=5:fd00 /dev/sdb sgdisk --typecode=6:fd00 /dev/sdb yes|mdadm --create /dev/md1 --level=1 --raid-devices=2 --metadata=0.90 /dev/sdb1 missing yes|mdadm --create /dev/md2 --level=1 --raid-devices=2 --metadata=0.90 /dev/sdb2 missing yes|mdadm --create /dev/md3 --level=1 --raid-devices=2 --metadata=0.90 /dev/sdb3 missing yes|mdadm --create /dev/md4 --level=1 --raid-devices=2 --metadata=0.90 /dev/sdb4 missing yes|mdadm --create /dev/md5 --level=1 --raid-devices=2 --metadata=0.90 /dev/sdb5 missing yes|mdadm --create /dev/md6 --level=1 --raid-devices=2 --metadata=0.90 /dev/sdb6 missing
Во избежание путаницы, я нумерую массивы с 1, (а не с 0) - как и разделы.
Копирование системы на массивы RAID
Форматируем разделы:
mkfs.ext3 /dev/md1 mkfs.ext3 /dev/md5 mkswap /dev/md6
Так как утилита mkfs.vfat отсутствует в XenServer 7.6 я просто скопировал раздел EFI с помощью dd:
dd if=/dev/sda4 of=/dev/md4 bs=512
Монтируем новые разделы:
mount /dev/md1 /mnt mkdir -p /mnt/var/log mount /dev/md5 /mnt/var/log
Если в результате выполнеения следующих команд (монтирования /dev/md4) происходит ошибка - вероятно EFI-партиция просто пустая, потому что вы загружаетесь с помощью Legacy BIOS. Не обращаем на это внимания.
mkdir -p /mnt/boot/efi/ mount /dev/md4 /mnt/boot/efi/
Копируем систему:
cp -xR --preserve=all / /mnt
Настраиваем mdadm:
echo "MAILADDR root" > /mnt/etc/mdadm.conf echo "AUTO +imsm +1.x -all" >> /mnt/etc/mdadm.conf echo "DEVICE /dev/sd*[a-z][1-9]" >> /mnt/etc/mdadm.conf mdadm --detail --scan >> /mnt/etc/mdadm.conf cp /mnt/etc/mdadm.conf /etc
Настраиваем fstab:
sed -i 's/LABEL=root-[a-zA-Z\-]*/\/dev\/md1/' /mnt/etc/fstab sed -i 's/LABEL=logs-[a-zA-Z\-]*/\/dev\/md5/' /mnt/etc/fstab sed -i 's/LABEL=swap-[a-zA-Z\-]*/\/dev\/md6/' /mnt/etc/fstab e2label /dev/sda1 |xargs -t e2label /dev/sdb1
Монтируем системыные файловые системы для chroot:
mount --bind /dev /mnt/dev mount --bind /sys /mnt/sys mount --bind /proc /mnt/proc mount --bind /run /mnt/run
И выполняем chroot:
chroot /mnt /bin/bash
Так как я скопировал EFI-раздел с помощью dd, то ставить grub нужды нет. В chroot нужно пересобрать ram-диск dracut.
dracut --mdadmconf --fstab --add="mdraid" --add-drivers="raid1 raid456" --force /boot/initrd-$(uname -r).img $(uname -r) -M
Меняем некоторые параметры grub:
sed -i 's/quiet/rd.auto rd.auto=1 rhgb quiet/' /boot/efi/EFI/xenserver/grub.cfg sed -i 's/LABEL=root-[a-zA-Z\-]*/\/dev\/md1/' /boot/efi/EFI/xenserver/grub.cfg sed -i '/search/ i\ insmod gzio' /boot/efi/EFI/xenserver/grub.cfg sed -i '/search/ i\ insmod part_msdos' /boot/efi/EFI/xenserver/grub.cfg sed -i '/search/ i\ insmod diskfilter mdraid09' /boot/efi/EFI/xenserver/grub.cfg sed -i '/search/ c\ set root=(md/md1)' /boot/efi/EFI/xenserver/grub.cfg
Выходим из chroot и перезагружаемся:
exit reboot
Отключаем первый диск и загружаемся со второго диска (того, который мы уже добавили в RAID). Если что-то пошло не так - можно опять загрузиться с первого и сделать все заново. У меня всё раработало с первого раза.
После загрузки смотрим:
cat /proc/mdstat mount | grep md
И убеждаемся, что мы работаем на RAID.
Добавление второго диска в массивы
Теперь - добавляем в рейд разделы первого диска (за исключением раздела №3), делаем на RAID новую Storage Repository и переносим виртуалки с sda3 на md3.
Чтобы не лазить в биос я просто отключил первый диск на время загрузки, а потом подключил его hot swap'ом, поэтому первый диск (на котором, кстати, живые виртуалки) у меня стал /dev/sdb. Так как таблицы разделов на дисках одинаковые, нам нужно сейчас только поменять типы для свех разделов первого диска, за исключением третьего раздела со Storage Repository.
sgdisk --typecode=1:fd00 /dev/sdb sgdisk --typecode=2:fd00 /dev/sdb sgdisk --typecode=4:fd00 /dev/sdb sgdisk --typecode=5:fd00 /dev/sdb sgdisk --typecode=6:fd00 /dev/sdb
И добавляем эти диски в массивы:
mdadm -a /dev/md1 /dev/sdb1 mdadm -a /dev/md2 /dev/sdb2 mdadm -a /dev/md4 /dev/sdb4 mdadm -a /dev/md5 /dev/sdb5 mdadm -a /dev/md6 /dev/sdb6
Теперь создаем новую Storage Repository на md3.
xe sr-create content-type=user device-config:device=/dev/md3 host-uuid=__HOST_UUID__ name-label="RAID1 Local" shared=false type=lvm
Виртуалки я переношу с помощью XenCenter: VM → Move VM…, Важно понимать, что при таком способе переноса, процессом управляет XenCenter. Процесс двухстадийный. На первой стадии делаются копии дисков, а потом вносятся изменения в конфигурацию VM и удаляются копии на прежней SR. Если при переносе XenCenter закрывается или теряет связь с хостом, то в XenCenter будут ошибки, а задачи с переносом Async.VDI.copy будут видны на хосте в xe task-list состоянии pending.
Эта ситуация может привести в ступор, однако не все так плохо. Состояние задач pending означает лишь, что задача ждет ответа от подсистемы хранения, которая как раз занимается копированием. В результате диски нормально скопируются, но в конфигурации VM будут прописаны старые диски (на прежней SR). Чтобы все было правильно нужно будет удалить диски на новой SR и повторить процесс.
Поэтому - я рекомендую запускать XenCenter из виртуалки, работающей на этом хосте. Таким образом можно избежать проблем со связью между XenCenter и хостом XenServer.
После переезда виртуалок на новую Storage Repository отлючаем от старой SR её pdb(/dev/sda3) и добавляем его в зеркало:
xe pbd-list xe pbd-unplug uuid=~~~pdb_uuid~~~ xe sr-destroy uuid=~~~sr_uuid~~~ sgdisk --typecode=3:fd00 /dev/sda mdadm -a /dev/md3 /dev/sda3
И вытирая слезу радости наблюдаем за перестроением зеркала:
cat /proc/mdstat
Система не загружается, если массив degraded
Если просто физически выдернуть один диск из массива и попытаться загрузиться - система не загрузится. Она скажет:
Started dracut premount hook A start job is running for dev-md1.device
И будет бесконечно тупить. Я пока не нашел что сделать для того, чтобы исправить это. Однако, если диск вышел из строя в процессе работы сервера, то достаточно пометить его как сбойный во всех массивах и система будет загружаться нормально.
mdadm /dev/md1 -f /dev/sdb1 mdadm /dev/md2 -f /dev/sdb2 mdadm /dev/md3 -f /dev/sdb3 mdadm /dev/md4 -f /dev/sdb4 mdadm /dev/md5 -f /dev/sdb4 mdadm /dev/md5 -f /dev/sdb5 mdadm /dev/md6 -f /dev/sdb6
Discussion
mdadm -a /dev/md1 /dev/sdb1
mdadm: Cannot open /dev/sda1: Device or resource busy
mdadm -a /dev/md5 /dev/sdb5
mdadm: Cannot open /dev/sda5: Device or resource busy
Остальные все зацепились, можешь подсказать в чем загвоздка?
Довольно странно. ты добавляешь раздел с диска /dev/sdb, а ругается он на /dev/sda. ну для начала я бы посмотрел не смонтированы ли разделы диска /dev/sda:
и посмотрел бы какие разделы в массивах уже:
Пытаюсь установить xenserver 7.6 по инструкции после перезапуска xen не грузиться пишет first boot kernel загрузки как bios он не видит md в чем могу ошибаться спасибо