Thursday, June 2, 2011

Extract Slice 0 from Solaris 10 DVD.

To set up a Jump Start server using the Solaris 10 OS, you must have access to both slice 0 and slice 1 on the CDs. If you use a physical CD, no problem occurs -- vold will automatically mount both of the required slices, or if you are not using vold, you can mount the slices manually.

However, problems can result if you try to use an ISO image that is mounted using the "lofi" driver because lofi is not VTOC aware, which means that lofi cannot recognize that slice 1 exists and, therefore, cannot access it. An error message similar to the following will probably appear:
# ./setup_install_server dest_dir
ERROR: Install boot image /cd/s0/Solaris_10/Tools/Boot does not exist

Check that boot image exists, or use [-t] to specify a valid boot image elsewhere.
To fix the problem, split the contents of slice 1 into its own image file and then mount this image separately using lofi. The following procedure describes how to do this.

Resolution:
It is presumed that the ISO images for Solaris OS have already been downloaded and unzipped. Two files which are similar to the following should be present:
# ls -l sol-10*
-rw-r--r-- 1 root root 576364544 Jan 1 11:16 sol-10-u1-sparc-v1.iso
-rw-r--r-- 1 root root 291962880 Jan 1 21:42 sol-10-u1-sparc-v2.iso


(The exact names and sizes will vary, depending on what version of the Solaris 10 OS they are.)

Of sole interest is the first image, "CD 1 of 2". The others ("CD 2 of 2" or the "Languages CD") do not require that multiple slices need to be mounted and do not require special consideration.

Step 1:
Get a copy of the VTOC (Virtual Table of Contents) from the ISO image:
# dd if=sol-10-u1-sparc-v1.iso of=vtoc bs=512 count=1
1+0 records in
1+0 records out

Step 2:
Now that the VTOC is present, find out where Slice 1 starts in the image and how long it is. The starting cylinder for slice 1 is located at offset 452 (decimal) into the VTOC; the length in blocks is at offset 456, with both being 4 bytes long. This can be determined by using the following:
# od -D -j 452 -N 8 < vtoc
0000000 0000000888 0000546560
0000010

Slice 1 starts on cylinder 888 , and is 546,560 blocks long. The CDs for the Solaris OS always have a fixed 640 blocks per cylinder, which means that one can calculate the starting block of slice 1 using the following:
# echo 888*640 | bc
568320

Slice one starts at block 568320 and is 546560 blocks long.

Step 3:
Copy slice one into a separate file:
# dd if=sol-10-u1-sparc-v1.iso of=sol-10-u1-sparc-v1-s1.iso bs=512 skip=568320 count=546560
546560+0 records in
546560+0 records out


Step 4:
Mount both slice 0 (that is, the original ISO) and slice 1. The setup_install_server script expects to find these two mounted beside each other, with slice 1 in a directory called "s1" (as vold does it), although you can mount the slices wherever they are needed using the "-t" option to setup_install_server.
# mkdir /cd
# mkdir /cd/s0
# mkdir /cd/s1
# lofiadm -a /path_to/sol-10-u1-sparc-v1.iso
/dev/lofi/1
# lofiadm -a /path_to/sol-10-u1-sparc-v1-s1.iso
/dev/lofi/2


When you mount slice 1, remember that it is a UFS partition, not HSFS as you would normally expect on a CD-ROM:
# mount -F hsfs -o ro /dev/lofi/1 /cd/s0
# mount -F ufs -o ro /dev/lofi/2 /cd/s1
# cd /cd/s0/Solaris_10/Tools/
# ./setup_install_server /destination_dir

If the error "ERROR: Copy of CD image failed," appears, check your messages file for an entry such as "NOTICE: hsfs: hsnode table full, 356 nodes allocated," and then apply patch 109764.

Step 5:
The second ISO image (sol-10-u1-sparc-v2.iso) is equivalent to Software CD 2 of 2 and also needs to be mounted as a lofi device in order to run add_to_install_server:
# lofiadm -a /path_to/sol-10-u1-sparc-v2.iso
/dev/lofi/3
# mount -F hsfs -o ro /dev/lofi/3 /mnt
# cd /mnt/Solaris_10/Tools
# ls
Installers add_to_install_server
# ./add_to_install_server /destination_dir