вторник, 2 декабря 2008 г.

Миграция UFS -> ZFS на Solaris 10 10/08 x86 - Часть 1

Миграция обычных UFS систем на ZFS - задача достаточно простая и обычно не вызывает серьезных проблем.

Новый релиз Solaris 10, однако, помимо изменений в процедуре загрузки для обеих архитектур (SPARC и x86) и возможности установки на ZFS всей системы (на загрузочный root-pool) позволяет также выполнить миграцию системы с UFS на ZFS.

Простой утилиты конвертации на данный момент не существует, все же файловые системы отличаются достаточно сильно и, несмотря на усилия команды разработчиков OpenSolaris, единственной доступной процедурой остается использование одной достаточно экзотической функциональности Solaris - Live Upgrade.

Однако реальность несколько отличается от идеализированной процедуры, описанной в руководствах.

На бумаге все легко и просто - буквально в три простые команды выполняется вся операция, просто и изящно, и единственное, о чем надо беспокоиться - это о втором диске.

На деле миграция в данном релизе существенно сложней, прежде всего потому, что в коде процедур Live Upgrade есть ряд досадных ошибок, а в самой процедуре миграции, описанной в руководстве Sun - ряд неточностей.

Итак, рассмотрим реальную процедуру, которая была завершена буквально только что.

Дано: Есть инфраструктурный сервер, работавший в качестве прокси, под управлением Solaris 10 08/07, с архитектурой x86:

1 CPU Intel Celeron 2.26 ГГц
2 Гб DDR RAM
1 жесткий диск ATA 80 Гб, разбитый на 5 слайсов
1 DVD-ROM
2 NIC Intel Pro 100B

Задача: Выполнить обновление до релиза 10/08, и, следующим шагом, мигрировать UFS на ZFS с загрузкой с ZFS-пула.

Первая часть задачи выполняется легко и непринужденно*, несмотря на существенные изменения в новой операционной системе.

После установки и наката небольшого количества патчей, приступаем, собственно, ко второй части - к переходу на ZFS.

Как и сказано в руководстве, устанавливаем второй диск - для облегчения задачи берем в точности такой же ATA 80 Гб, с одинаковой геометрией и однотипным контроллером, и подключаем его к серверу. Реконфигурируемся. Создаем таблицу разделов FDISK на весь объем диска (как у оригинального загрузочного диска 1) типа SOLARIS1 и делаем ее активной.

Затем, используя утилиту format, создаем корневой слайс s0 (согласно оставшимся цилиндрам, начиная с 3го и до конца диска).

Следующим шагом создаем на нем пул ZFS:

# zpool create -f rpool c1d1s0

Опция -f может весьма потребоваться, если создается пул на диске, на котором уже был когда-то создан ZFS-пул.

Затем, согласно все тому же руководству, создаем оригинальный Boot Environment на текущем диске (назовем его ufsBE) и, далее, в точности по руководству, на его основе - zfsBE на пуле ZFS:

# lucreate -c ufsBE -n zfsBE -p rpool
Analyzing system configuration.
No name for current boot environment.
Current boot environment is named .
Creating initial configuration for primary boot environment .
The device
is not a root device for any boot environment;
cannot get BE ID.
PBE configuration successful: PBE name PBE Boot Device .
Comparing source boot environment file systems with the file
system(s) you specified for the new boot environment.
Determining which file systems should be in the
new boot environment.
Updating boot environment description database on all BEs.
Updating system configuration files.
The device
is not a root device for any boot environment;
cannot get BE ID.
Creating configuration for boot environment .
Source boot environment is .
Creating boot environment .
Creating file systems on boot environment .
Creating file system for in zone on .
Populating file systems on boot environment .
Checking selection integrity.
Integrity check OK.
Populating contents of mount point
.
Copying.
Creating shared file system mount points.
Creating compare databases for boot environment .
Creating compare database for file system
.
Creating compare database for file system
.
Updating compare databases on boot environment .
Making boot environment bootable.
Creating boot_archive for /.alt.tmp.b-zv.mnt
updating /.alt.tmp.b-zv.mnt/platform/i86pc/boot_archive
Population of boot environment successful.
Creation of boot environment successful.

Замечание: Может потребоваться переименование root pool (на самом деле пофигу, как он будет называться, хоть горшком ;)), если вы выполняете восстановление системы (скажем, с голого металла восстановились из flar-архива, который в текущей версии выполняет восстановление только на UFS, и вы хотите вернуть все взад - сиречь на ZFS).

Операция занимает некоторое время, порядка 15-25 минут приходится подождть завершения копирования и сравнения. Все это время оригинальная система продолжает активно работать.

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

Итак, что нужно сделать после подготовки нового BE и ДО активации и перезапуска с нового BE:

1. В обязательном порядке установить загрузчик на второй диск:

# installgrub /boot/grub/stage1 /boot/grub/stage2 \
/dev/rdsk/c1d1s0
Потому что его там еще нет и, при попытке активации и загрузки прямо сейчас, будет ошибка Bad PBR sig. Почти каноническая.

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

# zfs list -r -o name,mountpoint rpool/ROOT/zfsBE

NAME MOUNTPOINT
rpool/ROOT/zfsBE /.alt.tmp.b-VP.mnt/

и, если таковые будут (а они будут из-за ошибок в Live Upgrade в текущем релизе - 10/08), исправить их:
# zfs inherit -r mountpoint rpool/ROOT/zfsBE
# zfs set mountpoint=/ rpool/ROOT/zfsBE


3. Последнее наведение штрихов (без него, однако, загрузка с нового диска будет невозможна) перед перезагрузкой:

Активизируем zfsBE командой

# luactivate zfsBE

однако НЕ ПЕРЕЗАГРУЖАЕМСЯ НЕМЕДЛЕННО, как требует руководство!

Необходимо исправить menu.lst загрузчика GRUB на корневом пуле ZFS. Вопреки заявлению Live Upgrade, меню не изменено необходимым образом для загрузки с ZFS.

Итак, редактируем его (необходимые изменения выделены красным):

# cd /rpool/boot/grub
# vi menu.lst
....
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris 10 10/08 s10x_u6wos_07b X86
findroot (BE_zfsBE,0,a)
bootfs rpool/ROOT/zfsBE
kernel$ /platform/i86pc/multiboot -B $ZFS-BOOTFS
module /platform/i86pc/boot_archive
#---------------------END BOOTADM--------------------
#---------- ADDED BY BOOTADM - DO NOT EDIT ----------
title Solaris failsafe
findroot (BE_zfsBE,0,a)
kernel /boot/multiboot kernel/unix -s
module /boot/x86.miniroot-safe
#---------------------END BOOTADM--------------------
....
Осталась мелочь. Процедура активации не только не изменила меню загрузчика, но и не перенесла файл /boot/grub/splash.xpm.gz на корневой пул ZFS, без него не будет видно меню загрузчика (совсем) и система будет сразу грузиться в опасный режим без возможности стартовать в безопасном ;). Можно, конечно, и забить на это, просто закомментировав строку #splashimage /boot/grub/splash.xpm.gz в menu.lst - тогда меню будет текстовым (что, собственно, нас устраивает как нельзя лучше - автор так и сделал), а можно стащить файл с пока еще живой UFS и положить его рядом с menu.lst в root pool:

# cp /boot/grub/splash.xpm.gz /rpool/boot/grub
Вот теперь действительно все. Можно перезагружаться и стартовать со второго диска:

# init 6

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

Решение данной задачи будет рассмотрено во второй части статьи.

PS. "Дорогие читатели, мы закончили описание процедуры взлета на самолете в нашем журнале "Пилотирование для чайников". Желаем приятного полета! Подробное описание процедуры посадки - в следующем номере. До новых встреч, дорогие друзья!" ;)
______________________
* Оставим пока на совести разработчиков тот факт, что с новым релизом есть серьезные проблемы в выполнении обновления hands-off методом JumpStart для архитектуры x86/x64. Без проблем удалось провести только начальную установку посредством JS.