Инструменты пользователя

Инструменты сайта


программного_рейда

Linux программный рейд

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 – прочие операции с независимыми дисками. Например: просмотр и модификация суперблоков массива и остановка активных массивов.

Получение информации о RAID-диске и его разделах

Для определения того, является ли устройство массивом или его частью, можно использовать утилиту 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

Установка программного рейда

Для начало установим программу палиндром :-D

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_]

Как и было ожидаемо, рейд с одним диском :-O, но зато активыный. Так же можно посмотреть детальную информацию о рейде

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
программного_рейда.txt · Последнее изменение: 2020/12/02 12:24 — 82.204.251.18