mdadm — утилита для управления программными RAID массивами в Linux (Linux Software Raid), ранее известная, как mdctl. MD — сокращение от Multiple Devices.
С помощью mdadm можно выполнять 7 групп операций:
Create
– создание RAID-массива из нескольких дисков (с суперблоком на каждом устройстве).Assemble
– сборка (ранее созданного) массива и его активация. Диски из которых собирается массив могут указываться явно или будет выполнен их автоматический поиск. mdadm проверяет, образуют ли компоненты корректный массив.Build
– объединение дисков в массив (без суперблоков). Для таких массивов mdadm не различает создание и последующую сборку. Также невозможно проверить, были ли указаны необходимые устройства в верном порядке. Не используйте этот режим, если вы не знаете зачем это нужно.Manage
– Управление массивом: добавление новых свободных дисков (spares) и удаление неработоспособных (faulty devices).Follow/Monitor
– Следить за одним или несколькими md-устройствами и реагировать на изменение их состояния. Это имеет смысл только для массивов уровней 1, 4, 5, 6 или multipath-массивов, так как только они могут иметь различные состояния. raid0 или linear не могут иметь недостающих, запасных или сбойных дисков, поэтому там не за чем следить.Grow
– расширение или уменьшение размера (shrink) массива, либо иное его реформирование (reshape). На данный момент поддерживается изменение активного размера компонентов в RAID-массивах уровней 1/4/5/6, а также изменение количества активных устройств в RAID1.Misc
– прочие операции с независимыми дисками. Например: просмотр и модификация суперблоков массива и остановка активных массивов.
Для определения того, является ли устройство массивом или его частью, можно использовать утилиту mdadm с ключом -Q
(–query). Указанные в этом разделе операции относятся к группе прочих, но указывать ключ (–misc) необязательно. Ключ Q
также можно не указывать – если в параметрах mdadm указано только дисковое устройства, то этот ключ подразумевается по умолчанию. В примере ниже проверяются три устройства:
Обычный раздел (не часть массива):
mdadm -Q /dev/sdd1 /dev/sdd1: is not an md array
Раздел, являющийся частью массива:
mdadm -Q /dev/sdb1 /dev/sdb1: device 0 in 2 device active raid1 /dev/md0. Use mdadm --examine for more detail.
Раздел диска, снятого с другого компьютера, где он был частью массива:
mdadm -Q /dev/sde2 /dev/sde2: is not an md array /dev/sde2: device 6 in 8 device undetected raid5 /dev/md2. Use mdadm --examine for more detail.
Массив целиком:
mdadm -Q /dev/md0 /dev/md0: 7451.91GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail.
Более подробную информацию о массиве в целом или его части можно получить используя соответственно ключи -D
(–detail) и -E
(–examine). В обоих случаях выводится почти одинаковая информация, но с ключом -D
нужно указывать имя массива, а с ключом -E
указывается имя одного из разделов RAID-диска. Причем массив должен быть запущен, а для раздела это не важно – главное, чтобы он был частью хоть какого-либо массива.
mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Tue Nov 24 12:23:31 2020 Raid Level : raid1 Array Size : 7813893440 (7451.91 GiB 8001.43 GB) Used Dev Size : 7813893440 (7451.91 GiB 8001.43 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Wed Dec 2 08:11:45 2020 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Consistency Policy : bitmap Name : dh:0 (local to host dh) UUID : 3b2c1fef:89167a66:27d20a52:c8acd873 Events : 10663 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 33 1 active sync /dev/sdc1
Создаем RAID 1 (mirroring — «зеркалирование») — массив из двух (или более) дисков, являющихся полными копиями друг друга. В качестве подопытных два жестких диска по 5GB, посмотрим на них
fdisk -l ... Disk /dev/sdc: 5 GiB, 5368709120 bytes, 10485760 sectors Disk model: Virtual disk Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdd: 5 GiB, 5368709120 bytes, 10485760 sectors Disk model: Virtual disk Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes ...
Создадим разделы на дисках. Раздел на диске будет первичный, занимать все свободное место.
fdisk /dev/sdc Welcome to fdisk (util-linux 2.34). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0x547db1eb. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): First sector (2048-10485759, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-10485759, default 10485759): Created a new partition 1 of type 'Linux' and of size 5 GiB.
Установим метку диска, выбирав нужный код. В нашем случае это – fd Linux raid auto
Command (m for help): t Selected partition 1 Hex code (type L to list all codes): fd Changed type of partition 'Linux' to 'Linux raid autodetect'.
И не забываем записать изменения w
Смотрим, что получилось
fdisk /dev/sdc Welcome to fdisk (util-linux 2.34). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): i Selected partition 1 Device: /dev/sdc1 Start: 2048 End: 10485759 Sectors: 10483712 Cylinders: 1449 Size: 5G Id: fd Type: Linux raid autodetect Start-C/H/S: 0/32/33 End-C/H/S: 652/180/40
Повторим все вышеприведенные операции для второго диска – /dev/sdd
Для начало установим программу палиндром
apt install mdadm
Создаем RAID1 из размеченных выше дисков
mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1 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 5236736K Continue creating array? (y/n) y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
Этот пример создаёт массив RAID 1 из двух разделов: один из sdc1
и второй из sdd1
. Несколько дисков можно указывать с помощью шаблона, например /dev/sd[ac]2
или /dev/sd[a-f]1
.
--create
– (или сокращённо -С) команда создания/dev/md0
имя устройства создаваемого виртуального раздела--level=1
–(или сокращённо -l 1) уровень RAID. Cправочник по использованию mdadm – man mdadm
--raid-devices=2
– (или сокращённо -n 2): количество устройств/dev/sdc1
– первый диск в массиве/dev/sdd1
– второй дискМожно проследить за созданием рейда
watch cat /proc/mdstat
Но так как добавляемые в рейд диски очень малы, рейд создался мгновенно.
Далее, внесем изменения в файл /etc/mdadm/mdadm.conf
. Перезапишем его, добавив следующие строки
echo 'DEVICE partitions' > /etc/mdadm/mdadm.conf
mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf
И посмотрим на конфигуратор
cat /etc/mdadm/mdadm.conf DEVICE partitions ARRAY /dev/md0 level=raid1 num-devices=2 metadata=1.2 name=a-host2:0 UUID=a474ebf6:4fc79b68:3fcc9b50:b4642a35
Проверяем, что получилось. Видим, что появилось отдельное устройство на 5GB, на котором отсутствует таблица разделов.
Disk /dev/md0: 4,102 GiB, 5362417664 bytes, 10473472 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
Разметим /dev/md0
fdisk /dev/md0 Welcome to fdisk (util-linux 2.34). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0xd1bd9918. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): First sector (2048-10473471, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-10473471, default 10473471): Created a new partition 1 of type 'Linux' and of size 5 GiB. Command (m for help): t Selected partition 1 Hex code (type L to list all codes): 83 Changed type of partition 'Linux' to 'Linux'. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
Опять смотри через fdisk
Device Boot Start End Sectors Size Id Type /dev/md0p1 2048 10473471 10471424 5G 83 Linux
И создаем файловую систему
mkfs.ext4 /dev/md0p1
Раздел готов.
Для начало проверим, что с рейдом все в порядке
cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sdd1[1] sdc1[0] 5236736 blocks super 1.2 [2/2] [UU] unused devices: <none>
Создадим директорию для монтирования
mkdir /data
после перезагрузки, рейд стал определяться как
/dev/md127p1 2048 10473471 10471424 5G 83 Linux
монтируем устройство
mount /dev/md127p1 /data
Назначаем владельца и права доступа к данной директории. Но так как работаем от root, этот шаг пропускаем. Смотрим на директорию
stat /data File: /data Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 10300h/66304d Inode: 2 Links: 3 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2020-09-22 09:24:56.000000000 +0000 Modify: 2020-09-22 09:24:56.000000000 +0000 Change: 2020-09-22 09:24:56.000000000 +0000
Нагенерируем немного данных для проверки
mkdir /data/directory touch /data/file.test uptime > /data/uptime.test date > /data/date.test
смотрим
ls -la /data/ total 28 drwxr-xr-x 4 root root 4096 сен 22 09:56 . drwxr-xr-x 21 root root 4096 сен 22 09:33 .. drwxr-xr-x 2 root root 4096 сен 22 09:55 directory -rw-r--r-- 1 root root 0 сен 22 09:56 file.test drwx------ 2 root root 16384 сен 22 09:24 lost+found
по наличию директории lost+found
можно понять, что это отдельный том
Пришло время настроить автомантирование рейда. Смотрим на UUID тома
blkid /dev/md127p1 /dev/md127p1: UUID="1ad4c71b-84ec-4d58-8fbc-ae01fe1e5374" TYPE="ext4" PARTUUID="d1bd9918-01"
добавим соответствующею запись в /etc/fstab
# Raid 1.0 UUID="1ad4c71b-84ec-4d58-8fbc-ae01fe1e5374" /data ext4 defaults 0 0
Перезагружаемся и смотрим, что все подмонтировалось
Для избежания возможных ошибок, исправим отображение рейда, сейчас он отображается как /dev/md127p1
, хотя в конфигураторе /etc/mdadm/mdadm.conf
было указано md0
Для исправления, обновим текущий ramdisk
Initramfs, сокращенно от “initial RAM file system”, является приемником initrd (initial ramdisk). Это cpio (copy in and out) архив исходной файловой системы, который загружается в память во время процесса запуска Linux. Linux копирует содержимое архива в rootfs (которая может быть основана на ramfs либо на tmpfs), а затем запускает init. Init предназначен для выполнения определенных задач до того, как реальная или финальная файловая система будет установлена поверх rootfs. Таким образом, initramfs должен содержать все драйвера устройств и инструменты, необходимые для установки конечной корневой файловой системы.
update-initramfs -u
После перезагрузки, все вернулось на круги своя
cat /proc/mdstat Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sdc1[0] sdd1[1] 5236736 blocks super 1.2 [2/2] [UU]
Для проведения опыты, удалим физически из рейда диск /dev/sdd
. После перезагрузки, будит видно, что рейд не активный, и состоит из одного диска
cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : inactive sdc1[0](S) 5236736 blocks super 1.2 unused devices: <none>
После выхода из строя одного из диска, рейд размонтировался и доступа к данным нет. Для начала, хоть рейд и не активный остановим его
mdadm --stop /dev/md0 mdadm: stopped /dev/md0
теперь пересоберем рейд
mdadm --assemble --scan mdadm: /dev/md0 has been started with 1 drive (out of 2).
Теперь осталось дело за малым, примонтируем рейд обратно
mount /dev/md0p1 /data
Теперь восстановим рейд в исходное состояние. Вставим новый пустой диск. Перезагружаемся. Система грузится без предупреждений. Посмотрим на рейд
cat /proc/mdstat Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sdc1[0] 5236736 blocks super 1.2 [2/1] [U_]
Как и было ожидаемо, рейд с одним диском , но зато активыный. Так же можно посмотреть детальную информацию о рейде
mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Tue Sep 22 08:51:05 2020 Raid Level : raid1 Array Size : 5236736 (4.99 GiB 5.36 GB) Used Dev Size : 5236736 (4.99 GiB 5.36 GB) Raid Devices : 2 Total Devices : 1 Persistence : Superblock is persistent Update Time : Tue Sep 22 13:07:58 2020 State : clean, degraded Active Devices : 1 Working Devices : 1 Failed Devices : 0 Spare Devices : 0 Consistency Policy : resync Name : a-host2:0 (local to host a-host2) UUID : a474ebf6:4fc79b68:3fcc9b50:b4642a35 Events : 41 Number Major Minor RaidDevice State 0 8 33 0 active sync /dev/sdc1 - 0 0 1 removed
Произведем разметку новго диска и укажем его как второй диск для рейд массива.
mdadm /dev/md0 --add /dev/sdd1 mdadm: added /dev/sdd1
смотрим
cat /proc/mdstat Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sdd1[2] sdc1[0] 5236736 blocks super 1.2 [2/2] [UU]
Рейд восстановлен
Останавливаем массив:
mdadm -S /dev/md0
Очищаем суперблоки RAID на разделах, из которых собран массив:
mdadm --zero-superblock /dev/sd[a-e]1