null

Замена диска rpool ZFS, Solaris 10

В общем-то, официальной документации довольно много. Только почему-то она не описывает _ПОЛНУЮ_ или хотя бы рабочую последовательность замены дисков в Solaris-ных ZFS зеркалах, особенно, если пул является корневым. Поэтому, я кратко и с комментариями изложу рабочую, полную процедуру, с претензией на корректность.

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

zpool status -xv

Доходчиво покажет, например, c1t0d0s0 DEGRADED.
Из этой информации видно, что нулевой слайс первого диска не читается. Обычно, рядом видна причина. В моём случае - "too many errors". Если же хочется заменить живой диск, первым делом его надо выключить. Делается это просто:

zpool offline rpool c1t0d0s0

После этого, устройство необходимо расконфигурировать из ОС. Посмотрим, какие есть устройства:

cfgadm -al

И теперь скомандуем диску: расконфигурируйся.

cfgadm -c unconfigure c3::c1t0d0s0

После этого, судя по мануалу, на Sun-овских серверах должен загореться "Ready to remove LED", который я видел пару раз в жизни, соответственно, не загорающийся. Чего в данной ситуации делать КАТЕГОРИЧЕСКИ НЕ надо, так это ещё-раз запускать ``cfgadm -al''. Иначе оно повиснет при выполнении системного вызова, процесс будет не убить, а если мы ещё случайно зашли в single-user, то вытекающие последствия очевидны. Впрочем, в лучшем случае, придётся просто подождать около пяти минут таймаута от подсистемы работы с блочными устройствам Solaris.

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

devfsadm -Cv

На этом шаге удалятся неиспользуемые ноды из devfs. И при втыкании нового диска, соответствнно, будет свободное место с именем c1t0d0, которое ему и отдастся. В противном случае, вы рискуете поиграть в игру "воткни меня заново".

Теперь проверим таблицу разделов на новом диске:

prtvtoc /dev/rdsk/c1t0d0s2

Обычно, она не совпадает со вторым диском, поэтому можно её скопировать с соседнего (например c1t1d0). Обратите внимание, что для этого тут тоже используется второй слайс:

prtvtoc /dev/rdsk/c1t1d0s2 | fmthard -s - /dev/rdsk/c1t0d0s2

В принципе, заключительным шагом является указание ZFS-у, что диск в пуле поменяли и надо бы resilver-нуть данные. Делается это просто:

zpool replace rpool c1t0d0s0

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

installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c1t0d0s0

Для x86 команда существенно отличается

installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1d0s0

На этом, пожалуй, всё.

korg

 

Коротко о себе

Работаю в компании Tune-IT, администрирую инфраструктуру компании и вычислительную сеть кафедры Вычислительной ТехникиСПбНИУ ИТМО.

Интересы: администрирование UNIX и UNIX-like систем и активного сетевого оборудования, написание shell- и perl-скриптов, изучение технологий глобальных сетей.
Люблю собирать GNU/Linux и FreeBSD, использовать тайлинговые оконные менеджеры и писать системный софт.