Использование 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:
- LINEAR (JBOD) — расширение размера логического диска за счет нескольких физических дисков;
- RAID0 (striping) — распределение блоков на нескольких физических дисках без обеспечения отказоустойчивости;
- RAID1 (mirroring) — зеркалирование, запись одних и тех же данных одновременно на два диска, что обеспечивает отказоустойчивость при отказе одного из дисков;
- RAID4;
- RAID5 — массив с обеспечением отказоустойчивости за счет минимальной избыточности (требуется минимум три диска);
- RAID6;
- MULTIPATH — не RAID-массив, позволяющий создавать разные псевдо-дисковые устройства для одного физического диска;
- FAULTY — псевдо RAID-массив.
Не все разновидности RAID-массивов доступны в ядре Linux в начальной конфигурации. Например, чтобы использовать RAID5 необходимо внести изменения в конфигурацию ядра и скомпилировать его заново. Для уже скомпилированных ядер из дистрибутивов, возможно потребуется явная загрузка соответствующего модуля. Пример: modprobe raid5.
Установка утилиты mdadm
Чтобы установить утилиту mdadm, запустите команду установки:
- Для Centos/Red Hat используется yum/dnf: yum install mdadm
- Для Ubuntu/Debian: apt-get install 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
Разберем основные пункты листинга команды:
- Version – версия метаданных;
- Creation Time – дата и время создания raid-массива;
- Raid Level – уровень raid-массива;
- Array Size – объем дискового пространства для raid-массива;
- Used Dev Size – используемый объем для устройств;
- Raid Device – количество дисков в raid-массиве;
- Total Devices – количество добавленных в raid-массив дисков;
- State – текущее состояние (clean – все ОК);
- Active Devices — количество активных дисков в raid-массиве;
- Working Devises — количество рабочих дисков в raid-массиве;
- Failed Devices – количество устройств со сбоями в raid-массиве;
- Spare Devices – количество запасных дисков в raid-массиве;
- Consistency Policy — параметр задающий тип синхронизации после сбоя в raid-массиве, rsync — полная синхронизация после восстановления raid-массива (доступны режимы bitmap, journal, ppl);
- UUID – идентификатор raid-массива
Восстановление функционирования ([_U])
Ниже описана процедура восстановления диска после незначительного сбоя. В моем случае было выключено некорректно питание сервера и развалился md5.
- Восстановление функционирования (rebuild) разделов диска по одному после однократного "несмертельного" сбоя:
# mdadm -a /dev/md<0-6> /dev/sd<a-b><1-10>
например:
# mdadm -a /dev/md0 /dev/sdb1
Нужно быть аккуратным с номерами разделов.
- В случае ошибки, удалить компонент из RAID командой:
# mdadm -r /dev/md0 /dev/sdb1
получается не всегда - устройство может быть занято, тогда устройство нужно пометить как сбойное, а потом удалить
mdadm --manage /dev/md0 --fail /dev/sdb1
- Пример восстановления:
[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
Замена неисправного диска
- Постановка задачи: Окружение: CentOS release 5.5 (Final), RAID1 (два винчестера /dev/sda и /dev/sdb). Нужно заменить сбойный винчестер /dev/sda.
Пришли уведомления от Установка и использование лог-анализатора 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.
- Решение:
- Проверим(уточним) поступившую информацию
[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>
- Проблема с 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
- Проблема с /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
- Новый неразмеченный винчестер добавлен как sda. Утилитой sfdisk скопируем структуру разделов с рабочего HDD (sdb) на новый HDD (sda).
[root@vm ~]# sfdisk -d /dev/sdb | sfdisk /dev/sda
- Проверяем разбивку. Видим что новый 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
- Добавляем каждый раздел в предназначенный ему 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 ...
- Проверить синхронизацию, после добавления в 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 на /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.
Мониторинг состояния. Настройка оповещения.
- Информация о всех RAID-массивах:
# more /proc/mdstat или # cat /proc/mdstat
- Настроим проверку состояния RAID каждый час. В папке /etc/cron.hourly создадим файл mdraidstate:
# 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 минут.
- Скрипт для принудительной проверки mdadm. Скрипт должен запускать единоразово при загрузке ОС.
- в Fedora существует скрипт /etc/cron.weekly/99-raid-check. Для работы скрипта нужно изменить несколько параметров в конфигурационном файле
# 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=""
- Скрипт checkarray
# 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
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 в пределе нескольких тысяч можно игнорировать абсолютно без вреда для данных и стабильности систем.
Ссылки
- Операционная система Debian и софтовый RAID
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах