Linux. Команда mdadm
27.08.2023
Теги: CLI • Linux • БлочноеУстройство • Команда • ФайловаяСистема
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 5 — контроль четности
Вместо дублирования данных, как в RAID 1, в RAID 5 используется гораздо более эффективный метод — контроль четности. Вместо хранения копии данных — RAID 5 сохраняет бит четности. Все диски, кроме одного, используются как обычный массив RAID 0, а последний диск используется для контроля четности. Если один из дисков выходит из строя, можно выполнить вычисление четности в обратном порядке, чтобы восстановить все данные на любом из дисков.
На практике 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>
Дополнительно
- Управление RAID-массивами с помощью mdadm в Ubuntu 16.04
- How To Manage RAID Arrays with mdadm on Ubuntu 22.04
- Команда mdadm в Linux
Поиск: CLI • Linux • Команда • mdadm • RAID • Файловая система • Блочное устройство