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:
- Boot the Sun box into OpenBoot Prompt (aka
ok
prompt) and invoke a network boot with:boot net -v — install
- 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. - tftp — With IP assigned the Sun box tries to load a Solaris kernel over tftp from the server that replied to the RARP request.
- bootparams — The kernel half-boots and sends out a bootparams request to find the NFS installation source.
- 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.
- 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 thenlinux:/
will mount/data/jumpstart/
over NFSv4. To mount the same directory over NFSv2 / NFSv3 we’d have to mountlinux:/data/jumpstart
but Solaris prefers NFSv4. The other option is to disable NFSv4 support entirely on the Linux server, for example in OpenSUSE setNFS4_SUPPORT="no"
in/etc/sysconfig/nfs
and restart the nfs server withservice 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