среда, 19 января 2011 г.

Solaris 11 Express: Создание загрузочного USB-устройства без usbcopy

Забавно было наблюдать, как Оракл поверг всех "системных администраторов" в смущение выпуском Solaris 11 Express LiveUSB с утилитой создания этого самого LiveUSB, находящейся внутри установочного имиджа. :) И резко исчезнувшей со всех ресурсов, посвященных OpenSolaris. Ну, ладно, преувеличиваю. Тщательные раскопки переписки в районе OpenSolaris позволили найти некий промежуточный вариант usbcopy, в аттачментах переписки о багах этой самой usbcopy.

Вообще забавно было читать на форумах записки ошеломленных сисадминов, которые как проклятые пытались найти эту утилиту (фактически - скрипт). И без которой были беспомощны, как котята. Мне даже попалось глубокомысленное высказывание о проблеме курицы и яйца, с советом поставить Solaris 11 сначала с CD, а потом, скачав LiveUSB имидж, создавать загрузочную флэшку. :) Ха, качать два имиджа, чтобы сделать загрузочную флэшку, щаз!

Ладно, нашел я в конце-концов этот многострадальный скрипт.

Посмотрел на него.

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

Итак, как руками создать загрузочную флэшку из имиджа LiveUSB Solaris 11 Express?

Элементарно, Ватсон!

Половина необходимых действий описана здесь. Нам потребуется машина с установленной Solaris 10 x86. Переливаем на нее имидж LiveUSB с сайта Oracle.

1. Выключаем сервис VOLD:

root @ ktulhu /stage # svcadm disable volfs
root @ ktulhu /stage # svcs volfs
STATE STIME FMRI
disabled 18:31:52 svc:/system/filesystem/volfs:default


2. Подключаем к машине под Solaris 10 флэшку объемом от 1 Гб и определяем логическое имя устройства для флэшки командой rmformat:

root @ ktulhu /stage # rmformat -l
Looking for devices...
1. Logical Node: /dev/rdsk/c2t0d0p0
Physical Node: /pci@0,0/pci1043,819e@1d,7/storage@3/disk@0,0
Connected Device: Generic USB Flash Disk 0.00
Device Type: Removable
2. Logical Node: /dev/rdsk/c0t1d0p0
Physical Node: /pci@0,0/pci-ide@1f,1/ide@0/sd@1,0
Connected Device: TEAC DV-W28E-R 1.0B
Device Type: DVD Reader/Writer

В моем случае именем устройства является /dev/rdsk/c2t0d0p2.

3. Создаем на флэшке партишен Solaris на весь объем USB-устройства:

root @ ktulhu /stage # fdisk -d -B /dev/rdsk/c2t0d0p0
Physical Geometry:
cylinders[1926] heads[128] sectors[32]
sector size[512] blocks[7888896] mbytes[-244]
Virtual (HBA) Geometry:
cylinders[491] heads[255] sectors[63]
sector size[512] blocks[7887915] mbytes[-244]
About to write fdisk table:
SYSID ACT BHEAD BSECT BEGCYL EHEAD ESECT ENDCYL RELSECT NUMSECT
191 128 65 2 0 15 36 491 4096 7884800
100 0 0 0 0 0 0 0 100 100
100 0 0 0 0 0 0 0 100 100
100 0 0 0 0 0 0 0 100 100

4. Запускаем format в режиме эксперта и создаем на флэшке слайс 0 с тэгом root, как описано здесь:

root @ ktulhu /stage # fdisk -d -B /dev/rdsk/c2t0d0p0
Physical Geometry:
cylinders[1926] heads[128] sectors[32]
sector size[512] blocks[7888896] mbytes[-244]
Virtual (HBA) Geometry:
cylinders[491] heads[255] sectors[63]
sector size[512] blocks[7887915] mbytes[-244]
About to write fdisk table:
SYSID ACT BHEAD BSECT BEGCYL EHEAD ESECT ENDCYL RELSECT NUMSECT
191 128 65 2 0 15 36 491 4096 7884800
100 0 0 0 0 0 0 0 100 100
100 0 0 0 0 0 0 0 100 100
100 0 0 0 0 0 0 0 100 100

root @ ktulhu / # format -e /dev/rdsk/c2t0d0p2
Error: can't open selected disk '/dev/rdsk/c2t0d0p2'.

format
> disk

AVAILABLE DISK SELECTIONS:
0. /dev/rdsk/c2t0d0
<drive type unknown>
/pci@0,0/pci1043,819e@1d,7/storage@4/disk@0,0
Specify disk (enter its number)[0]: 0

AVAILABLE DRIVE TYPES:
0. Auto configure
1. other
Specify disk type (enter its number): 0
Auto configuration via format.dat[no]? yes
/dev/rdsk/c2t0d0: configured with capacity of 3.76GB
<Generic-USBFlashDisk-0.00 cyl 1923 alt 2 hd 128 sec 32>
selecting /dev/rdsk/c2t0d0
[disk formatted]
format
> partition
...
partition
> print
Current partition table (default):
Total disk cylinders available: 1923 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 0 (0/0/0) 0
1 swap wu 0 0 (0/0/0) 0
2 backup wu 0 - 1924 3.76GB (1925/0/0) 7884800
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 usr wm 1 - 1922 3.75GB (1922/0/0) 7872512
7 unassigned wm 0 0 (0/0/0) 0
8 boot wu 0 - 0 2.00MB (1/0/0) 4096
9 alternates wm 0 0 (0/0/0) 0

partition
> 6
Part Tag Flag Cylinders Size Blocks
6 usr wm 1 - 1922 3.75GB (1922/0/0) 7872512

Enter partition id tag[usr]: unassigned
Enter partition permission flags[wm]:
Enter new starting cyl[1]: 0
Enter partition size[7872512b, 1922c, 1921e, 3844.00mb, 3.75gb]: 0gb
partition
> print
Current partition table (unnamed):
Total disk cylinders available: 1923 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 0 0 (0/0/0) 0
1 swap wu 0 0 (0/0/0) 0
2 backup wu 0 - 1924 3.76GB (1925/0/0) 7884800
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 unassigned wm 0 0 (0/0/0) 0
7 unassigned wm 0 0 (0/0/0) 0
8 boot wu 0 - 0 2.00MB (1/0/0) 4096
9 alternates wm 0 0 (0/0/0) 0

partition
> 2
Part Tag Flag Cylinders Size Blocks
2 backup wu 0 - 1924 3.76GB (1925/0/0) 7884800

Enter partition id tag[backup]: ^C
partition
> 0
Part Tag Flag Cylinders Size Blocks
0 root wm 0 0 (0/0/0) 0

Enter partition id tag[root]:
Enter partition permission flags[wm]:
Enter new starting cyl[1]:
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 1924e
End cylinder 1924 is beyond max cylinder 1922
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 1922e
partition
> print
Current partition table (unnamed):
Total disk cylinders available: 1923 + 2 (reserved cylinders)

Part Tag Flag Cylinders Size Blocks
0 root wm 1 - 1922 3.75GB (1922/0/0) 7872512
1 swap wu 0 0 (0/0/0) 0
2 backup wu 0 - 1924 3.76GB (1925/0/0) 7884800
3 unassigned wm 0 0 (0/0/0) 0
4 unassigned wm 0 0 (0/0/0) 0
5 unassigned wm 0 0 (0/0/0) 0
6 unassigned wm 0 0 (0/0/0) 0
7 unassigned wm 0 0 (0/0/0) 0
8 boot wu 0 - 0 2.00MB (1/0/0) 4096
9 alternates wm 0 0 (0/0/0) 0

partition
> label
[0] SMI Label
[1] EFI Label
Specify Label type[0]: 0
Ready to label disk, continue? y

partition
>

Количество цилиндров раздела можно увидеть визуально, без ухищрений с prtvtoc и прочих изысков. Метка создается SMI.

(Кстати, в оригинальном скрипте usbcopy эта тривиальная процедура делается полностью автоматически - понимаю, зачем, но писать сейчас аналогичный скрипт, работающий не на OpenSolaris мне просто влом. Я всего лишь хочу создать один-единственный LiveUSB).

5. Загруженный на нашу машину с Solaris 10 имидж просто копируем утилитой dd на нашу флэшку (файловую систему создавать не обязательно):

root @ ktulhu /stage # dd bs=16384 conv=sync if=sol-11-exp-201011-live-x86.usb of=/dev/rdsk/c2t0d0s0
52762+1 records in
52763+0 records out

Процедура копирования заняла у меня около 5 минут.

6. Последнее действие - смонтируем флэшку и запишем на нее загрузчик с нее же:

root @ ktulhu /stage # mount /dev/dsk/c2t0d0s0 /mnt

root @ ktulhu /stage # dd bs=16384 conv=sync if=sol-11-exp-201011-live-x86.usb of=/dev/rdsk/c2t0d0s0
52762+1 records in
52763+0 records out

Можно убедиться, что имидж записан на флэшку:

root @ ktulhu /stage # ls -al /mnt
total 591082
drwxr-xr-x 15 root root 512 Nov 5 21:56 .
drwxr-xr-x 33 root root 43 Jan 20 11:12 ..
-r--r--r-- 1 root root 2048 Nov 5 21:55 .catalog
drwxr-xr-x 2 root sys 512 Nov 5 21:01 .cdrom
-rw-r--r-- 1 root root 65 Nov 5 21:27 .image_info
-rw-r--r-- 1 root root 4242 Nov 5 21:55 .livecd-cdrom-content
-r--r--r-- 1 root root 37 Nov 5 21:27 .volsetid
lrwxrwxrwx 1 root root 9 Nov 5 21:55 bin -> ./usr/bin
drwxr-xr-x 5 root sys 512 Nov 5 21:55 boot
drwxr-xr-x 14 root sys 1024 Nov 5 21:55 dev
drwxr-xr-x 3 root sys 512 Nov 5 21:55 devices
drwxr-xr-x 5 65432 staff 512 Nov 5 21:55 jack
drwx------ 2 root root 8192 Nov 5 21:55 lost+found
drwxr-xr-x 3 root sys 512 Nov 5 21:55 mnt
drwxr-xr-x 5 root sys 512 Nov 5 21:55 platform
dr-xr-xr-x 2 root root 512 Nov 5 21:01 proc
-rw-r--r-- 1 root root 0 Nov 5 21:03 reconfigure
drwx------ 2 root root 512 Nov 5 21:55 root
drwxr-xr-x 4 root root 512 Nov 5 21:55 save
-rw-r--r-- 1 root root 576742912 Nov 5 21:53 solaris.zlib
-rw-r--r-- 1 root root 28161024 Nov 5 21:55 solarismisc.zlib
drwxr-xr-x 4 root root 512 Nov 5 21:56 system
drwxrwxrwt 2 root sys 512 Nov 5 21:01 tmp

и отмонтировать ее:

root @ ktulhu /stage # umount /mnt

Для спокойствия можно убедиться, что файловая система на флэшке UFS:

root @ ktulhu /stage # fstyp /dev/rdsk/c2t0d0s0
ufs

That's all, folks! Вот и все, мальчики и девочки!

Можно стартовать с вновь созданного LiveUSB.