October 21, 2022

Замена диска в программном RAID(mdadm)

В жизни любого администратора Linux систем однажды возникает проблема развалившегося рейда. К счастью, при использовании софтового рейда процедура замена диска не представляет никакой трудности.

Итак перед заменой диска проводим первичный анализ ситуации по выводу команды

root@ubuntu:~# cat /proc/mdstat

вывод здорового рейда выглядит следующим образом:

root@ubuntu:~# cat /proc/mdstat 
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sdc1[1] sdb1[0] 
      5235712 blocks super 1.2 [2/2] [UU] 
      
unused devices: <none>

В случае каких либо неполадок с диском вывод будет таким:

1) В случае если диск полностью выпал из системы

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sdc1[1] 
      5235712 blocks super 1.2 [2/1] [_U]

2) В случае если диску плохо, около отвалившихся разделов будет стоять флаг F

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sdc1[1] sdb1(F) 
      5235712 blocks super 1.2 [2/1] [_U]

Бывает также ситуации когда на сбойном диске несколько разделов и по выводу cat /proc/mdstat видно что выпал, например, один. В таком случае, если другие разделы участвуют в построении рейд или куда-либо примонтированы нужно дать на них нагрузку, например, чтения и снова проверить вывод команды. Чаще всего в новом выводе уже все разделы будут отмечены флагом F

Так или иначе в любой из ситуаций нам необходимо принять решение о дальнейшем использовании диска или его замене. В ситуации №1 мы можем попробовать переподключить диск и если системе удастся его определить, провести диагностику.

В первую очередь стоит обратить внимание на вывод smartctl -a /dev/<device_name> и внимательно его изучить. Также можно запустить быстрый тест диска smartctl -t short /dev/<device_name> и проверить вывод dmesg на сообщения о плохих блоках. Обычно этих действий хватает чтобы принять решение о дальнейшей судьбе диска.

После того как решение принято мы готовы чинить рейд. Если в выводе /proc/mdstat есть разделы отмеченные флагом F, нам нужно прежде всего их удалить.

mdadm /dev/md127 --remove failed

Если на диске несколько разделов и некоторые из них также используются в построении рейд массивов, но было принято решение заменить диск, то такие разделы нужно пометить как сбойные

mdadm /dev/md127 -f /dev/sdb2

и только после этого произвести их удаление.

После замены диска создаем на нем нужную нам разметку и производим добавление новых разделов в рейд

mdadm /dev/md127 --add /dev/sdb1
В случае если было принято решение не менять диск, то достаточно выполнить удаление(remove failed) и также передобавить разделы через опцию --add

При замене диска(загрузочного) в системном рейд Вам может также потребоваться выполнить установку GRUb после всех процедур

grub-install /dev/sdb

процесс синхронизации рейда мы можем наблюдать через тот же вывод cat /proc/mdstat

root@ubuntu:~# cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sdc1[1] sdb1[0]
      5235712 blocks super 1.2 [2/2] [UU]
      [======>..............]  resync = 30.5% (1601792/5235712) finish=0.2min speed=228827K/sec

unused devices: <none>

В конце хочется отметить, что восстановление рейда это довольно высоконагруженная процедура. Если Ваш сервер находиться под нагрузкой рекомендуется снизить скорость синронизации, например через sysctl

root@ubuntu:~# sysctl -a | grep raid
dev.raid.speed_limit_max = 200000
dev.raid.speed_limit_min = 1000

root@ubuntu:~# sysctl -w dev.raid.speed_limit_max=80000
dev.raid.speed_limit_max = 80000

root@ubuntu:~# sysctl -a | grep raid
dev.raid.speed_limit_max = 80000
dev.raid.speed_limit_min = 1000

Это снизит просадку производительности и потенциальный выход из строя еще одного диска.