пятница, 6 февраля 2015 г.

Настройка Software RAID в Proxmox 3.3


К сожалению, в процессе установки Proxmox нет возможности установить его на программный рейд. Об этом даже упоминается в официальной вики. Оно и понятно, учитывая что основной упор в плане высокой доступности и избыточности Proxmox возлагает на кластеризацию. Однако, когда в нашем распоряжении есть только один сервер с Proxmox, хотелось бы иметь возможность обеспечить избыточность хотя бы на уровне дисков в виде программного рейд-массива.

Итак, мы имеем следующую конфигурацию: 2 идентичных диска - /dev/sda и /dev/sdb, Proxmox 3.3 установлен на sda, второй диск чистый. Мы создадим raid 1 взяв за основу диск sda.

Установим mdadm:
root@proxmox:~# apt-get update
root@proxmox:~# apt-get install mdadm
Посмотрим содержимое диска sda. Начиная с версии 3.2, Proxmox использует таблицу разделов GPT, независимо от того BIOS у нас или UEFI. Для работы с GPT нужны утилиты gdisk/sgdisk:
root@proxmox:~# gdisk -l /dev/sda
GPT fdisk (gdisk) version 0.8.5

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 16777216 sectors, 8.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): 7FC0CE80-7258-4231-8F88-F336FF77C998
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 16777182
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048            4095   1024.0 KiB  EF02  primary
   2            4096         1048575   510.0 MiB   EF00  primary
   3         1048576        16777182   7.5 GiB     8E00  primary
Мы видим, что у нас есть 3 раздела: первый раздел (EF02) - это bios_grub, на котором у нас находится grub, второй раздел (EF00)- /boot раздел с файловой системой ext3, третий раздел (8E00) отдан под lvm. Для нашей задачи нам достаточно сделать два отдельных зеркальных рейда для второго и третьего раздела.

Перенесем таблицу разделов с sda на sdb:
sgdisk -R=/dev/sdb /dev/sda
sgdisk -G /dev/sdb
Первая команда копирует таблицу разделов, а вторая заново генерирует рандомные GUID для диска sdb, чтобы они отличались от диска sda.

Примечание: некоторые авторы советуют помечать разделы  специальным флагом FD, чтобы mdadm смог их автоматически распознать. Однако это действие излишне, поскольку mdadm способен автоматически распознать raid-разделы путем сканирования заголовка разделов на предмет размещения в них суперблоков особого вида.
Теперь создадим 2 зеркала - для разделов /boot и корневого соответственно. Один из дисков для рейда будет sdb, а второй пропущенный ("missing"), который мы позже заменим на sda:
root@[server]:/# mdadm --create boot --level=1 --raid-disks=2 missing /dev/sdb2
root@[server]:/# mdadm --create root --level=1 --raid-disks=2 missing /dev/sdb3
Скопируем раздел /boot с /dev/sda2 на свеже созданный /dev/md/boot:
root@proxmox:~# mkdir /mnt/boot
root@proxmox:~# mkfs.ext3 /dev/md/boot
root@proxmox:~# mount /dev/md/boot /mnt/boot/
root@proxmox:~# cp -ax /boot/* /mnt/boot/
root@proxmox:~# umount /mnt/boot
root@proxmox:~# rmdir /mnt/boot/
 Изменим в /etc/fstab путь монтирования раздела /boot на новый:
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/pve/root / ext3 errors=remount-ro 0 1
/dev/pve/data /var/lib/vz ext3 defaults 0 1
#UUID=b4c01a34-b56b-4d52-8678-02f1b79b16a4 /boot ext3 defaults 0 1
/dev/md/boot /boot ext3 defaults 0 1
/dev/pve/swap none swap sw 0 0
proc /proc proc defaults 0 0
Убедимся, что mdadm у нас автоматически запускается при старте и активирует все найденные массивы. В файле /etc/default/mdadm должно быть следующее:
INITRDSTART='all'
AUTOSTART=true
Перезагружаемся:.
root@proxmox:~# reboot
И проверяем:
root@proxmox:~# mount | egrep boot
/dev/md126 on /boot type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=0,data=ordered)
Добавим нужные модули для grub и initrd:
root@proxmox:~# echo 'GRUB_DISABLE_LINUX_UUID=true' >> /etc/default/grub
root@proxmox:~# echo 'GRUB_PRELOAD_MODULES="raid dmraid"' >> /etc/default/grub
root@proxmox:~# echo raid1 >> /etc/modules
root@proxmox:~# echo raid1 >> /etc/initramfs-tools/modules
Установим загрузчик на оба диска:
root@proxmox:~# grub-install --recheck /dev/sda
root@proxmox:~# grub-install --recheck /dev/sdb
root@proxmox:~# update-grub
root@proxmox:~# update-initramfs -u -k all
Добавим /dev/sda2 в raid:
root@proxmox:~# mdadm --manage /dev/md/boot --add /dev/sda2
Поскольку поверх /dev/sda3 поднят lvm, нам необходимо сделать то же самое на /dev/md/root и клонировать его:
root@proxmox:~# pvcreate /dev/md/root
root@proxmox:~# vgextend pve /dev/md/root
root@proxmox:~# pvmove /dev/sda3 /dev/md/root
В зависимости от объема раздела /dev/sda3 данная процедура может занять определенное время.

После этого мы можем удалить /dev/sda3 из lvm:
root@proxmox:~# vgreduce pve /dev/sda3
root@proxmox:~# pvremove /dev/sda3
Добавляем /dev/sda3 в raid:
root@proxmox:~# mdadm --manage /dev/md/root --add /dev/sda3
Статус синхронизации дисков в raid можно посмотреть следующей командой:
root@proxmox:~# cat /proc/mdstat
По ее завершению мы получим работающий Proxmox в софт-рейде!

За основу взята следующая статья:
http://blog.synyx.de/2015/01/running-proxmox-ve-3-3-on-a-software-raid/