Создание настройка и мониторинг RAID1

2023.10.11
Создадим избыточный RAID1 массив из нескольких дисков для хранения данных, настроим файловую систему и автозагрузку, рассмотрим мониторинг состояния.

RAID1 - это избыточное хранение данных, зеркалирование. Ставим N дисков, а используем как 1. Кажется нерационально, но не хочется в случае поломки диска ломать голову как восстановить данные.

Я ставил NMVE в RAID1, однако из исследования Google ясно что технология памяти не имеет отношения к надежности и даже среди самых надежных моделей SSD у 20% наблюдалась 1 неисправимая ошибка чтения, у менее надежных 63% (подсмотрено в книге "Unix и Linux руководство системного администратора").

Поэтому подстрахуемся и сделаем отказоучстойчивое хранилище данных.

Ниже речь идет о создании RAID1 для хранения данных, это не подходит для установки ОС.

Подготовка дисков

Нам нужно 2 диска одинакового объема. На самом деле нам нужны 2 раздела на одном диске или на двух разных дисках, и эти разделы должны быть одного размера.

Список дисков

Список дисковых устройств c разделами можно просмотреть через lsblk:

$ sudo lsblk
sda                         8:0    0    20G  0 disk 
├─sda1                      8:1    0     1M  0 part 
├─sda2                      8:2    0   1.8G  0 part /boot
└─sda3                      8:3    0  18.2G  0 part 
  └─ubuntu--vg-ubuntu--lv 253:0    0    10G  0 lvm  /
sdb                         8:16   0     5G  0 disk 
sdc                         8:32   0     5G  0 disk

Или через fdisk:

$ sudo fdisk -l
...
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 9BE34257-B9A0-438B-AC51-F337CCD75C5A

Device       Start      End  Sectors  Size Type
/dev/sda1     2048     4095     2048    1M BIOS boot
/dev/sda2     4096  3719167  3715072  1.8G Linux filesystem
/dev/sda3  3719168 41940991 38221824 18.2G Linux filesystem

...


Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: QEMU HARDDISK   
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/sdc: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: QEMU HARDDISK   
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/sda размечен и имеет таблицу из 3-х разделов, а диски /dev/sdb и /dev/sdc не размечены. Эти 2 диска мы будем использовать для построения RAID1 массива.

Просмотреть информацию по конкретному диску:

$ sudo fdisk -l /dev/sdb

Очистка дисков

Для начала нужно стереть все метаданные (магические строки с метками, подписями и прочим) для избежания конфликтов:

$ sudo wipefs --all --force /dev/sdb /dev/sdc

Создание таблицы разделов

Теперь нам нужно разметить наши диски /dev/sdb и /dev/sdc, пусть каждый из них всем своим доступным пространством участвует в RAID1 массиве.

Используем fdisk и указываем диск, с которым будем работать:

$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.37.2).
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 0xcca90513.

Command (m for help):

Диск доступен для манипуляций, а fdisk приглашает к вводу команд. Для просмотра всего списка можно ввести m.

fdisk по умолчанию создает MBR схему, для схемы GPT нужно использовать аналогичную программу gdisk.

Просмотрим список разделов диска, чтобы убедиться что диск пуст, для этого нужно ввести p и enter:

Command (m for help): p
Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xcca90513

Диск пуст, на нем нет разделов.

fdisk копит введенные изменения и применяет их к диску по команде w, если что-то пошло не так можно выйти без сохранения введя q или Ctrl+C.

Теперь создаем новый первичный раздел, для этого вводим n (выбираем p или просто enter):

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p):

Номер раздела выбираем 1 (или просто enter):

Partition number (1-4, default 1):

Начало первого сектора 2048 (или просто enter):

First sector (2048-10485759, default 2048):

Вводим конец сектора 10485759 чтобы создать раздел на все доступное пространство (или просто enter):

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.

Теперь нужно указать тип раздела, иначе он не будет создан. Чтобы просмотреть все доступные типы можно ввести l:

Command (m for help): l

00 Empty            24 NEC DOS          81 Minix / old Lin  bf Solaris        
01 FAT12            27 Hidden NTFS Win  82 Linux swap / So  c1 DRDOS/sec (FAT-
02 XENIX root       39 Plan 9           83 Linux            c4 DRDOS/sec (FAT-
03 XENIX usr        3c PartitionMagic   84 OS/2 hidden or   c6 DRDOS/sec (FAT-
04 FAT16 <32M       40 Venix 80286      85 Linux extended   c7 Syrinx         
05 Extended         41 PPC PReP Boot    86 NTFS volume set  da Non-FS data    
06 FAT16            42 SFS              87 NTFS volume set  db CP/M / CTOS / .
07 HPFS/NTFS/exFAT  4d QNX4.x           88 Linux plaintext  de Dell Utility   
08 AIX              4e QNX4.x 2nd part  8e Linux LVM        df BootIt         
09 AIX bootable     4f QNX4.x 3rd part  93 Amoeba           e1 DOS access     
0a OS/2 Boot Manag  50 OnTrack DM       94 Amoeba BBT       e3 DOS R/O        
0b W95 FAT32        51 OnTrack DM6 Aux  9f BSD/OS           e4 SpeedStor      
0c W95 FAT32 (LBA)  52 CP/M             a0 IBM Thinkpad hi  ea Linux extended 
0e W95 FAT16 (LBA)  53 OnTrack DM6 Aux  a5 FreeBSD          eb BeOS fs        
0f W95 Ext'd (LBA)  54 OnTrackDM6       a6 OpenBSD          ee GPT            
10 OPUS             55 EZ-Drive         a7 NeXTSTEP         ef EFI (FAT-12/16/
11 Hidden FAT12     56 Golden Bow       a8 Darwin UFS       f0 Linux/PA-RISC b
12 Compaq diagnost  5c Priam Edisk      a9 NetBSD           f1 SpeedStor      
14 Hidden FAT16 <3  61 SpeedStor        ab Darwin boot      f4 SpeedStor      
16 Hidden FAT16     63 GNU HURD or Sys  af HFS / HFS+       f2 DOS secondary  
17 Hidden HPFS/NTF  64 Novell Netware   b7 BSDI fs          fb VMware VMFS    
18 AST SmartSleep   65 Novell Netware   b8 BSDI swap        fc VMware VMKCORE 
1b Hidden W95 FAT3  70 DiskSecure Mult  bb Boot Wizard hid  fd Linux raid auto
1c Hidden W95 FAT3  75 PC/IX            bc Acronis FAT32 L  fe LANstep        
1e Hidden W95 FAT1  80 Old Minix        be Solaris boot     ff BBT

Для указания типа раздела вводим t и указываем hex код типа раздела fd (Linux raid auto):

Command (m for help): t
Selected partition 1
Hex code or alias (type L to list all): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'.

Смотрим что получилось (p):

Command (m for help): p
Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xcca90513

Device     Boot Start      End  Sectors Size Id Type
/dev/sdb1        2048 10485759 10483712   5G fd Linux raid autodetect

Все верно, теперь записываем изменения да диск (ввод w):

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Проделываем тоже самое с диском /dev/sdc. Затем смотрим lsblk с выводом дополнительного столбца PARTTYPE чтобы показать тип раздела (hex код), в итоге у нас должно получиться примерно так:

$ sudo lsblk -o +PARTTYPE
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS       PARTTYPE
sdb                         8:16   0     5G  0 disk                   
└─sdb1                      8:17   0     5G  0 part                   0xfd
sdc                         8:32   0     5G  0 disk                   
└─sdc1                      8:33   0     5G  0 part                   0xfd

Создание RAID1

Создаем RAID1 из подготовленных разделов на дисках:

$ sudo mdadm --create --verbose /dev/md0 -l 1 -n 2 /dev/sdb1 /dev/sdc1

где:

mdadm запросит подтверждение для продолжения:

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 чтобы продолжить, а финальное сообщение должно быть таким:

mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Теперь lsblk должен показать что в каждом диске массива появился раздел md0, к которому можно обращаться как /dev/md0:

$ sudo lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sdb                         8:16   0     5G  0 disk  
└─sdb1                      8:17   0     5G  0 part  
└─md0                       9:0    0     5G  0 raid1
sdc                         8:32   0     5G  0 disk  
└─sdc1                      8:33   0     5G  0 part  
└─md0                       9:0    0     5G  0 raid1

Автозагрузка дисков RAID

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

$ sudo mdadm --detail --scan --verbose | sudo tee -a /etc/mdadm/mdadm.conf

Обновляем initramfs:

$ sudo update-initramfs -u

Файловая система и монтирвоание при старте системы

Прикручиваем файловую систему ext4:

$ sudo mkfs -t ext4 /dev/md0

Создаем директорию для монтирования и монтируем:

$ sudo mkdir /mnt/md0
$ sudo mount /dev/md0 /mnt/md0

Теперь диск /dev/md0 можно использовать по пути /mnt/md0, а чтобы он был доступен сразу при загрузке системы:

$ sudo echo "/dev/md0 /mnt/md0 ext4 defaults 0 0" >> /etc/fstab

Отключение резервации пространства

Если теперь взглянуть на доступное пространство нашего RAID1, то окажется что оно меньше чем мы ожидаем:

df -h
Filesystem                         Size  Used Avail Use% Mounted on
...
/dev/md0                           4.9G   24K  4.6G   1% /mnt/md0

Файловая система ext4 по умолчанию резервирует 5% пространства чтобы гарантировать привилегированным процессам дополнительное пространство для использования в случае заполнения диска. Подробнее об этом можно почитать здесь и здесь.

В своем домашнем сервере я использую RAID1 из двух NMVE дисков по 1ТБ каждый как хранилище данных для Proxmox, поэтому резервация пространства мне не нужна., отключить ее можно так:

$ sudo tune2fs -m 0 /dev/md0

Мониторинг состояния RAID

Узнать состояние всех RAID устройств:

$ sudo cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdc1[1] sdb1[0]
5236736 blocks super 1.2 [2/2] [UU]

Детальная информация по конкретному RAID:

$ sudo mdadm --detail /dev/md0
/dev/md0:
              Version : 1.2
        Creation Time : Tue Oct 10 18:46:25 2023
           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 : 2
          Persistence : Superblock is persistent
        
          Update Time : Tue Oct 10 18:46:51 2023
                State : clean 
       Active Devices : 2
      Working Devices : 2
       Failed Devices : 0
        Spare Devices : 0

   Consistency Policy : resync

                 Name : consul:0  (local to host consul)
                 UUID : fa35b82f:4c74db0f:6521564e:c0c96eaf
               Events : 17

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1

Детальная информация по конкретному устройству в составе RAID:

$ sudo mdadm --examine /dev/sdb1 /dev/sdc1
/dev/sdb1:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : fa35b82f:4c74db0f:6521564e:c0c96eaf
           Name : consul:0  (local to host consul)
  Creation Time : Tue Oct 10 18:46:25 2023
     Raid Level : raid1
   Raid Devices : 2

 Avail Dev Size : 10473472 sectors (4.99 GiB 5.36 GB)
     Array Size : 5236736 KiB (4.99 GiB 5.36 GB)
    Data Offset : 10240 sectors
   Super Offset : 8 sectors
   Unused Space : before=10160 sectors, after=0 sectors
          State : clean
    Device UUID : 99d9bef5:2a04ffa5:6da4dff6:d36f46ea

    Update Time : Tue Oct 10 18:46:51 2023
  Bad Block Log : 512 entries available at offset 16 sectors
       Checksum : d2a4b311 - correct
         Events : 17

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

Протестировать скорость работы md0 диска можно так:

$ sudo dd if=/dev/zero of=/mnt/md0/file bs=1G count=2
2+0 records in
2+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 5.71684 s, 376 MB/s

Не забываем удалить тестовый файл:

$ sudo rm /mnt/md0/file

Вывод

Оказывается в создании RAID1 ничего сложного, просто нужно:

А потом можно убирать и возвращать диски по очереди (не на горяую) и наблюдать как все работает безотказно.

В телеграм канале DevOps от первого лица можно оставить комментарий или почитать интересные истории из практики DevOps