Инструменты пользователя

Инструменты сайта


mdadm

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

mdadm [2018/08/08 04:55] (текущий)
Строка 1: Строка 1:
 +====== MD (multi disk) mdctl ======
 +{{::​mdadm.png?​nolink&​600|}}
  
 +{{htmlmetatags>​
 +metatag-description=(Утилита управления программными RAID массивами mdadm. Создание массива. Изменение конфигурационного файла.)
 +}}
 +
 +
 +**mdadm** — утилита для управления программными RAID массивами в GNU/Linux (Linux Software Raid), ранее известная,​ как mdctl. MD — сокращение от multi disk.
 +
 +В Linux можно использовать следующие разновидности RAID:
 +
 +    * LINEAR (JBOD) — расширение размера логического диска за счет нескольких физических дисков;​
 +    * RAID0 (striping) — распределение блоков на нескольких физических дисках без обеспечения отказоустойчивости;​
 +    * RAID1 (mirroring) — зеркалирование,​ запись одних и тех же данных одновременно на два диска, что обеспечивает отказоустойчивость при отказе одного из дисков;​
 +    * RAID4;
 +    * RAID5 — массив с обеспечением отказоустойчивости за счет минимальной избыточности (требуется минимум три диска);​
 +    * RAID6;
 +    * MULTIPATH — не RAID-массив,​ позволяющий создавать разные псевдо-дисковые устройства для одного физического диска;
 +    * FAULTY — псевдо RAID-массив.
 +
 +Не все разновидности RAID-массивов доступны в ядре Linux в начальной конфигурации. Например,​ чтобы использовать RAID5 необходимо внести изменения в конфигурацию ядра и скомпилировать его заново. Для уже скомпилированных ядер из дистрибутивов,​ возможно потребуется явная загрузка соответствующего модуля. Пример:​ modprobe raid5.
 +
 +<​note>​При создании RAID1 (зеркала) с целью повышения отказоустойчивости системы рекомендуется разделы swap также объединять в массив. При использовании swap-разделов вне RAID при отказе одного диска может случиться крах системы (если на поломавшийся диск была выгружена часть страниц памяти). При объединении в RAID- массив разделов swap такого не произойдет,​ т.к. выгружаемая страница будет присутствовать на обоих дисках.</​note>​
 +
 +====== Восстановление функционирования ([_U]) ======
 +<note warning>​Если вместо [UU] видим [_U], то целостность одного из дисков нарушена.</​note>​
 +
 +Ниже описана процедура восстановления диска после незначительного сбоя. В моем случае было выключено некорректно питание сервера и развалился md5.
 +
 +  * Восстановление функционирования (rebuild) разделов диска по одному после **однократного "​несмертельного"​** сбоя:<​file>​
 +# mdadm -a /​dev/​md<​0-6>​ /​dev/​sd<​a-b><​1-10>​
 +</​file>​например:<​file>​
 +# mdadm -a /dev/md0 /dev/sdb1
 +</​file>​
 +**Нужно быть аккуратным с номерами разделов.**
 +  * В случае ошибки,​ удалить компонент из RAID командой:<​file>​
 +# mdadm -r /dev/md0 /dev/sdb1
 +</​file>​получается не всегда - устройство может быть занято,​ тогда устройство нужно пометить как сбойное,​ а потом удалить<​file>​
 +mdadm --manage /dev/md0 --fail /dev/sdb1
 +</​file>​
 +
 +  * **Пример восстановления**:​
 +<​file>​
 +[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>​
 +</​file>​
 +Видим, что проблема с md5. Смотрим более подробную информацию о ошибке.
 +<​file>​
 +[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
 +</​file>​
 +Видим что не хватает /dev/sda2. Пробуем его добавить обратно в RAID md5.
 +<​file>​
 +[root@vm ~]# mdadm -a /dev/md5 /dev/sda2
 + ​mdadm:​ added /dev/sda2
 +</​file>​
 +Если все ок. Наблюдаем состояние синхронизации RAID md5.
 +<​file>​
 +[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
 +</​file>​
 +====== Замена неисправного диска ======
 +  * **Постановка задачи:​** Окружение:​ CentOS release 5.5 (Final), RAID1 (два винчестера /dev/sda и /dev/sdb). Нужно заменить сбойный винчестер /dev/sda.
 +Пришли уведомления от [[Logwatch]]:<​file>​
 + ​--------------------- Raid Begin ------------------------ ​
 +
 + ​Apr ​ 3 08:46:21 raid1: Disk failure on sda7, disabling device.  ​
 + 
 + ​---------------------- Raid End ------------------------- ​
 +</​file>​
 +и от **mdadm monitoring**:<​file>​
 +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.
 +</​file>​
 +
 +  * **Решение:​** ​
 +  - Проверим(уточним) поступившую информацию<​code>​
 +[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>​
 +</​code>​
 +  - Проблема с md2. Уточним информацию.<​code>​
 +[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
 +</​code>​
 +  - Проблема с /dev/sda. Нужно это винчестер заменить на аналогичный по размеру. Выключаем компьютер. Заменяем винчестер. Проверяем:<​code>​
 +[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
 +</​code>​
 +  - Новый неразмеченный винчестер добавлен как sda. Утилитой [[sfdisk]] скопируем структуру разделов с рабочего HDD (sdb) на новый HDD (sda).<​code>​
 +[root@vm ~]# sfdisk -d /dev/sdb | sfdisk /dev/sda
 +</​code>​
 +  - Проверяем разбивку. Видим что новый HDD разбит идентично старому:<​code>​[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
 +</​code>​
 +  - Добавляем каждый раздел в предназначенный ему RAID. Чтобы не ошибиться при добавлении,​ лучше предварительно используя команду mdadm --query --detail /dev/md? узнать какая по номеру партиция диска sdb добавлена и подставить аналогичную с нового диска sda.<​code>​
 +[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
 +...
 +</​code>​
 +  - Проверить синхронизацию,​ после добавления в RAID можно командой <​code>​[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>​
 +</​code>​
 +<note important>​После замены вылетевшего диска нужно обязательно установить на новый диск [[grub]].</​note>​
 +В этом случае используется первый grub. Установим grub на /​dev/​sda:<​file>​
 +# 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.
 +
 +</​file>​
 +====== Мониторинг состояния. Настройка оповещения. ======
 +  * Информация о всех RAID-массивах:​
 +<​file>​
 +# more /​proc/​mdstat или # cat /​proc/​mdstat
 +</​file>​
 +  * Настроим проверку состояния RAID каждый час. В папке /​etc/​cron.hourly создадим файл mdraidstate:​
 +<​code>​
 +# 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
 +</​code>​
 +Если нужно чаще, самое простое решение,​ добавить в /​etc/​crontab строку,​ используя нотацию с "/",​ например:​
 +<​code>​
 +*/5 * * * * root run-parts /​etc/​cron.my5min
 +</​code>​ предварительно нужно создать папку /​etc/​cron.my5min и поместить туда файл (файлы),​ которые нужно запускать раз в 5 минут.
 +  * **[[Скрипт для принудительной проверки mdadm]]**. Скрипт должен запускать единоразово при загрузке ОС.
 +  * в [[Fedora]] существует скрипт /​etc/​cron.weekly/​99-raid-check. Для работы скрипта нужно изменить несколько параметров в конфигурационном файле<​file>​
 +# nano /​etc/​sysconfig/​raid-check
 +ENABLED=yes
 +CHECK=check
 +# To check devs /dev/md0 and /dev/md3, use "md0 md3"
 +#​CHECK_DEVS=""​
 +CHECK_DEVS="​md0 md3 md4 md5"
 +REPAIR_DEVS=""​
 +SKIP_DEVS=""​
 +</​file>​
 +  * Скрипт checkarray <​file>​
 +# nano /​etc/​cron.d/​mdadm
 +#
 +# cron.d/​mdadm -- schedules periodic redundancy checks of MD devices
 +#
 +# Copyright © martin f. krafft <​madduck@madduck.net>​
 +# distributed under the terms of the Artistic Licence 2.0
 +#
 +
 +# By default, run at 00:57 on every Sunday, but do nothing unless the day of
 +# the month is less than or equal to 7. Thus, only run on the first Sunday of
 +# each month. crontab(5) sucks, unfortunately,​ in this regard; therefore this
 +# hack (see #380425).
 +57 0 * * 0 root [ -x /​usr/​share/​mdadm/​checkarray ] && [ $(date +\%d) -le 7 ] && /​usr/​share/​mdadm/​checkarray --cron --all --quiet --status
 +</​file>​
 +===== GRUB2 RAID1 =====
 +В Debin, Ubuntu обязательно нужно поставить [[grub2]] на второй винт <​file>​
 +grub-install /dev/sdb
 +</​file>​ После завершения процесса установки,​ загружаемся с [[HDD]], входим в систему под правами пользователя root и настраиваем загрузчик [[grub2|GRUB]].<​file>​
 +# dpkg-reconfigure grub-pc
 +</​file>​Отмечаем звёздочками /dev/sda и /dev/sdb.
 +
 +
 +При вылете первого винчестера /dev/sdа, может возникнуть проблема при загрузке со второго /dev/sdb как ни странно это лечится так (то есть отключается графический терминал GRUB): раскоментируется строка GRUB_TERMINAL=console и запуск update-grub для применения изменений.
 +<​file>​
 +# nano /​etc/​default/​grub
 +# Uncomment to disable graphical terminal (grub-pc only)
 +GRUB_TERMINAL=console
 +# update-grub
 +</​file>​
 +
 +====== WARNING: mismatch_cnt is not 0 on /dev/md2 ======
 +Приходит сообщение:​ <​file>​
 +/​etc/​cron.weekly/​99-raid-check:​
 +
 +WARNING: mismatch_cnt is not 0 on /dev/md2
 +</​file>​
 +  * Источник [[http://​phpsuxx.blogspot.com/​2010/​04/​warning-mismatchcnt-is-not-0-on-devmd2.html|WARNING:​ mismatch_cnt is not 0 on /dev/md2]]
 +Смотрим значение mismatch_cnt<​file>​
 +# cat /​sys/​block/​md2/​md/​mismatch_cnt
 +1664
 +</​file>​
 +
 +Значения mismatch_cnt в пределе нескольких тысяч можно игнорировать абсолютно без вреда для данных и стабильности систем.
 +
 +====== Ссылки ======
 +  * [[wpru>​Mdadm]]
 +  * [[Debian]] и софтовый RAID
 +  * [[server_virtualizacii_1?&#​ustanovka_fedora_na_raid1|Установка Fedora на RAID1]]
 +  * [[http://​www.linuxshare.ru/​docs/​admin/​ud_sraid.html|Недокументированные фишки программного RAID в Linux]]
 +  * [[http://​www.opennet.ru/​tips/​info/​1984.shtml|Восстановление программного RAID в Debian Lenny]]
 +  * [[http://​rus-linux.net/​lib.php?​name=MyLDP/​hard/​raid1/​raid.html|Настройка программного RAID1 на работающей системе (включая конфигурацию GRUB)]]
 +  * [[http://​xgu.ru/​wiki/​raid|Управление программным RAID-массивом в Linux]]
 +  * [[http://​fossbook.info/​partitions/​220|Создать собственное разбиение]]
 +  * [[http://​24may.kharkov.ua/​page130.html|Замена неисправного винчестера в RAID 1 в LINUX]]
 +  * [[http://​pomka.blogspot.com/​2008/​07/​raid-1.html|Перенос работающей системы на програмный RAID 1]]
загрузка...
mdadm.txt · Последние изменения: 2018/08/08 04:55 (внешнее изменение)