Содержание

Использование mdadm для настройки RAID-Массивов в Linux

mdadm — утилита для управления программными RAID массивами в GNU/Linux (Linux Software Raid), ранее известная, как mdctl. MD — сокращение от multi disk.

Утилита mdadm является стандартным инструментом в Linux для создания, управления и мониторинга RAID-массивов на уровне программного обеспечения. Большинство дистрибутивов Linux предлагают mdadm в своих стандартных репозиториях, что облегчает ее установку и настройку. Это мощный инструмент, который поддерживает различные уровни RAID, включая RAID 0, RAID 1, RAID 5, RAID 6 и RAID 10. Mdadm позволяет объединять несколько физических дисков в один логический диск для повышения производительности, надежности или обоих. Кроме того, она предоставляет возможности для мониторинга состояния RAID-массивов и оповещения администратора в случае возникновения проблем с дисками или массивами.

В Linux можно использовать следующие разновидности RAID:

Не все разновидности RAID-массивов доступны в ядре Linux в начальной конфигурации. Например, чтобы использовать RAID5 необходимо внести изменения в конфигурацию ядра и скомпилировать его заново. Для уже скомпилированных ядер из дистрибутивов, возможно потребуется явная загрузка соответствующего модуля. Пример: modprobe raid5.

При создании RAID1 (зеркала) с целью повышения отказоустойчивости системы рекомендуется разделы swap также объединять в массив. При использовании swap-разделов вне RAID при отказе одного диска может случиться крах системы (если на поломавшийся диск была выгружена часть страниц памяти). При объединении в RAID- массив разделов swap такого не произойдет, т.к. выгружаемая страница будет присутствовать на обоих дисках.

Установка утилиты mdadm

Чтобы установить утилиту mdadm, запустите команду установки:

Подготовка дисков для создания любого рейда

Если данные диски уже где-то использовались, первым делом нам нужно их полностью очистить и удалить старую «память о рейде», если на них уже был создан массив ранее. Зануляем все суперблоки на дисках, которые мы будем добавлять в RAID-массив. В примере ниже подразумевается, что у нас 4 диска /dev/sdc, /dev/sdd, /dev/sdb и /dev/sda

mdadm --zero-superblock --force /dev/vd{a,b,c,d}

Посмотреть какие у вас диски в ОС, можно выполнив fdisk -l.

Создание RAID0 в режиме страйп (stripe)

Если нужно создать RAID0 в режиме страйп (stripe) для увеличения скорости чтения/записи данных за счет распараллеливания команд между несколькими физическими дисками, используйте команду:

2 диска в рейде
mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/vdb /dev/vdc
4 диска в рейде
mdadm --create --verbose /dev/md0 --level=0 --raid-devices=4 /dev/sdc /dev/sdd /dev/sdb /dev/sda

Теперь при просмотре информации о дисках, мы видим наш массив:

lsblk

Чтобы создать файловую систему ext4 на нашем RAID0 массиве, используйте команду mkfs:

mkfs.ext4 /dev/md0

Создадим директорию backup и примонтируем к ней RAID устройство:

mkdir /var/nfs
mount /dev/md0 /var/nfs/
 
df -h

Чтобы не монтировать устройство каждый раз вручную, внесем изменения в fstab:

# nano /etc/fstab
 
/dev/md0 /var/nfs ext4 defaults 1 2

Чтобы проверить состояние всех RAID -массивов доступны на сервере, используйте команду:

cat /proc/mdstat

Более подробную информацию о конкретном raid-массиве, можно посмотреть командой:

mdadm -D /dev/md0

Разберем основные пункты листинга команды:

Восстановление функционирования ([_U])

Если вместо [UU] видим [_U], то целостность одного из дисков нарушена.

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

Нужно быть аккуратным с номерами разделов.

[root@vm ~]# cat /proc/mdstat
Personalities : [raid1] 
md5 : active raid1 sdb2[1]
      860160192 blocks [2/1] [_U]
      
md3 : active raid1 sdb3[1] sda3[0]
      30716160 blocks [2/2] [UU]
      
md4 : active raid1 sdb5[1] sda5[0]
      20482752 blocks [2/2] [UU]
      
md1 : active raid1 sdb6[1] sda6[0]
      16386176 blocks [2/2] [UU]
      
md2 : active raid1 sdb7[1] sda7[0]
      10241280 blocks [2/2] [UU]
      
md0 : active raid1 sdb1[1] sda1[0]
      20482752 blocks [2/2] [UU]
      
unused devices: <none>

Видим, что проблема с md5. Смотрим более подробную информацию о ошибке.

[root@vm ~]# mdadm --query --detail /dev/md5
/dev/md5:
        Version : 0.90
  Creation Time : Mon Jan 31 13:29:01 2011
     Raid Level : raid1
     Array Size : 860160192 (820.31 GiB 880.80 GB)
  Used Dev Size : 860160192 (820.31 GiB 880.80 GB)
   Raid Devices : 2
  Total Devices : 1
Preferred Minor : 5
    Persistence : Superblock is persistent

    Update Time : Mon Feb 28 13:08:42 2011
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           UUID : bba1242e:c9f75ce4:7872b1fa:7a320018
         Events : 0.89396

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       18        1      active sync   /dev/sdb2

Видим что не хватает /dev/sda2. Пробуем его добавить обратно в RAID md5.

[root@vm ~]# mdadm -a /dev/md5 /dev/sda2
 mdadm: added /dev/sda2

Если все ок. Наблюдаем состояние синхронизации RAID md5.

[root@vm ~]# cat /proc/mdstat
Personalities : [raid1] 
md5 : active raid1 sda2[0] sdb2[1]
      860160192 blocks [2/1] [_U]
      [===>.................]  recovery = 18.0% (154891584/860160192) finish=108.7min speed=108091K/sec

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

Пришли уведомления от Установка и использование лог-анализатора Logwatch:

 --------------------- Raid Begin ------------------------ 

 Apr  3 08:46:21 raid1: Disk failure on sda7, disabling device.  
 
 ---------------------- Raid End ------------------------- 

и от mdadm monitoring:

This is an automatically generated mail message from mdadm
running

A Fail event had been detected on md device /dev/md2.

It could be related to component device /dev/sda7.

Faithfully yours, etc.
  1. Проверим(уточним) поступившую информацию
    [root@vm ~]# cat /proc/mdstat 
    Personalities : [raid1] 
    md5 : active raid1 sdb2[1] sda2[0]
          860160192 blocks [2/2] [UU]
          
    md3 : active raid1 sdb3[1] sda3[0]
          30716160 blocks [2/2] [UU]
          
    md4 : active raid1 sdb5[1] sda5[0]
          20482752 blocks [2/2] [UU]
          
    md1 : active raid1 sdb6[1] sda6[0]
          16386176 blocks [2/2] [UU]
          
    md2 : active raid1 sdb7[1] sda7[2](F)
          10241280 blocks [2/1] [_U]
          
    md0 : active raid1 sdb1[1] sda1[0]
          20482752 blocks [2/2] [UU]
          
    unused devices: <none>
  2. Проблема с md2. Уточним информацию.
    [root@vm ~]# mdadm --query --detail /dev/md2
    /dev/md2:
            Version : 0.90
      Creation Time : Mon Jan 31 13:35:55 2011
         Raid Level : raid1
         Array Size : 10241280 (9.77 GiB 10.49 GB)
      Used Dev Size : 10241280 (9.77 GiB 10.49 GB)
       Raid Devices : 2
      Total Devices : 2
    Preferred Minor : 2
        Persistence : Superblock is persistent
    
        Update Time : Mon Apr  4 16:10:47 2011
              State : clean, degraded
     Active Devices : 1
    Working Devices : 1
     Failed Devices : 1
      Spare Devices : 0
    
               UUID : d37240a0:95da8141:7aa4d888:5d41f52f
             Events : 0.30558
    
        Number   Major   Minor   RaidDevice State
           0       0        0        0      removed
           1       8       23        1      active sync   /dev/sdb7
    
           2       8        7        -      faulty spare   /dev/sda7
  3. Проблема с /dev/sda. Нужно это винчестер заменить на аналогичный по размеру. Выключаем компьютер. Заменяем винчестер. Проверяем:
    [root@vm ~]# fdisk -l | less
    Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
    255 heads, 63 sectors/track, 121601 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    
    Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
    255 heads, 63 sectors/track, 121601 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1   *           1        2550    20482843+  fd  Linux raid autodetect
    /dev/sdb2            2551      109635   860160262+  fd  Linux raid autodetect
    /dev/sdb3          109636      113459    30716280   fd  Linux raid autodetect
    /dev/sdb4          113460      121601    65400615    5  Extended
    /dev/sdb5          113460      116009    20482843+  fd  Linux raid autodetect
    /dev/sdb6          116010      118049    16386268+  fd  Linux raid autodetect
    /dev/sdb7          118050      119324    10241406   fd  Linux raid autodetect
  4. Новый неразмеченный винчестер добавлен как sda. Утилитой sfdisk скопируем структуру разделов с рабочего HDD (sdb) на новый HDD (sda).
    [root@vm ~]# sfdisk -d /dev/sdb | sfdisk /dev/sda
  5. Проверяем разбивку. Видим что новый HDD разбит идентично старому:
    [root@vm ~]# fdisk -l | less
    Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
    255 heads, 63 sectors/track, 121601 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1        2550    20482843+  fd  Linux raid autodetect
    /dev/sda2            2551      109635   860160262+  fd  Linux raid autodetect
    /dev/sda3          109636      113459    30716280   fd  Linux raid autodetect
    /dev/sda4          113460      121601    65400615    5  Extended
    /dev/sda5          113460      116009    20482843+  fd  Linux raid autodetect
    /dev/sda6          116010      118049    16386268+  fd  Linux raid autodetect
    /dev/sda7          118050      119324    10241406   fd  Linux raid autodetect
    
    Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
    255 heads, 63 sectors/track, 121601 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1   *           1        2550    20482843+  fd  Linux raid autodetect
    /dev/sdb2            2551      109635   860160262+  fd  Linux raid autodetect
    /dev/sdb3          109636      113459    30716280   fd  Linux raid autodetect
    /dev/sdb4          113460      121601    65400615    5  Extended
    /dev/sdb5          113460      116009    20482843+  fd  Linux raid autodetect
    /dev/sdb6          116010      118049    16386268+  fd  Linux raid autodetect
    /dev/sdb7          118050      119324    10241406   fd  Linux raid autodetect
  6. Добавляем каждый раздел в предназначенный ему RAID. Чтобы не ошибиться при добавлении, лучше предварительно используя команду mdadm –query –detail /dev/md? узнать какая по номеру партиция диска sdb добавлена и подставить аналогичную с нового диска sda.
    [root@vm ~]# mdadm --add /dev/md0 /dev/sda1
    mdadm: added /dev/sda1
    [root@vm ~]# mdadm --add /dev/md1 /dev/sda6
    mdadm: added /dev/sda6
    [root@vm ~]# mdadm --add /dev/md2 /dev/sda7
    mdadm: added /dev/sda7
    ...
  7. Проверить синхронизацию, после добавления в RAID можно командой
    [root@vm ~]# cat /proc/mdstat 
    Personalities : [raid1] 
    md5 : active raid1 sda2[2] sdb2[1]
          860160192 blocks [2/1] [_U]
          	resync=DELAYED
          
    md3 : active raid1 sda3[2] sdb3[1]
          30716160 blocks [2/1] [_U]
          	resync=DELAYED
          
    md4 : active raid1 sda5[2] sdb5[1]
          20482752 blocks [2/1] [_U]
          	resync=DELAYED
          
    md1 : active raid1 sda6[0] sdb6[1]
          16386176 blocks [2/2] [UU]
          
    md2 : active raid1 sda7[2] sdb7[1]
          10241280 blocks [2/1] [_U]
          [=====>...............]  recovery = 28.4% (2914880/10241280) finish=2.3min speed=51682K/sec
          
    md0 : active raid1 sda1[0] sdb1[1]
          20482752 blocks [2/2] [UU]
          
    unused devices: <none>
После замены вылетевшего диска нужно обязательно установить на новый диск grub.

В этом случае используется первый grub. Установим grub на /dev/sda:

# cat /boot/grub/device.map
# this device map was generated by anaconda
(hd0)     /dev/sda
(hd1)     /dev/sdb
[root@vm ~]# grub
Probing devices to guess BIOS drives. This may take a long time.

    GNU GRUB  version 0.97  (640K lower / 3072K upper memory
...
grub> root (hd0,0)     

root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd

grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
Done.

Мониторинг состояния. Настройка оповещения.

# more /proc/mdstat или # cat /proc/mdstat
# cd /etc/cron.hourly/
# touch mdraidstate
# chmod +x mdraidstate
# nano mdraidstate

#!/bin/sh

/sbin/mdadm --monitor --scan -1 --mail=test@your.domen
# mdadm --monitor --mail=your_mail@here --delay=600 /dev/md*
<code>
Для проверки рассылки сообщения добавляется ключ --test:
<code>
/sbin/mdadm --monitor --scan -1 --mail=test@your.domen --test

Если нужно чаще, самое простое решение, добавить в /etc/crontab строку, используя нотацию с "/", например:

*/5 * * * * root run-parts /etc/cron.my5min

предварительно нужно создать папку /etc/cron.my5min и поместить туда файл (файлы), которые нужно запускать раз в 5 минут.

GRUB2 RAID1

В Debin, Ubuntu обязательно нужно поставить Введение Grub2 на второй винт

grub-install /dev/sdb

После завершения процесса установки, загружаемся с HDD, входим в систему под правами пользователя root и настраиваем загрузчик GRUB.

# dpkg-reconfigure grub-pc

Отмечаем звёздочками /dev/sda и /dev/sdb.

При вылете первого винчестера /dev/sdа, может возникнуть проблема при загрузке со второго /dev/sdb как ни странно это лечится так (то есть отключается графический терминал GRUB): раскоментируется строка GRUB_TERMINAL=console и запуск update-grub для применения изменений.

# nano /etc/default/grub
# Uncomment to disable graphical terminal (grub-pc only)
GRUB_TERMINAL=console
# update-grub

WARNING: mismatch_cnt is not 0 on /dev/md2

Приходит сообщение:

/etc/cron.weekly/99-raid-check:

WARNING: mismatch_cnt is not 0 on /dev/md2

Смотрим значение mismatch_cnt

# cat /sys/block/md2/md/mismatch_cnt
1664

Значения mismatch_cnt в пределе нескольких тысяч можно игнорировать абсолютно без вреда для данных и стабильности систем.

Ссылки