Небольшая проблема с софтовым рейд массивом
Преамбула банальна: Жил/был сервер с софтовым зеркалом. И вот, начинаются странные проблемы. То я фаил сохранить не могу и 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 успешно запустился с подсунутым симлинком.
Всем добра.