Man вики
Advertisement

Актуально для версии Proxmox 4 и выше, в том числе для дисков больше 2Тб с gpt разметкой.

  • Proxmox должен быть установлен с параметрами по умолчанию, а конкретно использовать ext4 и lvm. При установке на ZFS данная инструкция не применима!
  • Установку необходимо выполнять не через UEFI иначе загрузчик в конце процедуры установить не удастся!

Задача[]

  • Необходимо создать надежную отказоустойчивую дисковую систему. При выходе из строя любого жесткого диска, система должна продолжить работу
  • Перенос на RAID должен происходить без прерывания работы системы и без потери данных
  • Необходимо использовать средства, не требующие привязки к оборудованию, т.е. без использования как встроенных так и внешних RAID контроллеров
  • Необходимо обеспечить систему надежными средствами уведомления о сбоях дисков для оперативной замены
  • Замена жестких дисков должна производиться без прерывания работы в "горячем" режиме.

Перенос PROXMOX4.x на RAID1 (Зеркало)[]

Принцип работы[]

  • Добавляем в систему жесткий диск идентичный по размеру. Если диски не равны по размеру, установку надо выполнить на меньший.
  • Создаем на нем 3 раздела (под bios загрузчик, под загрузочный раздел и под данные)
  • Создаем 2 зеркальных рейд массива в degrade (разрушенном) состоянии (это когда массив который должен состоять из 2-х дисков, а состоит всего из одного.
  • Переносим всё (загрузочный раздел и раздел с данными) с первого диска на рейд массивы второго диска
  • Уничтожаем данные и структуру разделов на первом диске и подключаем его в качестве не хватающего диска в уже созданный рейд массив
  • Делаем оба диска загрузочными

Загрузка и установка компонентов[]

Перед установкой компонентов, если нет официальной подписки на промышленный репозиторий proxmox-а, нужно добавить текущий не стабильный:

nano /etc/apt/sources.list.d/pve-enterprise.list

заменяем в строке

deb https://enterprise.proxmox.com/debian jessie pve-enterprise

на

deb http://download.proxmox.com/debian jessie pve-no-subscription
  • mdadm - менеджер программного RAID для Linix
  • initramfs -временная файловая система, использующаяся ядром при начальной загрузке
apt-get update
apt-get install -y mdadm initramfs-tools parted

Создание новой структуры разделов на втором диске[]

Посмотрим список обнаруженных в системе физических дисков:

dmesg | egrep 'logical blocks|Direct-Access'

Убедимся, что система загружается с первого жесткого диска /dev/sda

pvs

Видим нечто подобное:

 PV         VG   Fmt  Attr PSize  PFree
 /dev/sda3  pve  lvm2 a--  31.87g 3.87g
  • Если раздел lvm том pve находится не на /dev/sda3, необходимо отключить компьютер и поменять местами sata кабеля подключенные к жестким дискам.

Разметим второй жесткий диск таким образом, чтобы разделы на нем суммарно не превысил размер исходного диска, иначе исходный диск не удастся включить в массив на последнем этапе.

Определение размеров дисков (системного и нового)[]

Задаем диски, который будем готовить под RAID

workdsk=sda # Системный
newdsk=sdb  # Новый (дополнительный) диск, на который будем копировать данные

Определим размеры и создадим переменные с размерами разделов. Можно их откорректировать на этом этапе при необходимости.

sizedsk_work=`parted /dev/$workdsk print -m | grep "/dev/$workdsk" | awk -F ":" '{print $2}'`
sizedsk_new=`parted /dev/$newdsk print -m | grep "/dev/$newdsk" | awk -F ":" '{print $2}'`
echo ""
echo "Активный системный:" $sizedsk_work ", Новый пустой:" $sizedsk_new

Создание разметки под RAID[]

Очищаем таблицу разделов на указанном жестком диске и размечаем диск в GPT.

dd if=/dev/zero of=/dev/$newdsk bs=512 count=1
parted /dev/$newdsk mklabel gpt

Создаем на новом диске разделы таким образом, чтобы в сумме они не превысили размер исходного (системного) диска.

parted /dev/$newdsk mkpart primary 1M 10M
parted /dev/$newdsk set 1 bios_grub on
parted /dev/$newdsk mkpart primary 10М 1G
parted /dev/$newdsk mkpart primary 1G $sizedsk_work
parted /dev/$newdsk print


Все параметры по умолчанию

Далее необходимо убедится, что на дисках не осталось суперблоков. Эти блоки являются метками, которые проставляются в конец диска если он являлся частью рейд массива ранее. Часто они не удаляются в процессе форматирования жесткого диска при установке PROXMOX и их нужно затереть вручную!

  • Проверяем, нет ли суперблоков
mdadm --misc --examine /dev/sda
mdadm --misc --examine /dev/sdb
mdadm --misc --examine /dev/sdb1
mdadm --misc --examine /dev/sdb2

Если все в порядке и суперблоков нет, то увидим нечто подобное:

mdadm: No md superblock detected on /dev/sdb

Если есть, то перед продолжением настройки их необходимо удалить! Удаление суперблоков

Настройка параметров mdadm[]

Создадим файл настроек, предварительно сохранив оригинальный.

Укажем права на массивы и почтовый адрес для уведомлений о событиях происходящих с массивом

cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.orig
echo "" > /etc/mdadm/mdadm.conf
nano /etc/mdadm/mdadm.conf
CREATE owner=root group=disk mode=0660 auto=yes
MAILADDR user@mail.domain

Предварительная настройка RAID в режиме деградации[]

mdadm --create /dev/md0 --metadata=0.90 --level=1 --raid-devices=2 missing /dev/${newdsk}2
mdadm --create /dev/md1 --metadata=0.90 --level=1 --raid-devices=2 missing /dev/${newdsk}3

Если все впорядке и массивы создались, сохраним параметры массива в конфигурационном файле:

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

Проверим, что информация о наших массивах записалась в файл параметров

cat /etc/mdadm/mdadm.conf

Перенос данных из LVM на второй диск[]

Создаем LVM-раздел на втором диске и добавляем его в группу pve

pvcreate /dev/md1 -ff
vgextend pve /dev/md1

Переместим данные с LVM-раздела первого диска, на RAID-LVM-раздел второго диска. Процедура может продолжаться очень долго. Время зависит от объема и скорости жестких дисков.

pvmove /dev/${workdsk}3 /dev/md1

Убираем из LVM первый диск

vgreduce pve /dev/${workdsk}3

Перенос загрузочных файлов на RAID[]

Подготовим загрузочный RAID-раздел второго диска и скопируем на него все файлы из папки /boot первого диска

mkfs.ext3 /dev/md0
mkdir /mnt/md0
mount /dev/md0 /mnt/md0
cp -ax /boot/* /mnt/md0
umount /mnt/md0
rmdir /mnt/md0

Добавим монтирование загрузочного раздела.

  • Определим UUID идентификатор раздела
blkid |grep md0

Видим похожее: /dev/md0: UUID="b20e584b-88ab-4262-ba9d-7e1a2523ff95" SEC_TYPE="ext2" TYPE="ext3" Добавляем в конец файла строку со своим UUID

nano /etc/fstab
UUID="b20e584b-88ab-4262-ba9d-7e1a2523ff95" /boot ext3 defaults 0 1

Премонтируем загрузочный раздел с raid тома

mount /boot

Разрешим системе автоматически запускаться, если один из дисков вышел из строя или отсутствует (по умолчанию при загрузке будет выдаваться запрос на разрешение запуска)

echo "BOOT_DEGRADED=true" > /etc/initramfs-tools/conf.d/mdadm

Настроим загрузку

mkinitramfs -o /boot/initrd.img-`uname -r`

Отключим графический режим загрузчика из-за которого система может не загружаться с рейда.

echo "GRUB_TERMINAL=console" >> /etc/default/grub

Установим загрузчик на новый диск

grub-install /dev/sdb

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

Добавление диска в RAID[]

Диск который будет добавляться в массив, на данном этапе не должен быть быть членом рейда. Проверим, какой диск в рейде:

cat /proc/mdstat|grep md0|grep -Po "raid1 ..."

Видим подобное

raid1 sdb

Значит система находится на диске sdb

Горячее добавление диска[]

  • Если диски не заменялись на включенной системе, этот этап пропускаем

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

Если не известно, в какой конкретно порт подключен носитель, то можно пересканировать все.
  • Список имеющихся портов
ls /sys/class/scsi_host/
  • Пример пересканирования порта host3
echo "- - -" > /sys/class/scsi_host/host3/scan
  • Если новый диск физически при подключении получил другое имя например sdc, надо отключить его программно выполнив:
echo "1" > /sys/block/sdc/device/delete

Копирование структуры разделов и расширение массива на пустой диск[]

  • Чтобы не ошибиться в дальнейших действиях и не испортить данные создадим переменные с именами дисков.
workdsk=sdb  # Диск, который подключен к массиву и содержит систему
cleandsk=sda # чистый (пустой) диск, который будет добавлен

Произведем копирование структуры разделов с рабочего на чистый диск и подключим его к массиву

sgdisk /dev/${workdsk} -R=/dev/${cleandsk}
sgdisk -G /dev/${workdsk}

Подключаем разделы с нового диска к массивам

mdadm --add /dev/md0 /dev/${cleandsk}2
mdadm --add /dev/md1 /dev/${cleandsk}3

Установим загрузчик на добавленный диск[]

Перед установкой загрузчика на новый диск, нужно убедиться, что массив md0 с загрузочным разделом уже синхронизировался в массиве (Состояние [UU])

cat /proc/mdstat

И только в этом случае устанавливаем загрузчик

grub-install /dev/$cleandsk

На этом действия по переносу системы на рейд массив завершены, осталось дождаться окончания синхронизации массива. Контролировать процесс в реальном времени можно с помощью команды:

watch cat /proc/mdstat
  • Если это первая, экспериментальная попытка, то для неплохо проверить работу путем поочередной загрузки системы то с первого диска, то со второго путем их поочередного отключения. После этого эксперимента массив автоматически не соберется и один из дисков нужно будет востановить по схеме добавления диска в RAID.
Advertisement