Monday, April 27, 2009

Перевод живой системы с ataraid(4) на gmirror

Имеется пачка серверов 7.0-7.2 i386, с плохо ведущим себя ataraid'ом: а именно, при попытке загрузки с degraded рейда при аттаче первого же диска ataraid(4) валит ядро по kernel trap 12. После починки методом выноса рейда было решено оную пачку перетащить на gmirror, благо на остальных серверах стоит именно он. Интереснее всего разумеется это делать с минимальным downtime'ом.

Читать далее...

После некоторых раздумий и экспериментов на тестовом сервере получилось как-то так:

Сразу оговорюсь - специфичные нюансы моей конфигурации в том, что везде используется intel matrix raid, для хранения конфигурации которого используется 3 последних сектора диска (geom использует 1) и в том, что все диски живут на отдельных каналах. Так что, YMMV

Итак: имеем
oxygen# atacontrol status ar0
ar0: ATA RAID1 status: READY
subdisks:
0 ad4 ONLINE
1 ad6 ONLINE

oxygen# atacontrol list | grep ad -B 1
ATA channel 2:
Master: ad4 Serial ATA v1.0
--
ATA channel 3:
Master: ad6 Serial ATA v1.0

Алгоритм: выносим 1 диск из ar0, дабы никто никуда не зеркалировался, выносим записи об ataraid н оставщемся и делаем geom на оставшемся в ar0 диске. Дожидаемся либо полного, либо частичного ребилда 2го диска в geom'е (дабы получить корректные значения в fstab и loader.conf), и перегружаемся:


oxygen# diskinfo ad6
ad6 512 1000204886016 1953525168 1938021 16 63

Количество секторов - 4-е число, которое впрочем можно получить, перемножив параметры из fdisk /dev/ad6

Выносим запись о рейде:
dd if=/dev/zero seek=1953525165 of=/dev/ad6 bs=512 count=3
oxygen# atacontrol detach ata3
oxygen# atacontrol attach ata3

oxygen# atacontrol status ar0
ar0: ATA RAID1 status: DEGRADED
subdisks:
0 ad4 ONLINE
1 ---- MISSING

Лечим 1й диск от тяжкого наследния ataraid'а:
oxygen# dd if=/dev/zero seek=1953525165 of=/dev/ad4 bs=512 count=3
oxygen# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16
oxygen# kldload geom_mirror
oxygen# echo geom_mirror_load=\"YES\" >> /boot/loader.conf
oxygen# gmirror label -vb round-robin gm0 ad4
Metadata value stored on ad4.
Done.
oxygen# gmirror insert gm0 ad6

oxygen# gmirror status
Name Status Components
mirror/gm0 DEGRADED ad4
ad6 (1%)

oxygen# sed -i '' -e 's/ar0/mirror\/gm0/' /etc/fstab
oxygen# sync ; sync
oxygen# reboot -qn

0 comments:

Post a Comment