Перейти к основному содержанию
 

mdadm — полезные команды

Linux

Соберу в одном месте список полезных команд для mdadm.

mdadm — утилита для управления программными RAID-массивами в Linux.

С помощью mdadm можно выполнять следующие операции:

  • mdadm --create, C Создать новый массив на основе указанных устройств. Использовать суперблоки размещённые на каждом устройстве.
  • mdadm --assemble, -A Собрать компоненты ранее созданного массива в массив. Компоненты можно указывать явно, но можно и не указывать — тогда выполняется их поиск по суперблокам.
  • mdadm --build, -B Собрать массив из компонентов, у которых нет суперблоков. Не выполняются никакие проверки, создание и сборка массива в принципе ничем не отличаются.
  • mdadm --manage Разнообразные операции по управлению массивом, такие как замена диска и пометка как сбойного.
  • mdadm --misc Действия, которые не относятся ни к одному из других режимов работы.
  • mdadm --grow, G Расширение или уменьшение массива, включаются или удаляются новые диски.
  • mdadm --incremental, I Добавление диска в массив.
  • mdadm --monitor, --follow, -F Следить за изменением состояния устройств. Для RAID0 этот режим не имеет смысла.

И другие: mdadm --help.

Формат вызова:

mdadm [mode] [array] [options]

Создание массива

Для создания массива нужно использовать не смонтированные разделы. Убедитесь в этом, при необходимости демонтируйте и уберите из fstab.

Пример создания RAID5 массива из трёх дисков:

  • /dev/nvme0n1
  • /dev/nvme1n1
  • /dev/nvme2n1

Я использую NVMe диски, у вас названия дисков будут другие.

Желательно изменить тип разделов на FD (Linux RAID autodetect). Это можно сделать с помощью fdisk (t).

Занулить суперблоки дисков:

mdadm --zero-superblock --force /dev/nvme0n1
mdadm --zero-superblock --force /dev/nvme1n1
mdadm --zero-superblock --force /dev/nvme2n1

Стереть подпись и метаданные:

wipefs --all --force /dev/nvme0n1
wipefs --all --force /dev/nvme1n1
wipefs --all --force /dev/nvme2n1

С помощью ключа --create создать RAID5 массив:

 mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1

где:

  • /dev/md0 — массив, который мы создаём;
  • --level 5 — уровень RAID;
  • --raid-devices=3 — количество дисков, из которых собирается массив;
  • /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 — диски.

Для примера RAID1 из двух дисков /dev/sdb и /dev/sdc можно создать так:

mdadm --create --verbose /dev/md2 -l 1 -n 2 /dev/sd{b,c}

где:

  • /dev/md2 — массив, который мы создаём;
  • -l 5 — уровень RAID;
  • -n 2 — количество дисков, из которых собирается массив;
  • /dev/sd{b,c} — диски sdb и sdc.

Состояние массива

Посмотреть инициализацию массива и текущее состояние можно с помощью команды:

cat /proc/mdstat

Пример 1:

root@ch01:~# cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md127 : active raid1 nvme1n1[1] nvme0n1[0]
      3750607192 blocks super 1.2 [2/2] [UU]

unused devices: <none>

mdadm

Пример 2:

[root@dbk00 ~]# cat /proc/mdstat
Personalities : [raid1] [raid0]
md10 : active raid0 sdb1[1] sda1[0]
      70319335424 blocks super 1.2 512k chunks

md20 : active raid0 sdc1[0] sdd1[1]
      70319335424 blocks super 1.2 512k chunks

md126 : active raid1 sde[1] sdf[0]
      927881216 blocks super external:/md127/0 [2/2] [UU]

md127 : inactive sdf[1](S) sde[0](S)
      10402 blocks super external:imsm

unused devices: <none>

Подробный статус выбранного массива

mdadm --detail /dev/md2

Пример:

root@ch01:~# mdadm --detail /dev/md127
/dev/md127:
           Version : 1.2
     Creation Time : Wed May  6 16:39:32 2020
        Raid Level : raid1
        Array Size : 3750607192 (3576.86 GiB 3840.62 GB)
     Used Dev Size : 3750607192 (3576.86 GiB 3840.62 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Fri Aug 14 17:09:47 2020
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : VirtualDisk01
              UUID : 1728ebed:ad0b0000:faad83b7:37070000
            Events : 173

    Number   Major   Minor   RaidDevice State
       0     259        0        0      active sync   /dev/nvme0n1
       1     259        1        1      active sync   /dev/nvme1n1

mdadm

Список массивов

mdadm --detail --scan --verbose

Пример:

root@ch01:~# mdadm --detail --scan --verbose
ARRAY /dev/md/VirtualDisk01 level=raid1 num-devices=2 metadata=1.2 name=VirtualDisk01 UUID=1728ebed:ad0b0000:faad83b7:37070000
   devices=/dev/nvme0n1,/dev/nvme1n1

bash

Создание файловой системы

Файловую систему в массиве можно создать с помощью mkfs, например:

mkfs.ext4 -m 0 /dev/md0

Для лучшей производительности файловой системы имеет смысл указывать при её создании количество дисков в рейде и количество блоков файловой системы, которое может поместиться в один страйп (chunk), это касается массивов уровня RAID0, RAID5 ,RAID6 ,RAID10. Для RAID1 (mirror) это не имеет значения так как запись идет всегда на один device, a в других типах массивов данные записываются последовательно на разные диски порциями, соответствующими размеру stripe. Например, если мы используем RAID5 из 3 дисков с дефолтным размером страйпа в 64К и файловую систему ext3 с размером блока в 4К то можно вызывать команду mkfs.ext3 так:

mkfs.ext3 -b 4096 -E stride=16,stripe-width=32 /dev/md0

stripe-width обычно рассчитывается как

stride * N

где N — это диски с данными в массиве, например, в RAID5 два диска с данными и один parity для контрольных сумм. Для файловой системы XFS нужно указывать не количество блоков файловой системы, соответствующих размеру stripe в массиве, а размер самого страйпа:

mkfs.xfs -d su=64k,sw=3 /dev/md0

Создание mdadm.conf

Операционная система не запоминает какие RAID-массивы ей нужно создать и какие диски в них входят. Эта информация содержится в файле mdadm.conf.

mkdir /etc/mdadm
echo "DEVICE partitions" > /etc/mdadm/mdadm.conf
mdadm --detail --scan | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf

В интернете советуют применять команду mdadm --detail --scan --verbose, но я не рекомендую, т.к. она пишет в конфигурационный файл названия разделов, а они в некоторых случаях могут измениться, тогда RAID-массив не соберётся. А mdadm --detail --scan записывает UUID разделов, которые не изменятся.

Проверка целостности массива

echo 'check' >/sys/block/md0/md/sync_action

Есть ли ошибки в процессе проверки программного RAID-массива по команде check или repair:

cat /sys/block/md0/md/mismatch_cnt

Работа с дисками

Диск в массиве можно условно сделать сбойным с помощью ключа --fail (-f):

mdadm /dev/md0 --fail /dev/nvme0n1
mdadm /dev/md0 -f /dev/nvme0n1

Удалить из массива отказавший диск:

mdadm /dev/md0 --remove /dev/nvme0n1
mdadm /dev/md0 -r /dev/nvme0n1

Добавить в массив заменённый диск:

mdadm /dev/md0 --add /dev/nvme0n1
mdadm /dev/md0 -a /dev/nvme0n1

Сборка существующего массива

Собрать существующий массив можно с помощью mdadm --assemble:

mdadm --assemble /dev/md0 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1
mdadm --assemble --scan

Расширение массива

Расширить массив можно с помощью ключа --grow (-G). Сначала добавляется диск, а потом массив расширяется:

mdadm /dev/md0 --add /dev/nvme3n1

Проверяем, что диск добавился:

mdadm --detail /dev/md0
cat /proc/mdstat

Если диск добавился, расширяем массив:

mdadm -G /dev/md0 --raid-devices=4

Опция --raid-devices указывает новое количество дисков в массиве с учётом добавленного. Рекомендуется задать файл бэкапа на случай прерывания перестроения массива, например, добавить опцию:

--backup-file=/var/backup

При необходимости, можно регулировать скорость процесса расширения массива, указав нужное значение в файлах:

  • /proc/sys/dev/raid/speed_limit_min
  • /proc/sys/dev/raid/speed_limit_max

Убедитесь, что массив расширился:

cat /proc/mdstat

Нужно обновить конфигурационный файл с учётом сделанных изменений:

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

Возобновление отложенной синхронизации

Отложенная синхронизация active(auto-read-only):

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active(auto-read-only) raid1 sda1[0] sdb1[1]
      78148096 blocks [2/2] [UU]
        resync=PENDING

Такое может быть, если массив создали, но ничего в него не стали писать. Возобновить:

echo idle > /sys/block/md0/md/sync_action

Переименовать массив

Останавливаем массив:

umount /dev/md0
mdadm --stop /dev/md0

Собираем массив с новым именем:

mdadm --assemble /dev/md3 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 --update=name

Или для старых версий:

mdadm –assemble /dev/md3 /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 –update=super-minor

Удаление массива

Останавливаем массив:

umount /dev/md0
mdadm --stop /dev/md0

Затем необходимо затереть superblock каждого из составляющих массива:

mdadm --zero-superblock --force /dev/nvme0n1
mdadm --zero-superblock --force /dev/nvme1n1
mdadm --zero-superblock --force /dev/nvme2n1

Или с помощью dd:

dd if=/dev/zero of=/dev/nvme0n1 bs=512 count=1
dd if=/dev/zero of=/dev/nvme1n1 bs=512 count=1
dd if=/dev/zero of=/dev/nvme2n1 bs=512 count=1

Теги