Linux. Команда mdadm

27.08.2023

Теги: CLILinuxБлочноеУстройствоКомандаФайловаяСистема

RAID (Redundant Array of Independent Disks, избыточный массив независимых дисков) — это способ хранения данных на нескольких накопителях. Используется данная технология для защиты данных в случае отказа одного из дисков и/или расширения общего пространства памяти.

RAID массив отображается в интерфейсе операционной системы как один логический диск. Тем не менее, принцип его работы может быть разным — зеркальным или чередующим. Зеркальный метод подразумевает копирование идентичных данных на несколько дисков, а чередующий позволяет равномерно распределять информацию по ним. Зеркалирование и чередование дисков могут быть объединены в одном массиве.

Уровни RAID массивов

RAID 0 — чередование дисков

RAID 0 — это простое чередование дисков без резервирования. Все данные распределяются по частям между всеми SSD или HDD в массиве RAID. RAID 0 обеспечивает высокую скорость чтения и записи, поскольку распределяет нагрузку по хранению данных на большее количество физических дисков.

RAID 1 — зеркалирование дисков

RAID 1 использует зеркалирование дисков. Это означает, что все данные записываются на два отдельных физических диска. По сути, эти диски являются зеркальными отражениями друг друга. Если один диск выходит из строя, данные могут быть получены с другого диска. Для RAID 1 требуется минимум два диска.

RAID 1+0 — зеркалирование и чередование дисков

RAID 1+0, который также называют RAID 10 — комбинация двух первых вариантов, то есть массив RAID 0 из массивов RAID 1. Обеспечивает высокую скорость чтения и записи, как у RAID 0. И высокую надежность хранения данных, как у RAID 1. Для RAID 1+0 требуется минимум четыре физических диска.

RAID 0+1 — массив RAID 1 из массивов RAID 0. Фактически не применяется из-за отсутствия преимуществ по сравнению с RAID 1+0 и меньшей отказоустойчивости.

RAID 5 — контроль четности

Вместо дублирования данных, как в RAID 1, в RAID 5 используется гораздо более эффективный метод — контроль четности. Вместо хранения копии данных — RAID 5 сохраняет бит четности. Все диски, кроме одного, используются как обычный массив RAID 0, а последний диск используется для контроля четности. Если один из дисков выходит из строя, можно выполнить вычисление четности в обратном порядке, чтобы восстановить все данные на любом из дисков.

Контроль четности обычно используется для проверки, что сетевой трафик не искажается при передаче. Допустим, есть 7 бит данных, которые нужно отправить кому-то. И хотелось бы убедиться, что они дойдут туда в целости и сохранности. Если ноль или единица перевернулись в передаче — нет возможности это узнать. Решение состоит в том, чтобы подсчитать все единицы. Если количество единиц четное — четность будет 0. Если количество единиц нечетное — четность будет 1. Добавляем это к отправляемым данным — а на другом конце вычисляем четность. Если произошла ошибка и бит был перевернут — нужно запросить повторную отправку данных.

На практике RAID 5 не использует выделенный диск для контроля четности — биты контроля четности быстрее распределять по всем дискам. Но при расчете, сколько места получится при создании RAID 5, удобнее думать об этом именно так — и суммировать место на всех дисках, кроме одного. RAID 5 обеспечивает более эффективное использование пространства за счет большего количества дисков — эффективность трех дисков составляет 66%, эффективность 10 дисков составляет 90%.

При отказе одного диска RAID 5 переходит в режим деградации, при этом по его надежность начинает соответствовать RAID 0 — отказ еще одного диска будет фатальным. При замене неисправного диска массив переходит в режим реконструкции (rebuild), который сопряжен с высокой нагрузкой. Любой сбой в процессе rebuild также приводит к полной потере данных.

RAID 6 — улучшенный RAID 5

В отличие от RAID 5 этот массив использует две контрольные суммы и два диска четности, поэтому для него понадобятся минимум 4 диска, при этом допускается выход из строя двух из них. Общий объем массива всегда будет равен объему всех дисков за вычетом двух. При отказе одного диска RAID 6 выдерживает отказ еще одного, либо ошибку чтения без фатальных последствий.

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

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

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm  /
sdb                         8:16   0    2G  0 disk
sdc                         8:32   0    2G  0 disk
sdd                         8:48   0    2G  0 disk
sde                         8:64   0    2G  0 disk

Если диски уже использовались ранее, нужно их подготовить — занулить суперблоки и удалить старые метаданные и подписи.

$ sudo mdadm --zero-superblock --force /dev/sd{b,c,d,e}
mdadm: Unrecognised md component device - /dev/sdb
mdadm: Unrecognised md component device - /dev/sdc
mdadm: Unrecognised md component device - /dev/sdd
mdadm: Unrecognised md component device - /dev/sde
$ sudo wipefs --all --force /dev/sd{b,c,d,e}

Сообщение mdadm: Unrecognised md component device означает, что ранее диск не использовался в другом RAID-массиве, это не ошибка, а просто информация.

RAID 0 — чередование дисков

Массив RAID 0 будем создавать из дисков /dev/sdb и /dev/sdc с помощью команды mdadm

$ sudo mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc
mdadm: chunk size defaults to 512K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Текущее состояние массива можно посмотреть в файле /proc/mdstat

$ sudo cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid0 sdc[1] sdb[0]
      4188160 blocks super 1.2 512k chunks

unused devices: <none>

Здесь мы видим, что массив уже успел собраться, находится в активном состоянии, уровень массива raid0 и используются два диска — sdc и sdb. Иногда этой информации недостаточно — тогда можно использовать команду mdadm с опциями --detail или --examine.

Информация о созданном нами устройстве /dev/md0

$ sudo mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Sun Aug 27 10:37:20 2023
        Raid Level : raid0
        Array Size : 4188160 (3.99 GiB 4.29 GB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Aug 27 10:37:20 2023
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

            Layout : -unknown-
        Chunk Size : 512K

Consistency Policy : none

              Name : ubuntu-server:0  (local to host ubuntu-server)
              UUID : e21aedf1:bb127e97:35788f3f:33bde35b
            Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

Информация о дисках массива /dev/sdb и /dev/sdc

$ sudo mdadm --examine /dev/sd{b,c}
/dev/sdb:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : e21aedf1:bb127e97:35788f3f:33bde35b
           Name : ubuntu-server:0  (local to host ubuntu-server)
  Creation Time : Sun Aug 27 10:37:20 2023
     Raid Level : raid0
   Raid Devices : 2

 Avail Dev Size : 4188160 sectors (2045.00 MiB 2144.34 MB)
    Data Offset : 6144 sectors
   Super Offset : 8 sectors
   Unused Space : before=6064 sectors, after=0 sectors
          State : clean
    Device UUID : eb4e80a9:17563485:e13b38fd:f39bcf83

    Update Time : Sun Aug 27 10:37:20 2023
  Bad Block Log : 512 entries available at offset 8 sectors
       Checksum : 8f2f06f2 - correct
         Events : 0

     Chunk Size : 512K

   Device Role : Active device 0
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)

/dev/sdc:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : e21aedf1:bb127e97:35788f3f:33bde35b
           Name : ubuntu-server:0  (local to host ubuntu-server)
  Creation Time : Sun Aug 27 10:37:20 2023
     Raid Level : raid0
   Raid Devices : 2

 Avail Dev Size : 4188160 sectors (2045.00 MiB 2144.34 MB)
    Data Offset : 6144 sectors
   Super Offset : 8 sectors
   Unused Space : before=6064 sectors, after=0 sectors
          State : clean
    Device UUID : ffa87cdf:34afcf6d:30f3c4ca:bab9fc0e

    Update Time : Sun Aug 27 10:37:20 2023
  Bad Block Log : 512 entries available at offset 8 sectors
       Checksum : 6808f3a - correct
         Events : 0

     Chunk Size : 512K

   Device Role : Active device 1
   Array State : AA ('A' == active, '.' == missing, 'R' == replacing)

Теперь осталось только создать файловую систему на /dev/md0 и примонтировать ее, например в директорию /mnt/raid0.

$ sudo mkfs.ext4 /dev/md0
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 1047040 4k blocks and 262144 inodes
Filesystem UUID: c5d6f907-d492-4667-ad30-0a8f28439db0
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Сохранение таблицы inod'ов: done
Создание журнала (16384 блоков): готово
Writing superblocks and filesystem accounting information: готово
$ sudo mkdir /mnt/raid0
$ sudo mount /dev/md0 /mnt/raid0

Посмотрим, что теперь покажет команда lsblk

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part  /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm   /
sdb                         8:16   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0 /mnt/raid0
sdc                         8:32   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0 /mnt/raid0
sdd                         8:48   0    2G  0 disk
sde                         8:64   0    2G  0 disk

RAID 1 — зеркалирование дисков

Массив RAID 1 будем создавать из дисков /dev/sdd и /dev/sde

$ sudo mdadm --create --verbose /dev/md1 --level=1 --raid-devices=2 /dev/sdd /dev/sde
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
mdadm: size set to 2094080K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
$ sudo cat /proc/mdstat
Personalities : [raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sde[1] sdd[0]
      2094080 blocks super 1.2 [2/2] [UU]

md0 : active raid0 sdc[1] sdb[0]
      4188160 blocks super 1.2 512k chunks

unused devices: <none>

Создаем файловую систему

$ sudo mkfs.ext4 /dev/md1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 523520 4k blocks and 131072 inodes
Filesystem UUID: f0dff6e3-8b01-471c-be68-6da8353c999f
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Сохранение таблицы inod'ов: done
Создание журнала (8192 блоков): готово
Writing superblocks and filesystem accounting information: готово

Мы не будем монтировать вручную, а сделаем так, чтобы RAID-массивы собирались и монитровались при загрузке.

$ sudo mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=ubuntu-server:0 UUID=e21aedf1:bb127e97:35788f3f:33bde35b
ARRAY /dev/md1 metadata=1.2 name=ubuntu-server:1 UUID=44da46c9:0e917242:7f0e3098:69ce65b4

Редактируем файл конфигурации /etc/mdadm/mdadm.conf

$ sudo nano /etc/mdadm/mdadm.conf
# !NB! Run update-initramfs -u after updating this file.
# !NB! This will ensure that initramfs has an uptodate copy.
#
# Please refer to mdadm.conf(5) for information about this file.

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
DEVICE /dev/sd[bcde]

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md0 metadata=1.2 name=ubuntu-server:0 UUID=e21aedf1:bb127e97:35788f3f:33bde35b
ARRAY /dev/md1 metadata=1.2 name=ubuntu-server:1 UUID=44da46c9:0e917242:7f0e3098:69ce65b4

Здесь мы говорим системе, что нужно сканировать диски /dev/sdb, /dev/sdc, /dev/sdd, /dev/sde на предмет того, что они являются частью RAID-массивов — чтобы можно было эти массивы собрать.

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

$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-5.15.0-79-generic

Создадим директорию, куда будет смонтрировано устройство /dev/md1

$ sudo mkdir /mnt/raid1

Теперь нужно отредактировать файл /etc/fstab — чтобы смонтировать RAID-массивы при загрузке системы

$ sudo nano /etc/fstab
/dev/md0  /mnt/raid0  ext4  defaults  0  2
/dev/md1  /mnt/raid1  ext4  defaults  0  2

После перезагрузки системы проверяем, что RAID-массивы собраны и смонтированы в /mnt/raid0 и /mnt/raid1

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part  /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm   /
sdb                         8:16   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0 /mnt/raid0
sdc                         8:32   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0 /mnt/raid0
sdd                         8:48   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1 /mnt/raid1
sde                         8:64   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1 /mnt/raid1

RAID 1+0 — зеркалирование и чередование дисков

На этом этапе диски у меня закончились, так что добавил еще четыре. Здесь не буду подробно описывать команды, потому что все будем делать по аналогии с созданием RAID 0 и RAID 1.

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part  /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm   /
sdb                         8:16   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0 /mnt/raid0
sdc                         8:32   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0 /mnt/raid0
sdd                         8:48   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1 /mnt/raid1
sde                         8:64   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1 /mnt/raid1
sdf                         8:80   0    2G  0 disk
sdg                         8:96   0    2G  0 disk
sdh                         8:112  0    2G  0 disk
sdi                         8:128  0    2G  0 disk
$ sudo mdadm --zero-superblock --force /dev/sd{f,g,h,i}
mdadm: Unrecognised md component device - /dev/sdf
mdadm: Unrecognised md component device - /dev/sdg
mdadm: Unrecognised md component device - /dev/sdh
mdadm: Unrecognised md component device - /dev/sdi
$ sudo wipefs --all --force /dev/sd{f,g,h,i}
$ sudo mdadm --create --verbose /dev/md2 --level=10 --raid-devices=4 /dev/sdf /dev/sdg /dev/sdh /dev/sdi
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 2094080K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.
$ sudo cat /proc/mdstat
Personalities : [raid1] [raid0] [linear] [multipath] [raid6] [raid5] [raid4] [raid10]
md2 : active raid10 sdi[3] sdh[2] sdg[1] sdf[0]
      4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

md1 : active raid1 sdd[0] sde[1]
      2094080 blocks super 1.2 [2/2] [UU]

md0 : active raid0 sdc[1] sdb[0]
      4188160 blocks super 1.2 512k chunks

unused devices: <none>
$ sudo mkfs.ext4 /dev/md2
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 1047040 4k blocks and 262144 inodes
Filesystem UUID: d64ab5f7-aa9f-45fc-936a-09305d769aef
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Сохранение таблицы inod'ов: done
Создание журнала (16384 блоков): готово
Writing superblocks and filesystem accounting information: готово
$ sudo mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=ubuntu-server:0 UUID=e21aedf1:bb127e97:35788f3f:33bde35b
ARRAY /dev/md1 metadata=1.2 name=ubuntu-server:1 UUID=44da46c9:0e917242:7f0e3098:69ce65b4
ARRAY /dev/md2 metadata=1.2 name=ubuntu-server:2 UUID=96e27d52:7b07585a:e0a70b9e:85a04fcf
$ sudo nano /etc/mdadm/mdadm.conf
# !NB! Run update-initramfs -u after updating this file.
# !NB! This will ensure that initramfs has an uptodate copy.
#
# Please refer to mdadm.conf(5) for information about this file.

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
DEVICE /dev/sd[bcdefghi]

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md0 metadata=1.2 name=ubuntu-server:0 UUID=e21aedf1:bb127e97:35788f3f:33bde35b
ARRAY /dev/md1 metadata=1.2 name=ubuntu-server:1 UUID=44da46c9:0e917242:7f0e3098:69ce65b4
ARRAY /dev/md2 metadata=1.2 name=ubuntu-server:2 UUID=96e27d52:7b07585a:e0a70b9e:85a04fcf
$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-5.15.0-79-generic
$ sudo mkdir /mnt/raid10
$ sudo nano /etc/fstab
/dev/md0  /mnt/raid0   ext4  defaults  0  2
/dev/md1  /mnt/raid1   ext4  defaults  0  2
/dev/md2  /mnt/raid10  ext4  defaults  0  2

Перезагружаемся и смотрим, что получилось

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part   /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm    /
sdb                         8:16   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdc                         8:32   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdd                         8:48   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1  /mnt/raid1
sde                         8:64   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1  /mnt/raid1
sdf                         8:80   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdg                         8:96   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdh                         8:112  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdi                         8:128  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10

Замена диска в массиве

Давайте заменим диск /dev/sde, который входит в массив RAID 1, на диск /dev/sdj.

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part   /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm    /
sdb                         8:16   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdc                         8:32   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdd                         8:48   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1  /mnt/raid1
sde                         8:64   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1  /mnt/raid1
sdf                         8:80   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdg                         8:96   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdh                         8:112  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdi                         8:128  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdj                         8:144  0    2G  0 disk

Помечаем диск /dev/sde как сбойный

$ sudo mdadm /dev/md1 --fail /dev/sde
mdadm: set /dev/sde faulty in /dev/md1

Удаляем из массива отказавший диск

$ sudo mdadm /dev/md1 --remove /dev/sde
mdadm: hot removed /dev/sde from /dev/md1

Добавляем в массив новый диск /dev/sdj

$ sudo mdadm /dev/md1 --add /dev/sdj
mdadm: added /dev/sdj

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

$ sudo cat /proc/mdstat
Personalities : [raid0] [raid10] [raid1] [linear] [multipath] [raid6] [raid5] [raid4]
md2 : active raid10 sdg[1] sdi[3] sdh[2] sdf[0]
      4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

md1 : active raid1 sdj[2] sdd[0]
      2094080 blocks super 1.2 [2/2] [UU]

md0 : active raid0 sdc[1] sdb[0]
      4188160 blocks super 1.2 512k chunks

unused devices: <none>

Для md1 видим [UU] — это значит, что оба диска готовы к работе. Если видим [U_] — это значит, что второй диск еще не готов и нужно какое-то время подождать. При этом будет видно, что именно сейчас происходит — reshape (изменение структуры), recovery (восстановление данных), resync (синхронизация данных). И сколько времени нужно подождать до готовности finish=0.1min.

$ sudo cat /proc/mdstat
Personalities : [raid0] [raid10] [raid1] [linear] [multipath] [raid6] [raid5] [raid4]
md2 : active raid10 sdg[1] sdi[3] sdh[2] sdf[0]
      4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

md1 : active raid1 sdj[2] sdd[0]
      2094080 blocks super 1.2 [2/1] [U_]
      [======>..............]  recovery = 30.0% (628928/2094080) finish=0.1min speed=209642K/sec

md0 : active raid0 sdc[1] sdb[0]
      4188160 blocks super 1.2 512k chunks

unused devices: <none>
В общем случае, после добавления диска с помощью опции add — нужно расширить RAID-массив с помощью опции grow. Но в данном случае этого не требуется — потому что дисков в массиве должно быть минимум два, а у нас остался только один — так что расширение произойдет автоматически.

Нам нужно изменить файл конфигурации /etc/mdadm/mdadm.conf — чтобы не сканировать диск /dev/sde на вхождение в RAID-массив — но при этом сканировать диск /dev/sdj.

$ sudo nano /etc/mdadm/mdadm.conf
# !NB! Run update-initramfs -u after updating this file.
# !NB! This will ensure that initramfs has an uptodate copy.
#
# Please refer to mdadm.conf(5) for information about this file.

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
DEVICE /dev/sd[bcdfghij]

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md0 metadata=1.2 name=ubuntu-server:0 UUID=e21aedf1:bb127e97:35788f3f:33bde35b
ARRAY /dev/md1 metadata=1.2 name=ubuntu-server:1 UUID=44da46c9:0e917242:7f0e3098:69ce65b4
ARRAY /dev/md2 metadata=1.2 name=ubuntu-server:2 UUID=96e27d52:7b07585a:e0a70b9e:85a04fcf

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

$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-5.15.0-79-generic

Перезагружаемся и смотрим, что получилось

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part   /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm    /
sdb                         8:16   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdc                         8:32   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdd                         8:48   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1  /mnt/raid1
sde                         8:64   0    2G  0 disk
sdf                         8:80   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdg                         8:96   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdh                         8:112  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdi                         8:128  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdj                         8:144  0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1  /mnt/raid1

Следовало бы еще затереть суперблоки диска /dev/sde, чтобы из-за ошибки при редактировании mdadm.conf — он не был включен в RAID-массив. Всегда лучше перестраховаться — но мы это сделаем буквально на следующем шаге.

Добавление диска в массив

Мы удалили диск /dev/sde из массива RAID 1 — давайте снова добавим его в массив RAID 1 — так у нас будет три копии данных.

Затираем суперблоки диска /dev/sde

$ sudo mdadm --zero-superblock --force /dev/sde

Добавляем в массив новый диск /dev/sde

$ sudo mdadm /dev/md1 --add /dev/sde
mdadm: added /dev/sde

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

$ sudo cat /proc/mdstat
Personalities : [raid1] [raid0] [raid10] [linear] [multipath] [raid6] [raid5] [raid4]
md0 : active raid0 sdc[1] sdb[0]
      4188160 blocks super 1.2 512k chunks

md2 : active raid10 sdh[2] sdg[1] sdi[3] sdf[0]
      4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

md1 : active raid1 sde[3](S) sdj[2] sdd[0]
      2094080 blocks super 1.2 [2/2] [UU]

unused devices: <none>

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

$ sudo mdadm /dev/md1 --grow --raid-devices=3
raid_disks for /dev/md1 set to 3

Обратите внимание, какой результат выдает команда

$ sudo cat /proc/mdstat
Personalities : [raid1] [raid0] [raid10] [linear] [multipath] [raid6] [raid5] [raid4]
md0 : active raid0 sdc[1] sdb[0]
      4188160 blocks super 1.2 512k chunks

md2 : active raid10 sdh[2] sdg[1] sdi[3] sdf[0]
      4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

md1 : active raid1 sde[3] sdj[2] sdd[0]
      2094080 blocks super 1.2 [3/3] [UUU]

unused devices: <none>

До выполнения команды grow — было два диска в работе [UU] и третий запасной. После выполнения команды grow — стало три диска в работе [UUU]. Что такое запасной диск — рассмотрим чуть позже.

Дальше нужно опять отредактировать файл /etc/mdadm/mdadm.conf — чтобы сканировать диск /dev/sde и выполнить команду update-initramfs -u — не буду еще раз описывать это. Перезагружаемся и смотрим результат.

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part   /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm    /
sdb                         8:16   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdc                         8:32   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdd                         8:48   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1  /mnt/raid1
sde                         8:64   0    2G  0 disk
└─md1                       9:1    0    2G  0 raid1  /mnt/raid1
sdf                         8:80   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdg                         8:96   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdh                         8:112  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdi                         8:128  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdj                         8:144  0    2G  0 disk

Полное удаление массива

Давайте теперь удалим наш многострадальный массив RAID 1 — чтобы использовать освободившиеся диски для других задач.

Сначала нужно размонтировать

$ sudo umount /dev/md1

Потом — остановить массив

$ sudo mdadm --stop /dev/md1
mdadm: stopped /dev/md1

И затереть суперблоки дисков

$ sudo mdadm --zero-superblock --force /dev/sd{d,e,j}

Посмотрим, какие массивы остались

$ sudo cat /proc/mdstat
Personalities : [raid1] [raid0] [raid10] [linear] [multipath] [raid6] [raid5] [raid4]
md2 : active raid10 sdf[0] sdg[1] sdh[2] sdi[3]
      4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

md0 : active raid0 sdc[1] sdb[0]
      4188160 blocks super 1.2 512k chunks

unused devices: <none>
$ sudo mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=ubuntu-server:0 UUID=e21aedf1:bb127e97:35788f3f:33bde35b
ARRAY /dev/md2 metadata=1.2 name=ubuntu-server:2 UUID=96e27d52:7b07585a:e0a70b9e:85a04fcf

Теперь нужно отредактировать файл /etc/mdadm/mdadm.conf — убрать одну запись ARRAY. Какие диски сканировать — не будем изменять, пусть остаются все, то есть /dev/sd[bcdefghij]. Потому что чуть позже добавим три свободных диска в RAID 0. Выполняем команду update-initramfs -u и удаляем из файла /etc/fstab запись для монтирования /dev/md1. Перезагружаемся и смотрим, что получилось.

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part   /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm    /
sdb                         8:16   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdc                         8:32   0    2G  0 disk
└─md0                       9:0    0    4G  0 raid0  /mnt/raid0
sdd                         8:48   0    2G  0 disk
sde                         8:64   0    2G  0 disk
sdf                         8:80   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdg                         8:96   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdh                         8:112  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdi                         8:128  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdj                         8:144  0    2G  0 disk

Опции add, remove и grow

Опция add команды mdadm добавляет запасной диск в RAID-массив, опция remove удаляет запасной диск. Этот запасной диск не будет использоваться, пока с остальными дисками массива все в порядке. Но если один из дисков выходит из строя — то этот диск будет использован вместо основного. Опция grow позволяет включить запасной диск в активную работу — он уже не будет запасным, а будет работать наравне с остальными.

Массивы RAID 0 не могут иметь запасного диска, поскольку это никак не поможет восстановить поврежденный массив. Поэтому для добавления нового диска нужно использовать одновременно опции add и grow. У нас как раз есть три свободных диска — присоединим их к RAID 0.

$ sudo mdadm /dev/md0 --grow --raid-devices=5 --add /dev/sdd /dev/sde /dev/sdj
mdadm: level of /dev/md0 changed to raid4
mdadm: added /dev/sdd
mdadm: added /dev/sde
mdadm: added /dev/sdj
$ sudo cat /proc/mdstat
Personalities : [raid0] [raid10] [linear] [multipath] [raid1] [raid6] [raid5] [raid4]
md2 : active raid10 sdh[2] sdf[0] sdi[3] sdg[1]
      4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

md0 : active raid0 sdj[5] sde[4] sdd[3] sdb[0] sdc[1]
      10470400 blocks super 1.2 512k chunks

unused devices: <none>

Перезагружаемся и смотрим, что получилось

$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINTS
sda                         8:0    0 20,3G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0  1,8G  0 part   /boot
└─sda3                      8:3    0 18,5G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   10G  0 lvm    /
sdb                         8:16   0    2G  0 disk
└─md0                       9:0    0   10G  0 raid0  /mnt/raid0
sdc                         8:32   0    2G  0 disk
└─md0                       9:0    0   10G  0 raid0  /mnt/raid0
sdd                         8:48   0    2G  0 disk
└─md0                       9:0    0   10G  0 raid0  /mnt/raid0
sde                         8:64   0    2G  0 disk
└─md0                       9:0    0   10G  0 raid0  /mnt/raid0
sdf                         8:80   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdg                         8:96   0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdh                         8:112  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdi                         8:128  0    2G  0 disk
└─md2                       9:2    0    4G  0 raid10 /mnt/raid10
sdj                         8:144  0    2G  0 disk
└─md0                       9:0    0   10G  0 raid0  /mnt/raid0

Из массива RAID 0 нельзя удалить диск — потому что это означает разрушение массива и потерю всех данных.

Остановка и запуск массива

Остановка массива

$ sudo mdadm --stop /dev/md0
mdadm: stopped /dev/md0
$ sudo cat /proc/mdstat
Personalities : [raid10] [raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4]
md2 : active raid10 sdi[3] sdg[1] sdh[2] sdf[0]
      4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

unused devices: <none>

Запуск массива

$ sudo mdadm --assemble /dev/md0
mdadm: /dev/md0 has been started with 5 drives.
$ sudo cat /proc/mdstat
Personalities : [raid10] [raid0] [linear] [multipath] [raid1] [raid6] [raid5] [raid4]
md0 : active raid0 sdb[0] sdd[3] sde[4] sdj[5] sdc[1]
      10470400 blocks super 1.2 512k chunks

md2 : active raid10 sdi[3] sdg[1] sdh[2] sdf[0]
      4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

unused devices: <none>

Дополнительно

Поиск: CLI • Linux • Команда • mdadm • RAID • Файловая система • Блочное устройство

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.