Сборка Software RAID5
В моём распоряжении 4 диска. Массив я собираю на трёх. Четвёртый буду использовать для отработки починки массива.
Подготовка
У меня, разумеется, ubuntu (22.04.2 LTS). Для работы с массивом достаточно пакета mdadm:
apt install -y mdadm
- Определяется, какие диски у нас в наличии:
~$ 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