Небольшая проблема с софтовым рейд массивом

Зайчатки разума

Записная книжка айтишника

Небольшая проблема с софтовым рейд массивом

2021-10-18 22:10:11 — Evgeniy Shumilov

  Преамбула банальна: Жил/был сервер с софтовым зеркалом. И вот, начинаются странные проблемы. То я фаил сохранить не могу и vim наглухо зависает, то считать что-то не могу. Полез первым делом в dmesg, а там красота нечеловеческая на два экрана, приведённая на скриншоте в заголовке.

  Прогнал smartctl, написал в службу техподдержки Selectel - мол, диску похоже пришёл северный зверь из семейства куньих. Можете ли заменить диск? И вот техподдержка селектела реально порадовала - мол, да-да, конечно, ошибок смарта не видим, но заменим обязательно, напишите, когда вам удобно и т.п.. Если честно, я такой оперативности и учтивости после гуглооблака и AWS прямо не ожидал. Уточнил детали - мол, поддерживает ли диск hotswap, можно работают ли они круглосуточно и т.п..


  После чего через

mdadm --manage /dev/md0 --fail /dev/sdb2
mdadm --manage /dev/md1 --fail /dev/sdb3
mdadm --manage /dev/md0 --remove /dev/sdb2
mdadm --manage /dev/md1 --remove /dev/sdb3
hdparm -Y /dev/sdb

  Вывел диск из рейда и остановил шпиндель. Отписал в техподдержку, мол, забирайте, остановлено. Буквально через полчаса диск заменили на новый, дали серийник, чтобы проверил, что видно. Диск виден, всё прекрасно. Создал те же разделы через

sfdisk -d /dev/sda | sfdisk --force /dev/sdb

  В процессе sfdisk матюгнулся на то, что якобы разделы с рейд уже были на подключенном диске. Я на это изначально внимания не обратил, а как оказалось, зря. Далее попытался добавить разделы sdb2 и sdb3 к md0 и md1 соответственно. С первым всё прошло прекрасно, а вот второй выдал, что диск уже используется, что ввело меня в ступор - только что пересоздал таблицу разделов на диске, а он уже используется, прогнал lsof - ничего нет.

root@video [19:40:53]:/etc/mdadm# lsblk 
NAME             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                8:0    0 931.5G  0 disk  
├─sda1             8:1    0     1M  0 part  
├─sda2             8:2    0   977M  0 part  
│ └─md0            9:0    0   976M  0 raid1 /boot
└─sda3             8:3    0 930.6G  0 part  
  └─md1            9:1    0 930.4G  0 raid1 
    ├─vg0-swap_1 253:0    0   4.8G  0 lvm   [SWAP]
    └─vg0-root   253:1    0 925.7G  0 lvm   /
sdb                8:16   0 931.5G  0 disk  
├─sdb1             8:17   0     1M  0 part  
├─sdb2             8:18   0   977M  0 part  
│ └─md0            9:0    0   976M  0 raid1 /boot
└─sdb3             8:19   0 930.6G  0 part  
sdc                8:32   0 931.5G  0 disk  
sdd                8:48   0 931.5G  0 disk  
root@video [19:40:54]:/etc/mdadm# cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md127 : inactive sdb3[0](S)
      975627264 blocks super 1.2

md1 : active raid1 sda3[0]
      975627264 blocks super 1.2 [2/1] [U_]
      bitmap: 7/8 pages [28KB], 65536KB chunk

md0 : active raid1 sdb2[2] sda2[0]
      999424 blocks super 1.2 [2/2] [UU]

unused devices: <none>
root@video [19:41:20]:/etc/mdadm# lsof /dev/sdb3
root@video [19:41:28]:/etc/mdadm# mdadm --manage /dev/md1 --add /dev/sdb3
mdadm: Cannot open /dev/sdb3: Device or resource busy

  Так как софтовых рейдов я не собирал давно, пришлось копаться в манах и на форумах. Наткнулся на интересное - mdadm --examine /dev/sdb2 в строке Active device имел единичку, а sdb3 - нолик. Полный скан наконец-то прояснил ситуацию:

root@video [19:19:46]:/etc/mdadm# mdadm --detail --scan --verbose
ARRAY /dev/md/0 level=raid1 num-devices=2 metadata=1.2 name=Euclid:0 UUID=6027ff56:5efa666c:4bce5d3b:fb8e081d
   devices=/dev/sda2,/dev/sdb2
ARRAY /dev/md/1 level=raid1 num-devices=2 metadata=1.2 name=Euclid:1 UUID=92996745:e5f6c2aa:815782cc:202f3608
   devices=/dev/sda3
INACTIVE-ARRAY /dev/md127 num-devices=1 metadata=1.2 name=FilmOut:1 UUID=630ceea8:2fc2346e:cbd24dfe:8ad38b7f
   devices=/dev/sdb3

  Т.е. на новом для нас диске, который оказался старым, была уже существовавшая разметка раздела, который ранее был включен в рейд, а так как у провайдера скорее всего размеры разделов были типовыми, то метаданные раздела рейд сохранились, таблица же разделов была создана поверх и вот, у нас появился неведомый md127, которого ранее в системе не было. Проверил - действительно, есть такое. Теперь понятно, где используется раздел sdb3. При попытке удалить раздел из массива получил ошибку. Остановка массива прошла без ошибок, попытка удаления массива - снова ошибка.

root@video [19:25:53]:/etc/mdadm# mdadm /dev/md127 -r /dev/sdb3
mdadm: Cannot get array info for /dev/md127
root@video [19:45:56]:/etc/mdadm# mdadm --stop /dev/md127
mdadm: stopped /dev/md127
root@video [19:47:38]:/etc/mdadm# mdadm --remove /dev/md127
mdadm: error opening /dev/md127: No such file or directory

  Тем не менее, после этих операций можно видеть, что лишнего неактивного массива уже нет:

root@video [19:47:50]:/etc/mdadm# mdadm --detail --scan --verbose
ARRAY /dev/md/0 level=raid1 num-devices=2 metadata=1.2 name=Euclid:0 UUID=6027ff56:5efa666c:4bce5d3b:fb8e081d
   devices=/dev/sda2,/dev/sdb2
ARRAY /dev/md/1 level=raid1 num-devices=2 metadata=1.2 name=Euclid:1 UUID=92996745:e5f6c2aa:815782cc:202f3608
   devices=/dev/sda3

  Теперь можно вернуть раздел на место:

root@video [19:48:40]:/etc/mdadm# mdadm --manage /dev/md1 --add /dev/sdb3
mdadm: added /dev/sdb3

  Как видим, пошёл процесс восстановления рейда:

root@video [19:52:20]:/etc/mdadm# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md1 : active raid1 sdb3[2] sda3[0]
      975627264 blocks super 1.2 [2/1] [U_]
      [>....................]  recovery =  0.0% (561664/975627264) finish=2683.4min speed=6055K/sec
      bitmap: 7/8 pages [28KB], 65536KB chunk

md0 : active raid1 sdb2[2] sda2[0]
      999424 blocks super 1.2 [2/2] [UU]

unused devices: <none>

  Что интересно, параллельно этому поднялся в одном линуксовом чате вопрос по тому, как скормить виртуальным машинам pve нужный диск, ибо имена дисков после старта меняются и система их именует по принципу "кто первый встал, того и тапки". Подсказал человеку, что вместо блочного устройства можно подкинуть симлинк на него и путь будет постоянный. Нужный симлинк на debian-based системах достаточно просто можно найти так:

$ ls -lah /dev/disk/by-id/
total 0
drwxr-xr-x 2 root root 220 Oct 18 07:45 .
drwxr-xr-x 8 root root 160 Jul  2 21:12 ..
lrwxrwxrwx 1 root root   9 Jul  2 21:12 ata-M4-CT512M4SSD2_00000000114903244A67 -> ../../sdb
lrwxrwxrwx 1 root root  10 Jul  2 21:12 ata-M4-CT512M4SSD2_00000000114903244A67-part1 -> ../../sdb1
lrwxrwxrwx 1 root root   9 Jul  2 21:12 ata-R5M480G8_07032220M0033 -> ../../sda
lrwxrwxrwx 1 root root  10 Jul  2 21:12 ata-R5M480G8_07032220M0033-part1 -> ../../sda1
lrwxrwxrwx 1 root root  10 Jul  2 21:12 ata-R5M480G8_07032220M0033-part2 -> ../../sda2
lrwxrwxrwx 1 root root   9 Oct  2 11:31 usb-Seagate_Expansion_NA8ZGYT4-0:0 -> ../../sdd
lrwxrwxrwx 1 root root  10 Oct  2 11:31 usb-Seagate_Expansion_NA8ZGYT4-0:0-part1 -> ../../sdd1
lrwxrwxrwx 1 root root   9 Jul  2 21:12 wwn-0x500a075103244a67 -> ../../sdb
lrwxrwxrwx 1 root root  10 Jul  2 21:12 wwn-0x500a075103244a67-part1 -> ../../sdb1

  Всё получилось, kvm успешно запустился с подсунутым симлинком.

  Всем добра.

Теги: админское, linux

comments powered by Disqus