среда, 19 ноября 2008 г.

Загрузка и установка Solaris 10 10/08 с USB

Загрузка и установка Solaris 10 с USB-устройств, в частности, с флэшек, собственно говоря, не новость.

Помимо OpenSolaris (имеющих эту функциональность в различной степени готовности), этой возможностью обладает и продуктивный Солярис, по меньшей мере с релиза 11/06.

Правда, в более старых релизах предел поддерживаемой емкости USB-флэшек (жесткие диски USB не имели и не имеют подобного лимита), проверенный практически, составлял 4 Гб.

Как только что выяснилось, релиз 10/08 поддерживает флэшки 8 Гб, что позволяет выполнять разные трюковые вещи совершенно официально (а некоторые не слишком официально, но позволяет ;) и, как выяснилось, не только самый последний релиз ;)).

Однако вернемся к старым флэшкам 4 Гб. Такая вещь, как создание загрузочной (а особенно - установочной) USB-флэшки*, достаточно долго была нетривиальной процедурой. Как описано здесь, процедура, в общем-то, существует, однако она непроста даже для знающего соляриста и состоит из множества замысловатых ходов.

Общая структура флэшки-"диска" очень напоминает структуру загрузочного диска Солярис 8 на x86.

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

Итак, задача.

Нам нужно разметить новую флэшку, создав на ней один корневой слайс 0 на весь доступный объем (дабы гарантированно впихнуть на нее весь дистрибутив, возьмем флэшку объемом 4 Гб). И выберем ее поприличней. Чтобы и BIOS определил (иначе не загрузимся) и Солярис. Как раз случилась под рукой проверенная Kingston DataTraveler 4 Гб с интерфейсом USB 2.0.

Вообще, процедура создания USB-устройства, позволяющего на полном автопилоте (практически с использованием Custom JumStart) выполнять установку, существует и описана здесь (это не предыдущая ссылка, а более приближенная к реальности статья с BigAdmin), тупая автоматическая установка по фиксированному профилю - это не совсем то, что хотелось бы иметь. Поэтому пришлось изобрести некий аналог решения, приведенного выше, с то

Дальше я просто приведу листинг проделанных операций с выделением ключевых пунктов и действий жирным шрифтом. Sapienti sat. ;)

root @ haribda / # svcadm disable volfs
root @ haribda / # rmformat -l
Looking for devices...
1. Logical Node: /dev/rdsk/c1t0d0p0
Physical Node: /pci@0,0/pci108e,534b@2,1/storage@5/disk@0,0
Connected Device: Kingston DataTraveler 2.0 PMAP
Device Type: Removable
root @ haribda / # fdisk /dev/rdsk/c1t0d0p0

Здесь создается один раздел SOLARIS2 на весь объем устройства. Не вдаваясь в детали структуры таблицы разделов (она описана в вышеприведенной ссылке), примем как факт, что мы создаем и делаем активным полный раздел (почти полный) s0 на всем устройстве.

root @ haribda / # newfs /dev/rdsk/c1t0d0s0
newfs: /dev/rdsk/c1t0d0s0 last mounted as /rmdisk/unnamed_rmdisk/s0
newfs: construct a new file system /dev/rdsk/c1t0d0s0: (y/n)? y
/dev/rdsk/c1t0d0s0: 8044544 sectors in 1964 cylinders of 128 tracks, 32 sectors
3928.0MB in 76 cyl groups (26 c/g, 52.00MB/g, 6400 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
32, 106560, 213088, 319616, 426144, 532672, 639200, 745728, 852256, 958784,
7030880, 7137408, 7243936, 7350464, 7456992, 7563520, 7670048, 7776576,
7883104, 7989632

root @ haribda / # svcadm enable volfs

Далее монтируем CD/DVD и запускаем скрипт setup_install_server в направлениеи появившейся точки монтирования USB /rmdisk/unnamed_rmdisk/s0:

root @ haribda / # setup_install_server /rmdisk/unnamed_rmdisk/s0

Как показал опыт, это самый надежный способ получить качественный имидж системы на устройстве.

Затем добавляем диск за диском (в случае дистрибутива на CD) в тот же самый путь остальные диски дистрибутива, включая языковые (Languages). Для x86 весь объем дистрибутива для данного релиза составляет примерно 2,4 Гб.

После копирования последнего диска на USB-устройство, осталось уже не слишком много. Устанавливаем GRUB на USB:

root @ haribda / # cd /boot/grub

(пояснение: Действие происходит на сервере, к которому подключена флэшка и на котором уже установлен Солярис 10 релиза 10/08)

root @ haribda / # installgrub stage1 stage2 /dev/rdsk/c1t0d0s0
root @ haribda / # svcadm enable volfs

Последнее - и самое важное - действие заключается в замене x86.miniroot на USB для того, чтобы дистрибутив не искался исключительно на CD/DVD-приводе. Данная статья исчерпывающе описывает, как это проделать.

Краткое пояснение. Цель заключается в корректировке скрипта install-discovery из файла x86.miniroot. Не пересказывая содержания - проще заменить процедуру trymountcd() на следующий код:


trymountcd()
{
echo $Installfs | grep ramdisk > /dev/null
if [ $? = 0 ] && [ ! -d /cdrom/Solaris_* ] ; then
ls -l /dev/dsk | grep storage | grep 's0 -' \
| awk '{print $9}' | while read VAL
do
for Dev in /dev/dsk/${VAL} ; do
Typ=`/usr/sbin/fstyp $Dev 2> /dev/null`

if [ "X${Typ}" = "Xufs" ] ; then
mount -o ro $Dev /cdrom
if [ -d /cdrom/Solaris_* ] ; then
echo "Using install media in $Dev"

# save install media for wizards
echo $Dev >> ${CDROOT}

break
else
umount /cdrom 2> /dev/null
fi
fi
done
done
else
if [ ! -d /cdrom/Solaris_* ] ; then
# "this never happens" :-)
echo "ERROR: The Solaris Distribution, ${Installfs} " \
"does not exist"
echo " Exiting to shell."
/sbin/sh
fi
fi
}


после чего пересобрать архив x86.miniroot и положить его в каталог boot на корне USB-устройства после заливки на него дистрибутива.

Замечание. У автора оригинальной статьи есть одна неточность в коде процедуры. При воспроизведении один-в-один будет проблема при переходе к фазе собственно установки. Поэтому надо написать так, как приведено выше - код протестирован.

Все.

Замечание. Не все. Решение из оригинальной статьи не тестировалось на машинах без CD/DVD. При установке с созданного подобным образом устройства происходит сбой скрипта install-begin, не дающий полноценно начать и завершить установку без вмешательства руками. Проблема связана с багом в скрипте install-begin, поскольку Sun не учел возможность установки с устройств, отличных от CD/DVD. Файлы, содержащие все необходимые исправления и изменения, можно скачать здесь.

То есть, для создания полноценного архива x86.miniroot, пригодного для загрузки и выполнения установки Solaris с USB, необходимо заменить два скрипта - install-discovery и install-begin.

Изменения, которые необходимо внести в скрипт install-begin, приводятся ниже:
____________________________
# If a .cdroot file exists, the Solaris Wizard will select Solaris CD
# by default on SolarisMediaPanel
#
if [ -f $CDROOT ] ; then # This is a cdrom installation
# ***
# Bug with $CD_ID value on i386 machines without CD
# if [ ! -z $CD_ID ] ; then
if [ "X$CD_ID" != "X" ] ; then

____________________________
# ***
# Bug with $CD_ID value on i386 machines without CD
# from USB devices.
#if [ -z "$cdid" ] ; then
if [ "x$cdid" = "x" ] ; then
for i in $CD_ID ; do
if [ -b /dev/dsk/$i ] ; then
cdid=$i

____________________________
# ***
# Bug with $CD_ID value on i386 machines without CD
#echo $cdid > /tmp/find_device.out
if [ "x$cdid" != "x" ] ; then
echo $cdid > /tmp/find_device.out
else
cat $CDROOT > /tmp/find_device.out
fi

install_debug wizard "final cd_id found: $cdid"

____________________________

После демонтирования и отключения съемного устройства у вас в руках полноценный инсталляционный и загрузочный
USB. Пригодный и для интерактивной установки/обновления, и выполнения Custom JumpStart и для ремонтно-восстановительных работ в single user.

_____________
* Фактически речь идет о создании вполне полноценного загрузочного и установочного USB, подобного DVD с Solaris.