Software RAID5

Всем привет. Это короткая заметка-шпаргалка, оставленная для того, чтобы в случае аварии обратиться к ней. Во время написания все команды выполнялись на «живом» массиве в спокойной обстановке.

Оглавление

    Сборка Software RAID5

    В моём распоряжении 4 диска. Массив я собираю на трёх. Четвёртый буду использовать для отработки починки массива.

    Подготовка

    У меня, разумеется, ubuntu (22.04.2 LTS). Для работы с массивом достаточно пакета mdadm:

    apt install -y mdadm
    1. Определяется, какие диски у нас в наличии:
    ~$ sudo lsblk 
    NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    sda           8:0    0   7,3T  0 disk 
    sdb           8:16   0   7,3T  0 disk 
    sdc           8:32   0   7,3T  0 disk 
    sdd           8:48   0   7,3T  0 disk 
    nvme0n1     259:0    0 238,5G  0 disk 
    ├─nvme0n1p1 259:1    0   976M  0 part /boot/efi
    └─nvme0n1p2 259:2    0 237,5G  0 part /var/snap/firefox/common/host-hunspell

    sda, sdb, sdc, sdd это они.

    2. На всех дисках нужно создать таблицу разделов и 1 раздел. Это важно делать до сборки массива потому, что иначе данные будут распределяться неравномерно. Это непроверенная информация, я нашёл её в интернете. Форматирую командой fdisk.

    После запуска команды нужно выполнить:

    g (Создать GPT таблицу)
    n (Создать новый раздел)
    Enter
    Enter
    Enter
    t (Изменить тип раздела)
    29 (Linux RAID)
    w (Сохранить изменения и выйти)

    ~$ sudo fdisk /dev/sda 
    
    Добро пожаловать в fdisk (util-linux 2.37.2).
    Изменения останутся только в памяти до тех пор, пока вы не решите записать их.
    Будьте внимательны, используя команду write.
    
    Устройство не содержит стандартной таблицы разделов.
    Размер этого диска 7,3 TiB (8001563222016 байт). Формат таблицы разделов DOS невозможно использовать на дисках для томов больше 2199023255040 байт при 512-байтовых секторах. Используйте формат таблицы разделов GUID (GPT).
    
    Создана новая метка DOS с идентификатором 0xa41ff07d.
    
    Команда (m для справки): g
    Создана новая метка диска GPT (GUID: D7FA4491-3D86-7D42-AFF1-590C4FAAC220).
    
    Команда (m для справки): n
    Номер раздела (1-128, по умолчанию 1): 
    Первый сектор (2048-15628053134, по умолчанию 2048): 
    Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-15628053134, по умолчанию 15628053134): 
    
    Создан новый раздел 1 с типом 'Linux filesystem' и размером 7,3 TiB.
    
    Команда (m для справки): t
    Выбранный раздел 1
    Partition type or alias (type L to list all): 29
    Тип раздела 'Linux filesystem' изменен на 'Linux RAID'.
    
    Команда (m для справки): w
    Таблица разделов была изменена.
    Вызывается ioctl() для перечитывания таблицы разделов.
    Синхронизируются диски.

    Повторяем это для всех дисков и теперь видим разделы:

    ~$ sudo lsblk 
    NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
    sda           8:0    0   7,3T  0 disk 
    └─sda1        8:1    0   7,3T  0 part 
    sdb           8:16   0   7,3T  0 disk 
    └─sdb1        8:17   0   7,3T  0 part 
    sdc           8:32   0   7,3T  0 disk 
    └─sdc1        8:33   0   7,3T  0 part 
    sdd           8:48   0   7,3T  0 disk 
    └─sdd1        8:49   0   7,3T  0 part 
    nvme0n1     259:0    0 238,5G  0 disk 
    ├─nvme0n1p1 259:1    0   976M  0 part /boot/efi
    └─nvme0n1p2 259:2    0 237,5G  0 part /var/snap/firefox/common/host-hunspell

    Сборка массива

    Можно собирать массив. Для этого служит команда mdadm. Вот формула по которой выстраивается список аргументов:

    sudo mdadm —create /dev/имя_массива —level=режим_работы —raid-devices=количество_устройств список устройств

    В моём случае получается:

    ~$ sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sd{a,b,c}1
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.

    Диагностика массива

    ~$ cat /proc/mdstat 
    Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
    md0 : active raid5 sdc1[3] sdb1[1] sda1[0]
          15627786240 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
          [>....................]  recovery =  0.4% (32534724/7813893120) finish=634.3min speed=204456K/sec
          bitmap: 0/59 pages [0KB], 65536KB chunk
    
    unused devices: <none>

    Команда показывает текущее состояние массива. В данном случае, состояние «recovery» означает что массив восстанавливается: происходит перемещение блоков данных между дисками. Это нормально для только что созданного массива. Прежде чем приступать к экспериментам, нужно дождаться завершения этого процесса. Через примерно 12 часов наблюдаю картину:

    Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
    md127 : active raid5 sdb1[1] sda1[0] sdc1[3]
          15627786240 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
          bitmap: 3/59 pages [12KB], 65536KB chunk
    
    unused devices: <none>

    Индикатор, показывающий что с массивом всё хорошо: [3/3] [UUU]

    Подробнее о содержимом mdstat здесь: https://raid.wiki.kernel.org/index.php/Mdstat

    auto-read-only mode

    Если во время recovery перезагрузить систему, массив перейдёт в режим auto-read-only:

    nazarovd@neumann:~$ cat /proc/mdstat 
    Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
    md127 : active (auto-read-only) raid5 sdb1[1] sda1[0] sdc1[3]
          15627786240 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
          bitmap: 0/59 pages [0KB], 65536KB chunk
    
    unused devices: <none>

    Чинится очень просто: sudo mdadm -w /dev/md127

    Добавление Hot Spare диска в Software RAID 5

    ~# mdadm /dev/md127 --add /dev/sdd1
    mdadm: added /dev/sdd1

    Команда добавит «запасной» диск в массив:

    Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
    md127 : active raid5 sdd1[4](S) sdb1[1] sdc1[3] sda1[0]
          15627786240 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
          bitmap: 4/59 pages [16KB], 65536KB chunk
    
    unused devices: <none>

    sdd помечен как S (Spare)

    Восстановление Software RAID 5 при отказе 1 диска

    Это сработает, только если данные в массиве живы, но один из дисков вызывает подозрение. При наличии Spare диска в массиве достаточно пометить подозрительный диск сломанным:

    mdadm /dev/md127 --fail /dev/sdс1

    Восстановление начнётся автоматически:

    Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10]
    md127 : active raid5 sdd1[4] sdb1[1] sdc1[3](F) sda1[0]
          15627786240 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
          [>....................]  recovery =  0.0% (3226836/7813893120) finish=726.1min speed=179268K/sec
          bitmap: 2/59 pages [8KB], 65536KB chunk
    
    unused devices: <none>

    Сбойный диск можно удалить из массива, заменить и добавить уже как Spare:

    mdadm /dev/md127 --remove /dev/sdс1

    Во время восстановления скорость записи на массив упадёт почти в 10 раз:

    ~# dd if=/dev/zero of=/storage/test bs=1M count=1953 oflag=direct
    1953+0 записей получено
    1953+0 записей отправлено
    2047868928 байт (2,0 GB, 1,9 GiB) скопирован, 43,902 s, 46,6 MB/s

    Удаление диска из Software RAID 5

    Помечаем диск неисправным и удаляем:

    mdadm /dev/md127 --fail /dev/sdd1
    mdadm /dev/md127 --remove /dev/sdd1