Man вики
(Новая страница: « =Задача= * Необходимо создать надежную отказоустойчивую дисковую систему. При выходе из ...»)
 
 
Строка 1: Строка 1:
 
 
 
 
=Задача=
 
=Задача=
 
 
* Необходимо создать надежную отказоустойчивую дисковую систему. При выходе из строя любого жесткого диска, система должна продолжить работу
 
* Необходимо создать надежную отказоустойчивую дисковую систему. При выходе из строя любого жесткого диска, система должна продолжить работу
 
 
* Перенос на RAID должен происходить без прерывания работы системы и без потери данных
 
* Перенос на RAID должен происходить без прерывания работы системы и без потери данных
 
 
* Необходимо использовать средства, не требующие привязки к оборудованию, т.е. без использования как встроенных так и внешних RAID контроллеров
 
* Необходимо использовать средства, не требующие привязки к оборудованию, т.е. без использования как встроенных так и внешних RAID контроллеров
 
 
* Необходимо обеспечить систему надежными средствами уведомления о сбоях дисков для оперативной замены
 
* Необходимо обеспечить систему надежными средствами уведомления о сбоях дисков для оперативной замены
 
 
* Замена жестких дисков должна производиться без прерывания работы в "горячем" режиме.
 
* Замена жестких дисков должна производиться без прерывания работы в "горячем" режиме.
 
 
 
   
 
=Перенос PROXMOX на RAID1 (Зеркало)=
 
=Перенос PROXMOX на RAID1 (Зеркало)=
 
 
==Принцип работы==
 
==Принцип работы==
 
 
* Добавляем в систему жесткий диск идентичный по размеру (до сектора) в идеале той-же модели, что и исходный
 
* Добавляем в систему жесткий диск идентичный по размеру (до сектора) в идеале той-же модели, что и исходный
 
 
* Создаем на нем 2 раздела (под загрузку и под данные)
 
* Создаем на нем 2 раздела (под загрузку и под данные)
 
 
* Создаем 2 зеркальных рейд массива в degrade (разрушенном) состоянии (это когда массив который должен состоять из 2-х дисков, а состоит всего из одного.
 
* Создаем 2 зеркальных рейд массива в degrade (разрушенном) состоянии (это когда массив который должен состоять из 2-х дисков, а состоит всего из одного.
 
 
* Переносим всё (загрузочный раздел и раздел с данными) с первого диска на рейд массивы второго диска
 
* Переносим всё (загрузочный раздел и раздел с данными) с первого диска на рейд массивы второго диска
 
 
* Уничтожаем данные и структуру разделов на первом диске и подключаем его в качестве не хватающего диска в уже созданный рейд массив
 
* Уничтожаем данные и структуру разделов на первом диске и подключаем его в качестве не хватающего диска в уже созданный рейд массив
 
 
* Делаем оба диска загрузочными
 
* Делаем оба диска загрузочными
 
 
==Подготовительные работы==
 
==Подготовительные работы==
 
 
*Перед началом работ, не помешает проверить состояние SMART жестких дисков и настроить его контроль. [[Сервер_NAS_(сетевая_система_хранения_данных)#Мониторинг и уведомления о неисправностях]]
 
*Перед началом работ, не помешает проверить состояние SMART жестких дисков и настроить его контроль. [[Сервер_NAS_(сетевая_система_хранения_данных)#Мониторинг и уведомления о неисправностях]]
 
 
Затем надо полностью очистить от всех имеющихся данных и разделов второй (добавленный) диск.
 
Затем надо полностью очистить от всех имеющихся данных и разделов второй (добавленный) диск.
 
 
 
   
 
==Создание новой структуры разделов на втором диске==
 
==Создание новой структуры разделов на втором диске==
 
 
Посмотрим список обнаруженных в системе физических дисков:
 
Посмотрим список обнаруженных в системе физических дисков:
  +
dmesg | egrep 'logical blocks|Direct-Access'
 
dmesg | egrep 'logical blocks|Direct-Access'
 
 
 
Убедимся, что система загружается с первого жесткого диска /dev/sda
 
Убедимся, что система загружается с первого жесткого диска /dev/sda
  +
df -h | grep '/boot'
 
df -h | grep '/boot'
 
 
 
Мы должны увидить нечто подобное:
 
Мы должны увидить нечто подобное:
 
 
 
   
 
<code>'''/dev/sda1 504M 34M 445M 8% /boot'''</code>
 
<code>'''/dev/sda1 504M 34M 445M 8% /boot'''</code>
 
 
 
   
 
Если раздел boot находится не на /dev/sda1, необходимо отключить компьютер и поменять местами sata кабеля подключенные к жестким дискам.
 
Если раздел boot находится не на /dev/sda1, необходимо отключить компьютер и поменять местами sata кабеля подключенные к жестким дискам.
 
 
 
   
 
Скопируем структуру разделов с первого диска на второй
 
Скопируем структуру разделов с первого диска на второй
  +
sfdisk -d /dev/sda | sfdisk /dev/sdb --force
 
sfdisk -d /dev/sda | sfdisk /dev/sdb --force
 
 
 
Сменим тип разделов на fd (Linux raid autodetect)
 
Сменим тип разделов на fd (Linux raid autodetect)
  +
sfdisk -c /dev/sdb 1 fd --force
 
sfdisk -c /dev/sdb 1 fd --force
+
sfdisk -c /dev/sdb 2 fd --force
 
sfdisk -c /dev/sdb 2 fd --force
 
 
 
Проверим список разделов
 
Проверим список разделов
  +
sfdisk -l /dev/sdb
 
sfdisk -l /dev/sdb
 
 
 
 
   
 
==Загрузка и установка компонентов==
 
==Загрузка и установка компонентов==
 
 
* mdadm - менеджер программного RAID для Linix
 
* mdadm - менеджер программного RAID для Linix
 
 
* initramfs -временная файловая система, использующаяся ядром при начальной загрузке
 
* initramfs -временная файловая система, использующаяся ядром при начальной загрузке
  +
apt-get update
 
  +
apt-get install -y mdadm initramfs-tools
apt-get update
 
 
apt-get install -y mdadm initramfs-tools
 
 
 
Все параметры по умолчанию
 
Все параметры по умолчанию
 
 
 
   
 
==Подключение модуля RAID==
 
==Подключение модуля RAID==
  +
modprobe raid1
 
  +
echo alias md-personality-3 raid1 >> /etc/modprobe.conf
modprobe raid1
 
 
echo alias md-personality-3 raid1 >> /etc/modprobe.conf
 
 
 
Далее необходимо убедится, что на дисках не осталось суперблоков. Эти блоки являются метками, которые проставляются в конец диска если он являлся частью рейд массива ранее. Часто они не удаляются в процессе форматирования жесткого диска при установке PROXMOX и их нужно затереть вручную!
 
Далее необходимо убедится, что на дисках не осталось суперблоков. Эти блоки являются метками, которые проставляются в конец диска если он являлся частью рейд массива ранее. Часто они не удаляются в процессе форматирования жесткого диска при установке PROXMOX и их нужно затереть вручную!
 
 
* Проверяем, нет ли суперблоков
 
* Проверяем, нет ли суперблоков
  +
mdadm --misc --examine /dev/sda
 
mdadm --misc --examine /dev/sda
+
mdadm --misc --examine /dev/sdb
  +
mdadm --misc --examine /dev/sdb1
 
mdadm --misc --examine /dev/sdb
+
mdadm --misc --examine /dev/sdb2
 
mdadm --misc --examine /dev/sdb1
 
 
mdadm --misc --examine /dev/sdb2
 
 
 
Если все в порядке и суперблоков нет, то увидим нечто подобное:
 
Если все в порядке и суперблоков нет, то увидим нечто подобное:
  +
mdadm: No md superblock detected on /dev/sdb
 
mdadm: No md superblock detected on /dev/sdb
 
 
 
Если есть, то перед продолжением настройки их необходимо удалить! [[Удаление суперблоков]]
 
Если есть, то перед продолжением настройки их необходимо удалить! [[Удаление суперблоков]]
 
 
 
   
 
Настроем почтовую подсистему и параметры локали [[Отправка почты]]
 
Настроем почтовую подсистему и параметры локали [[Отправка почты]]
 
 
==Настройка параметров mdadm==
 
==Настройка параметров mdadm==
 
 
Создадим файл настроек, предварительно сохранив оригинальный
 
Создадим файл настроек, предварительно сохранив оригинальный
  +
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.orig
  +
echo "" > /etc/mdadm/mdadm.conf
  +
nano /etc/mdadm/mdadm.conf
   
  +
# Автоматическое назначение прав на новые массивы
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.orig
 
  +
CREATE owner=root group=disk mode=0660 auto=yes
 
  +
echo "" > /etc/mdadm/mdadm.conf
 
  +
# Почтовый адрес для уведомлений о событиях происходящих с массивом
 
  +
MAILADDR it.khabarovsk@dns-shop.ru
nano /etc/mdadm/mdadm.conf
 
 
 
 
 
# Автоматическое назначение прав на новые массивы
 
 
CREATE owner=root group=disk mode=0660 auto=yes
 
 
 
 
 
# Почтовый адрес для уведомлений о событиях происходящих с массивом
 
 
MAILADDR it.khabarovsk@dns-shop.ru
 
 
 
 
   
 
==Предварительная настройка RAID в режиме деградации==
 
==Предварительная настройка RAID в режиме деградации==
  +
mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1
 
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 --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb2
 
 
 
Если все впорядке и массивы создались, сохраним параметры массива в конфигурационном файле:
 
Если все впорядке и массивы создались, сохраним параметры массива в конфигурационном файле:
  +
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
 
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
 
 
 
Проверим, что информация о наших массивах записалась в файл параметров
 
Проверим, что информация о наших массивах записалась в файл параметров
  +
cat /etc/mdadm/mdadm.conf
 
cat /etc/mdadm/mdadm.conf
 
 
 
 
   
 
==настройка загрузочного меню grub==
 
==настройка загрузочного меню grub==
 
 
Добавим загрузочный образ initramfs
 
Добавим загрузочный образ initramfs
  +
mkinitramfs -o /boot/initrd.img-`uname -r`-raid1 -r /dev/mapper/pve-root
 
mkinitramfs -o /boot/initrd.img-`uname -r`-raid1 -r /dev/mapper/pve-root
 
 
 
Заменим файл загрузочного меню и создадим свой, предварительно сохранив оригинальный
 
Заменим файл загрузочного меню и создадим свой, предварительно сохранив оригинальный
  +
cp /boot/grub/menu.lst /boot/grub/menu.lst.orig
 
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 "default 0" > /boot/grub/menu.lst
+
echo "title Proxmox VE on soft-RAID" >> /boot/grub/menu.lst
  +
echo "root (hd0,0)" >> /boot/grub/menu.lst
 
echo "timeout 5" >> /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
 
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
 
cat /boot/grub/menu.lst
 
 
 
 
   
 
==Перенос данных из LVM на второй диск==
 
==Перенос данных из LVM на второй диск==
 
 
Создаем LVM-раздел на втором диске и добавляем его в группу pve
 
Создаем LVM-раздел на втором диске и добавляем его в группу pve
  +
pvcreate /dev/md1
 
pvcreate /dev/md1
+
vgextend pve /dev/md1
 
vgextend pve /dev/md1
 
 
 
Переместим данные с LVM-раздела первого диска, на RAID-LVM-раздел второго диска. Процедура может продолжаться очень долго. Время зависит от объема и скорости жестких дисков.
 
Переместим данные с LVM-раздела первого диска, на RAID-LVM-раздел второго диска. Процедура может продолжаться очень долго. Время зависит от объема и скорости жестких дисков.
  +
pvmove /dev/sda2 /dev/md1
 
pvmove /dev/sda2 /dev/md1
 
 
 
Убираем из LVM первый диск
 
Убираем из LVM первый диск
  +
vgreduce pve /dev/sda2
 
vgreduce pve /dev/sda2
 
 
 
 
   
 
==Перенос загрузочных файлов на RAID==
 
==Перенос загрузочных файлов на RAID==
 
 
Подготовим загрузочный RAID-раздел второго диска и скопируем на него все файлы из папки /boot первого диска
 
Подготовим загрузочный RAID-раздел второго диска и скопируем на него все файлы из папки /boot первого диска
  +
mkfs.ext3 /dev/md0
 
mkfs.ext3 /dev/md0
+
mkdir /mnt/md0
  +
mount /dev/md0 /mnt/md0
 
mkdir /mnt/md0
+
cp -ax /boot/* /mnt/md0
  +
umount /mnt/md0
 
mount /dev/md0 /mnt/md0
+
rmdir /mnt/md0
 
cp -ax /boot/* /mnt/md0
 
 
umount /mnt/md0
 
 
rmdir /mnt/md0
 
 
 
Настроим параметры подключения системных дисков с учетом загрузки с raid. Пересоздадим конфигурационный файл fstab предварительно сохранив оригинальный.
 
Настроим параметры подключения системных дисков с учетом загрузки с raid. Пересоздадим конфигурационный файл fstab предварительно сохранив оригинальный.
  +
cp /etc/fstab /etc/fstab.orig
  +
echo "" > /etc/fstab
  +
nano /etc/fstab
   
  +
/dev/pve/root / ext3 errors=remount-ro 0 1
cp /etc/fstab /etc/fstab.orig
 
  +
/dev/pve/data /var/lib/vz ext3 defaults 0 1
 
  +
/dev/md0 /boot ext3 defaults 0 1
echo "" > /etc/fstab
 
  +
/dev/pve/swap none swap sw 0 0
 
  +
proc /proc proc defaults 0 0
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
 
umount /boot
+
mount /boot
 
mount /boot
 
 
 
==Подключаем первый (исходный) диск в RAID==
 
==Подключаем первый (исходный) диск в RAID==
 
 
Копируем структуру разделов со второго диска на первый
 
Копируем структуру разделов со второго диска на первый
  +
sfdisk -d /dev/sdb | sfdisk /dev/sda --force
 
sfdisk -d /dev/sdb | sfdisk /dev/sda --force
 
 
 
Добавим разделы первого диска в RAID
 
Добавим разделы первого диска в RAID
  +
mdadm --add /dev/md0 /dev/sda1
 
mdadm --add /dev/md0 /dev/sda1
+
mdadm --add /dev/md1 /dev/sda2
 
mdadm --add /dev/md1 /dev/sda2
 
 
 
Осталось обновить загрузчик на обоих дисках. Запускаем
 
Осталось обновить загрузчик на обоих дисках. Запускаем
  +
grub
 
grub
 
 
 
И последовательно вводим:
 
И последовательно вводим:
  +
root (hd0,0)
 
root (hd0,0)
+
setup (hd0)
  +
root (hd1,0)
 
setup (hd0)
+
setup (hd1)
  +
quit
 
root (hd1,0)
 
 
setup (hd1)
 
 
quit
 
 
 
Проверить в каком состоянии находится массив можно командой:
 
Проверить в каком состоянии находится массив можно командой:
  +
cat /proc/mdstat
 
cat /proc/mdstat
 
 
 
 
   
 
=Замена жесткого диска=
 
=Замена жесткого диска=
 
 
Смысл резервирования дисковой системы заключается не в факте самого наличия резервирования, а в возможности в случае возникновения неисправности любого из жестких дисков оперативно и без риска для данных его заменить. В этом должны помочь своевременные уведомления на почту и четкая инструкция по замене неисправного диска с восстановлением избыточности.
 
Смысл резервирования дисковой системы заключается не в факте самого наличия резервирования, а в возможности в случае возникновения неисправности любого из жестких дисков оперативно и без риска для данных его заменить. В этом должны помочь своевременные уведомления на почту и четкая инструкция по замене неисправного диска с восстановлением избыточности.
 
 
==Определение неисправного диска==
 
==Определение неисправного диска==
 
 
* Выясняем какой из жестких дисков "вылетел" из массива
 
* Выясняем какой из жестких дисков "вылетел" из массива
  +
cat /proc/mdstat
 
cat /proc/mdstat
 
 
 
видим примерно следующее
 
видим примерно следующее
  +
md1 : active raid1 '''sda2[2](F)''' sdb2[1]
 
  +
243665792 blocks [2/1] [_U]
md1 : active raid1 '''sda2[2](F)''' sdb2[1]
 
  +
 
  +
md0 : active raid1 '''sda1[2](F)''' sdb1[1]
243665792 blocks [2/1] [_U]
 
  +
530048 blocks [2/1] [_U]
 
 
 
md0 : active raid1 '''sda1[2](F)''' sdb1[1]
 
 
530048 blocks [2/1] [_U]
 
 
 
 
 
 
   
   
 
[_U] - Означает что в массиве отсутствует диск (рабочий массив выглядит так [UU]) (F) - означает, что диск дал сбой. В примере вылетел из массива и дал сбой диск '''sda'''. Всё дальнейшее описание будет описывать ситуацию с заменой диска '''sda''', при этом рабочим остался диск '''sdb'''.
 
[_U] - Означает что в массиве отсутствует диск (рабочий массив выглядит так [UU]) (F) - означает, что диск дал сбой. В примере вылетел из массива и дал сбой диск '''sda'''. Всё дальнейшее описание будет описывать ситуацию с заменой диска '''sda''', при этом рабочим остался диск '''sdb'''.
 
 
 
   
 
* Необходимо выяснить, какой из дисков нужно физически отключить. В этом поможет информация о серийных номерах. Например смотрим информацию о модели и серийном номере оставшегося рабочего диска '''sdb''':
 
* Необходимо выяснить, какой из дисков нужно физически отключить. В этом поможет информация о серийных номерах. Например смотрим информацию о модели и серийном номере оставшегося рабочего диска '''sdb''':
  +
udevadm info --query=env --name='''sdb''' | grep -E '(ID_SERIAL_SHORT|ID_MODEL)'
   
  +
ID_SERIAL_SHORT='''9QZCNTNH'''
udevadm info --query=env --name='''sdb''' | grep -E '(ID_SERIAL_SHORT|ID_MODEL)'
 
 
 
 
 
ID_SERIAL_SHORT='''9QZCNTNH'''
 
 
 
Смотрим серийники на наклейках жестких дисков. Соответственно диск с серийным номером '''9QZCNTNH''' оставляем в системе, другой отключаем.
 
Смотрим серийники на наклейках жестких дисков. Соответственно диск с серийным номером '''9QZCNTNH''' оставляем в системе, другой отключаем.
 
 
 
   
 
==Замена неисправного диска==
 
==Замена неисправного диска==
 
 
Выполнять будем горячую замену диска без выключения и перезагрузок сервера.
 
Выполнять будем горячую замену диска без выключения и перезагрузок сервера.
 
 
 
   
 
1. Очистим информацию о диске '''sda''' в массивах.
 
1. Очистим информацию о диске '''sda''' в массивах.
  +
mdadm /dev/md0 --fail /dev/sda1 --remove detached /dev/sda1
 
mdadm /dev/md0 --fail /dev/sda1 --remove detached /dev/sda1
+
mdadm /dev/md1 --fail /dev/sda1 --remove detached /dev/sda1
 
mdadm /dev/md1 --fail /dev/sda1 --remove detached /dev/sda1
 
 
 
2. Удаляем диск физически отключив sata шлейф.
 
2. Удаляем диск физически отключив sata шлейф.
 
 
 
   
 
3. Подключаем новый жесткий диск (SATA) равного до байта или большего размера на "на горячую".
 
3. Подключаем новый жесткий диск (SATA) равного до байта или большего размера на "на горячую".
 
 
 
   
 
4. Выполняем сканирование порта, в который подключили жесткий диск.
 
4. Выполняем сканирование порта, в который подключили жесткий диск.
  +
echo "- - -" >/sys/class/scsi_host/'''host0'''/scan
 
echo "- - -" >/sys/class/scsi_host/'''host0'''/scan
 
 
 
где '''host0''' номер порта.
 
где '''host0''' номер порта.
 
 
* Если нет точной уверенности, в какой именно порт воткнут новый диск, необходимо просканировать все имеющиеся порты. Список портов можно узнать:
 
* Если нет точной уверенности, в какой именно порт воткнут новый диск, необходимо просканировать все имеющиеся порты. Список портов можно узнать:
  +
ls /sys/class/scsi_host/
 
ls /sys/class/scsi_host/
 
 
 
5. Смотрим системный журнал, какое имя получил новый жесткий диск в системе:
 
5. Смотрим системный журнал, какое имя получил новый жесткий диск в системе:
  +
dmesg | grep "logical blocks"
 
dmesg | grep "logical blocks"
 
 
 
Ищем последнюю строку, например:
 
Ищем последнюю строку, например:
  +
sd 0:0:0:0: '''[sda]''' 234439535 512-byte logical blocks: (120 GB/111 GiB)
 
sd 0:0:0:0: '''[sda]''' 234439535 512-byte logical blocks: (120 GB/111 GiB)
 
 
 
Значит имя нового диска - '''sda'''
 
Значит имя нового диска - '''sda'''
 
 
* Если новый диск физически при подключении получил другое имя например '''sdc''', надо отключить его программно выполнив:
 
* Если новый диск физически при подключении получил другое имя например '''sdc''', надо отключить его программно выполнив:
  +
echo "1" > /sys/block/'''sdc'''/device/delete
 
echo "1" > /sys/block/'''sdc'''/device/delete
 
 
 
После чего убедится что имя старого диска /dev/sda отсутствует в описании массива и если это не так выполним очистку как описано выше выше в пунке 1.
 
После чего убедится что имя старого диска /dev/sda отсутствует в описании массива и если это не так выполним очистку как описано выше выше в пунке 1.
  +
cat /proc/mdstat
 
cat /proc/mdstat
 
 
 
Затем выполнить сканирование sata портов.
 
Затем выполнить сканирование sata портов.
 
 
 
   
 
==Активация нового диска==
 
==Активация нового диска==
 
 
Чтобы не ошибиться в дальнейших действиях и не испортить данные создадим переменные с именами дисков.
 
Чтобы не ошибиться в дальнейших действиях и не испортить данные создадим переменные с именами дисков.
  +
cleandsk='''sda''' # чистый, пустой диск
 
  +
workdsk='''sdb''' # Диск, который содержит систему
cleandsk='''sda''' # чистый, пустой диск
 
 
workdsk='''sdb''' # Диск, который содержит систему
 
 
 
Произведем копирование структуры разделов с рабочего на чистый диск и подключим его к массиву
 
Произведем копирование структуры разделов с рабочего на чистый диск и подключим его к массиву
  +
dd if=/dev/$workdsk of=/dev/$cleandsk bs=512 count=34
 
dd if=/dev/$workdsk of=/dev/$cleandsk bs=512 count=34
+
blockdev --rereadpt /dev/$cleandsk
  +
mdadm --add /dev/md0 /dev/${cleandsk}2
 
blockdev --rereadpt /dev/$cleandsk
+
mdadm --add /dev/md1 /dev/${cleandsk}3
 
mdadm --add /dev/md0 /dev/${cleandsk}2
 
 
mdadm --add /dev/md1 /dev/${cleandsk}3
 
 
 
* Устанавливаем загрузчик на новый диск
 
* Устанавливаем загрузчик на новый диск
  +
grub
 
grub
 
 
 
И последовательно вводим, где 0 это номер диска:
 
И последовательно вводим, где 0 это номер диска:
  +
root (hd'''0''',0)
 
root (hd'''0''',0)
+
setup (hd'''0''')
  +
quit
 
setup (hd'''0''')
 
 
quit
 
 
 
Смотрим процесс синхронизации
 
Смотрим процесс синхронизации
  +
watch cat /proc/mdstat
 
watch cat /proc/mdstat
 
 
 
Как только процесс завершиться, новый диск станет полноценным участником массива и в случае выхода из строя другого диска, система загрузится с него.
 
Как только процесс завершиться, новый диск станет полноценным участником массива и в случае выхода из строя другого диска, система загрузится с него.

Текущая версия на 08:52, 2 июля 2012

Задача[]

  • Необходимо создать надежную отказоустойчивую дисковую систему. При выходе из строя любого жесткого диска, система должна продолжить работу
  • Перенос на 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
# Автоматическое назначение прав на новые массивы
CREATE owner=root group=disk mode=0660 auto=yes

# Почтовый адрес для уведомлений о событиях  происходящих с массивом
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

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