Solaris jumpstart from a Linux server

I was asked to revive an old Sun Fire V120 server and install Solaris 10 on it for some Oracle tests. The server is in a server room a couple kilometers away — I could indeed drive there, put the DVD in the drive and install it that way but I found me too lazy to lift my bottom. Instead I decided to give a Solaris Jumpstart installation a try. I never did it before so I started googling — most tutorials explained how to setup Jumpstart server on Solaris but I didn’t have another Solaris available in that subnet. Only some Linux boxes. So I kept on googling, found some hints but not a complete tutorial on doing a Solaris Jumpstart installation from a Linux server. Following the break is my take on the How-To.

Solaris Jumpstart overview

Only a few articles describe how Jumpstart works under the hood. Here are my findings, all tested on an UltraSPARC based Sun Fire V120, Sun Fire V240 and Sun Fire T2000 servers:

  1. Boot the Sun box into OpenBoot Prompt (aka ok prompt) and invoke a network boot with: boot net -v — install
  2. rarp — The Sun box sends out a rarp request and expects to get its new an IP address in a reply. Jumpstart server runs rarpd for this task.
  3. tftp — With IP assigned the Sun box tries to load a Solaris kernel over tftp from the server that replied to the RARP request.
  4. bootparams — The kernel half-boots and sends out a bootparams request to find the NFS installation source.
  5. nfs mount & mdash; Then it tries to mount the NFS directories and invokes the installation program very similar to what you know from DVD-based installation.
  6. Optionally you can supply a config file for a non-interactive installation. If no config is available Jumpstart will run in an interactive mode.

Required packages

The machine I decided to use for this Jumpstart exercise runs OpenSUSE 11.2 — not really a server distro but good enough for the task. First of all install the required packages. In OpenSUSE use either YaST 2 or command-line tool zypper:

[Linux] ~ # zypper install rarpd nfs-kernel-server

You will also need rpc.bootparamd daemon. I haven’t found an RPM built specifically for OpenSUSE however there is a CentOS 5 package bootparams where you can get this daemon. Install it with --force and it should run just fine. Alternatively compile it from source (or local netkit-bootparamd-0.18-pre1.tar.gz download) with a classic ./configure && make && make install sequence. Whichever way you choose you should end up with rpc.bootpadamd installed in /usr/sbin or elsewhere.

If your server is RedHat, Fedora or CentOS the situation is even easier because bootparams package is directly available:

[Linux] ~ # yum install rarpd nfs-kernel-server bootparams

The following procedure makes use of a lot of different ports. Before moving on disable firewall on the Linux server either with rcSuSEfirewall2 stop on OpenSUSE or with service iptables stop on RedHat, Fedora or CentOS.

Required information from the Sun box

Before going on we’ll need some information from the Sun server, namely its MAC address. It can be found on a sticker somewhere on the case, on the System Configuration Card and is also printed out during boot sequence (ok boot net -v — install):

Sun Fire V120 (UltraSPARC-IIe 648MHz), No Keyboard
OpenBoot 4.0, 1024 MB memory installed, Serial #524012345.
Ethernet address 0:3:ba:1f:ab:cd, Host ID: 831fabcd.

Also decide on the name for the server. In this example we’re going to call it simply sunfire and give it an IP address 192.168.140.205. That’s all we need for now. Let’s configure the Linux server…

RARP configuration

RARP, BOOTP and DHCP protocols all serve the same purpose — they assign an address-less host a new IP address. However unlike the latter ones RARP does that and only that, it provides only the IP address but not a network mask, a gateway address or any other information. That has some interesting consequences as we’ll see in a while. However it’s the protocol used by SunFire OpenBoot environment.
The mapping between Ethernet address and IP address is done in two files on the Linux host: /etc/ethers and /etc/hosts:

[Linux] ~ # echo "0:3:ba:1f:ab:cd sunfire" >> /etc/ethers
[Linux] ~ # echo "192.168.140.205 sunfire" >> /etc/hosts

Now run the daemon in verbose mode and check the message log:

[Linux] ~ # rarpd -v
[Linux] ~ # tail -f /var/log/messages
...
Feb 19 13:08:12 linux rarpd[2383]: rarp who-is 0:3:ba:1f:ab:cd tell 0:3:ba:1f:ab:cd answer 192.168.140.205

Check out the Sun’s booting progress and you’ll see something like:

Timeout waiting for ARP/RARP packet
Timeout waiting for ARP/RARP packet
(here rarpd was started on the Linux server)
Retrying ... Check TFTP server and network setup
Retrying ... Check TFTP server and network setup

TFTP configuration

The Sun server got its IP address and tries to download the kernel using TFTP protocol from the server that responded to the RARP request. The filename requested is C0A88CCD which stands for 192.168.140.205 converted to hex:

[Linux] ~ # printf "%02X%02X%02X%02X
" 192 168 140 205
C0A88CCD

The netboot kernel is called inetboot on the Solaris 10 DVD. It must be copied to the TFTP directory (/srv/tftp) and symlinked to the above hex-IP name. Then the TFTP daemon can finally be started. Easy, right? Let’s mount the DVD (or the ISO image in this case) to /data/jumpstart/sol10u8 on the Linux box for start:

[Linux] ~ # mkdir -p /data/jumpstart/sol10u8
[Linux] ~ # mount -oro,loop /iso/sol-10-u8-ga-sparc-dvd.iso /data/jumpstart/sol10u8

There kernel is available in three versions: sun4u for the older UltraSPARC I to IV CPUs, sun4v for modern UltraSPART T1 and T2 processors and sun4us for idontknowwhat processors. Our Sun Fire V120 and V240 both need the sun4u variant while the newer Sun Fire T2000 needs sun4v. This example is about V120 so use the sun4u kernel.

[Linux] ~ # cd /srv/tftp
[Linux] /srv/tftp # cp /data/iso/sol10u8/Solaris_10/Tools/Boot/platform/sun4u/inetboot inetboot.sun4u
[Linux] /srv/tftp # ln -s inetboot.sun4u C0A88CCD

We’re ready to start up TFTP daemon (/usr/sbin/in.tftpd):

[Linux] ~ # /usr/sbin/in.tftpd -l -s -v -v /srv/tftp
[Linux] ~ # tail -f /var/log/messages
...
Feb 19 13:22:52 linux  in.tftpd[24576]: RRQ from 192.168.140.205 filename C0A88CCD

Check out the Sun’s console again. There should be something like:

Retrying ... Check TFTP server and network setup
Retrying ... Check TFTP server and network setup
3a000
Server IP address: 192.168.140.101
Client IP address: 192.168.140.205
Using Onboard Transceiver — Link Up.
Using RARP/BOOTPARAMS...
Internet address is: 192.168.140.205
[hangs here...]

You may need to restart netboot on the Sun box if it doesn’t go on with TFTP by itself.

BootParams configuration

At this point the Solaris kernel keeps sending out broadcast packets requesting supplement boot parameters.

Oh, wait, did I say “broadcast packets”? How does it know the broadcast address if RARP wouldn’t supply the netmask?! Well the answer is it doesn’t know it. The broadcast address is derived from the IP address using the obsolete class A/B/C schema, therefore for 192.168.140.205 it’s going to use 192.168.140.255, which is correct in my LAN. However if RARP gave it, say, IP 10.20.30.40 the kernel would use 10.255.255.255 as the broadcast, which is very likely incorrect. I don’t know if the Sun box can be told to use a different broadcast. I couldn’t find a way to do it and had to temporarily change network config of the Linux jumpstart server to 10.x.x.x/8 when I was in that situation. … now back to bootparams config.

The config file is /etc/bootparams and looks like this:

[Linux] ~ # cat /etc/bootparams
sunfire    root=linux:/sol10u8/Solaris_10/Tools/Boot install=linux:/sol10u8/ boottype=:in

The root= and install= parameters are NFS paths to the mounted Solaris 10 DVD ISO image.

Now beware! Another catch! Why does it say /sol10u8 instead of /data/jumpstart/sol10u8? That’s because Solaris tries NFSv4 mount first and as you may or may not be aware NFSv4 mounts all start from a specified directory and do not include the path from server’s root. For instance if we export /data/jumpstart as a NFSv4 root then linux:/ will mount /data/jumpstart/ over NFSv4. To mount the same directory over NFSv2 / NFSv3 we’d have to mount linux:/data/jumpstart but Solaris prefers NFSv4. The other option is to disable NFSv4 support entirely on the Linux server, for example in OpenSUSE set NFS4_SUPPORT="no" in /etc/sysconfig/nfs and restart the nfs server with service nfsserver restart. In that case Solaris kernel will fall back to NFSv3 and /etc/bootparams will have full paths in there. We’ll leave NFSv4 enabled…

Let’s start the NFS server daemons and export the jumpstart directory:

[Linux] ~ # service nfsserver start
Starting kernel based NFS server: idmapd mountd statd nfsd sm-notify    done
[Linux] ~ # exportfs *:/data/jumpstart -o fsid=0,ro,no_root_squash,crossmnt,no_subtree_check,sync

Here fsid=0 makes /data/jumpstart be the NFSv4 root and crossmnt enables the clients to see the ISO image mounted in sol10u8 subdirectory. See the manpage for exports(5) and exportfs(8) for more details.
It may be a good idea to try if we can mount the path that is set in /etc/bootparams:

[Linux] ~ # mount -t nfs4 linux:/sol10u8 /mnt
[Linux] ~ # ls /mnt
 Solaris_10  boot  installer  platform ...

Almost there

Reboot the Sparc server once again — either break into OpenBoot (“ok” prompt) with “break command” (Ctrl-A F in minicom or Stop-A from a Sun keyboard) or straight into LOM with “#.” (“lom>” or “sc>” prompt). In either case issue “reset” and then “boot net -v — install”. Netboot should now run smoothly right into the installation program:

ok boot net -v — install
Boot device: /pci@1f,0/pci@1,1/network@c,1  File and args: -v — install
Using Onboard Transceiver — Link Up.
(rarpd resolving IP address)
Timeout waiting for ARP/RARP packet
(tftpd serving the netboot kernel)
3a000
Server IP address: 192.168.140.101
Client IP address: 192.168.140.205
Using Onboard Transceiver — Link Up.
Using RARP/BOOTPARAMS...
Internet address is: 192.168.140.205
(bootparamd supplying paths to installation sources)
hostname: sunfire
Found 192.168.140.101 @ 0:f:1f:f8:01:23
root server: 192.168.140.101 (192.168.140.101)
root directory: /export/install/Solaris_10/Tools/Boot
(mounting nfs shares)
ramdisk-root [-] ufs-file-system
Loading: /platform/SUNW,UltraAX-i2/kernel/sparcv9/unix
Loading: /platform/sun4u/kernel/sparcv9/unix
module /platform/sun4u/kernel/sparcv9/unix: text at [0x1000000, 0x10a358d] data at 0x1800000
module /platform/sun4u/kernel/sparcv9/genunix: text at [0x10a3590, 0x126b757] data at 0x1866800
module /platform/SUNW,UltraAX-i2/kernel/misc/sparcv9/platmod: text at [0x126b758, 0x126b9c7] data at 0x18bc040
module /platform/sun4u/kernel/cpu/sparcv9/SUNW,UltraSPARC-IIe: text at [0x126ba00, 0x1278f17] data at 0x18bc780
(booting the Solaris kernel)
SunOS Release 5.10 Version Generic_141444-09 64-bit
Copyright 1983-2009 Sun Microsystems, Inc.  All rights reserved.
Use is subject to license terms.
[...]
Serial console, reverting to text install
Beginning system identification...
Searching for configuration file(s)...
Search complete.
Discovering additional network configuration...

Select a Language

   0. English
   1. French
   2. [...]

Please make a choice (0 — 9), or press h or ? for help: 0
[... and so on ...]

That’s all. From now on it’s a standard Solaris 10 installation. Enjoy ;-)

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>