Man вики
Advertisement


Задача

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



Перенос PROXMOX на RAID1 (Зеркало)

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

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

Подготовительные работы

  • Перед началом работ, не помешает проверить состояние SMART жестких дисков и настроить его контроль. Сервер_NAS_(сетевая_система_хранения_данных)#Мониторинг и уведомления о неисправностях

Затем надо полностью очистить от всех имеющихся данных и разделов второй (добавленный) диск.



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

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

dmesg | egrep 'logical blocks|Direct-Access'

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

df -h | grep '/boot'

Мы должны увидить нечто подобное:



/dev/sda1 504M 34M 445M 8% /boot



Если раздел boot находится не на /dev/sda1, необходимо отключить компьютер и поменять местами sata кабеля подключенные к жестким дискам.



Скопируем структуру разделов с первого диска на второй

sfdisk -d /dev/sda | sfdisk /dev/sdb --force

Сменим тип разделов на fd (Linux raid autodetect)

sfdisk -c /dev/sdb 1 fd --force

sfdisk -c /dev/sdb 2 fd --force

Проверим список разделов

sfdisk -l /dev/sdb



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

  • mdadm - менеджер программного RAID для Linix
  • initramfs -временная файловая система, использующаяся ядром при начальной загрузке

apt-get update

apt-get install -y mdadm initramfs-tools

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



Подключение модуля RAID

modprobe raid1

echo alias md-personality-3 raid1 >> /etc/modprobe.conf

Далее необходимо убедится, что на дисках не осталось суперблоков. Эти блоки являются метками, которые проставляются в конец диска если он являлся частью рейд массива ранее. Часто они не удаляются в процессе форматирования жесткого диска при установке 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



  1. Автоматическое назначение прав на новые массивы

CREATE owner=root group=disk mode=0660 auto=yes



  1. Почтовый адрес для уведомлений о событиях происходящих с массивом

MAILADDR it.khabarovsk@dns-shop.ru



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

mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1

mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb2

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

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

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

cat /etc/mdadm/mdadm.conf



настройка загрузочного меню grub

Добавим загрузочный образ initramfs

mkinitramfs -o /boot/initrd.img-`uname -r`-raid1 -r /dev/mapper/pve-root

Заменим файл загрузочного меню и создадим свой, предварительно сохранив оригинальный

cp /boot/grub/menu.lst /boot/grub/menu.lst.orig

echo "default 0" > /boot/grub/menu.lst

echo "timeout 5" >> /boot/grub/menu.lst

echo "title Proxmox VE on soft-RAID" >> /boot/grub/menu.lst

echo "root (hd0,0)" >> /boot/grub/menu.lst

echo "kernel /vmlinuz-`uname -r` root=/dev/mapper/pve-root ro" >> /boot/grub/menu.lst

echo "initrd /initrd.img-`uname -r`-raid1" >> /boot/grub/menu.lst

Проверим:

cat /boot/grub/menu.lst



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

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

pvcreate /dev/md1

vgextend pve /dev/md1

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

pvmove /dev/sda2 /dev/md1

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

vgreduce pve /dev/sda2



Перенос загрузочных файлов на 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

Настроим параметры подключения системных дисков с учетом загрузки с raid. Пересоздадим конфигурационный файл fstab предварительно сохранив оригинальный.

cp /etc/fstab /etc/fstab.orig

echo "" > /etc/fstab

nano /etc/fstab



/dev/pve/root / ext3 errors=remount-ro 0 1

/dev/pve/data /var/lib/vz ext3 defaults 0 1

/dev/md0 /boot ext3 defaults 0 1

/dev/pve/swap none swap sw 0 0

proc /proc proc defaults 0 0

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

umount /boot

mount /boot

Подключаем первый (исходный) диск в RAID

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

sfdisk -d /dev/sdb | sfdisk /dev/sda --force

Добавим разделы первого диска в RAID

mdadm --add /dev/md0 /dev/sda1

mdadm --add /dev/md1 /dev/sda2

Осталось обновить загрузчик на обоих дисках. Запускаем

grub

И последовательно вводим:

root (hd0,0)

setup (hd0)

root (hd1,0)

setup (hd1)

quit

Проверить в каком состоянии находится массив можно командой:

cat /proc/mdstat



Замена жесткого диска

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

Определение неисправного диска

  • Выясняем какой из жестких дисков "вылетел" из массива

cat /proc/mdstat

видим примерно следующее

md1 : active raid1 sda2[2](F) sdb2[1]

    243665792 blocks [2/1] [_U]


md0 : active raid1 sda1[2](F) sdb1[1]

    530048 blocks [2/1] [_U]




[_U] - Означает что в массиве отсутствует диск (рабочий массив выглядит так [UU]) (F) - означает, что диск дал сбой. В примере вылетел из массива и дал сбой диск sda. Всё дальнейшее описание будет описывать ситуацию с заменой диска sda, при этом рабочим остался диск sdb.



  • Необходимо выяснить, какой из дисков нужно физически отключить. В этом поможет информация о серийных номерах. Например смотрим информацию о модели и серийном номере оставшегося рабочего диска sdb:

udevadm info --query=env --name=sdb | grep -E '(ID_SERIAL_SHORT|ID_MODEL)'



ID_SERIAL_SHORT=9QZCNTNH

Смотрим серийники на наклейках жестких дисков. Соответственно диск с серийным номером 9QZCNTNH оставляем в системе, другой отключаем.



Замена неисправного диска

Выполнять будем горячую замену диска без выключения и перезагрузок сервера.



1. Очистим информацию о диске sda в массивах.

mdadm /dev/md0 --fail /dev/sda1 --remove detached /dev/sda1

mdadm /dev/md1 --fail /dev/sda1 --remove detached /dev/sda1

2. Удаляем диск физически отключив sata шлейф.



3. Подключаем новый жесткий диск (SATA) равного до байта или большего размера на "на горячую".



4. Выполняем сканирование порта, в который подключили жесткий диск.

echo "- - -" >/sys/class/scsi_host/host0/scan

где host0 номер порта.

  • Если нет точной уверенности, в какой именно порт воткнут новый диск, необходимо просканировать все имеющиеся порты. Список портов можно узнать:

ls /sys/class/scsi_host/

5. Смотрим системный журнал, какое имя получил новый жесткий диск в системе:

dmesg | grep "logical blocks"

Ищем последнюю строку, например:

sd 0:0:0:0: [sda] 234439535 512-byte logical blocks: (120 GB/111 GiB)

Значит имя нового диска - sda

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

echo "1" > /sys/block/sdc/device/delete

После чего убедится что имя старого диска /dev/sda отсутствует в описании массива и если это не так выполним очистку как описано выше выше в пунке 1.

cat /proc/mdstat

Затем выполнить сканирование sata портов.



Активация нового диска

Чтобы не ошибиться в дальнейших действиях и не испортить данные создадим переменные с именами дисков.

cleandsk=sda # чистый, пустой диск

workdsk=sdb # Диск, который содержит систему

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

dd if=/dev/$workdsk of=/dev/$cleandsk bs=512 count=34

blockdev --rereadpt /dev/$cleandsk

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

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

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

grub

И последовательно вводим, где 0 это номер диска:

root (hd0,0)

setup (hd0)

quit

Смотрим процесс синхронизации

watch cat /proc/mdstat

Как только процесс завершиться, новый диск станет полноценным участником массива и в случае выхода из строя другого диска, система загрузится с него.

Advertisement