Installing Solaris via JumpStart from a Linux server.
Thanks to Jon Still, Tim Gibbons, Scott Mann and Chris Cosby for helping me improve this document.
Any feedback is welcome, problems hints or a simple "that works, hurrah" are helpful. Drop me a line at alex at transposed dot org.
Note: This is only likley to work with Solaris 8 or newer. Something to do with the ip fragementation in the inetboot kernels for 7 and earlier being broken. Possibly.
What you will need
- A Linux system
- A set of Solaris install media for the system you want to install
- pdksh (if you want to install the second CD)
- A Kernel with NFSv3 support
Copying the install media to the server
I have heard that you can jumpstart direct by exporting the CDs, but this is faster for the installs.
Pick a location to put the cd images, /home/jumpstart in my case. Then create it and an install and config subdirectory. The config dir is only necessary if you intend to want to do non-interactive jumpstarts.
mkdir -p /home/jumpstart/install
In order to run the setup_install_server script you'll need to create a "/bin/bar" symlink to "/bin/tar" as the scripts calls a tar-a-like to do the copying.
ln -s /bin/tar /bin/bar
For Solaris 10 you also need to create a /bin symlink for sed, adb to gdb, and a copy of the Solaris "mach" script.
ln -s /bin/sed /usr/bin/sed
ln -s /usr/bin/gdb /usr/bin/adb
echo "#!/bin/bash" > /bin/mach
echo "uname -p" >> /bin/mach
chmod +x /bin/mach
Mount Solaris CD 1 / the Solaris DVD, and use the setup_install_server script. Then run the setup_install_server script.
Replace the cd with cd 2 (if you don't have a cd 2, dont worry about it - skip to the next section). Even in Solaris 8 you can get away with just using cd1 if youre not going for one of the bigger installs. The add_to_install_server is written in ksh, so this is what you need pdksh for. It's odd that these scripts are completley different, and it seems this one uses cpio to copy the data. Weird eh? Anyway, most of it works ok apart from the disk space checking thing, so set and export $NOSPACECHK before you run it. I'm sure you can cope with checking how much space you have free.
NOSPACECHK="yes"; export NOSPACECHK
Set up the NFS server
If you've not already done so, install rarpd, bootparamd and tftpd. I'm assuming you're using the kernel nfsd here.
Set up the NFS export. Put the follwing in /etc/exports, but use appropriate values for your site. The config export is optional, depending on wether you want to use non-interactive jumpstart or not.
For newer versions of the linux nfsd, nfsv4 may well be enabled by default. It's probably easier to disable it - add " --no-nfs-version 4" to the nfsd parameters, however your Linux distribution chooses to do that.
Set up the server for the client
This is where it gets a little fiddly, for each install client you need an entry in /etc/hosts, /etc/ethers and /etc/bootparams and a symlink to the appropriate kernel in /tftpboot
This one is easy, you need the hostname and its IP address. Put it in /etc/hosts in the following format:
Also, ensure that your server's hostname is *not* listed against 127.0.0.1. If it is, remove it from that line and give it its own line, so your hosts file looks like this (where jumpstartserver is your server).
127.0.0.1 localhost.localdomain localhost
This is so that rarpd can respond to the client's request for an IP address. It does this by resolving it's MAC address to a hostname, and uses /etc/hosts to turn that in to an IP. In /etc/ethers:
This is the config so the client knows where to access the install image and configurations. In /etc/bootparams, where jumpstartserver is my jumpstart server:
jumpstartclient root=jumpstartserver:/home/jumpstart/install/Solaris_8/Tools/Boot \
This is the really fiddly bit. Either you calculate the client's IP address in hex format, or you use tcpdump to determine what it's requesting.
This is becase the client will request an inetboot file from the tftp server. It will be named in the format HEXIPADDR.ARCH or just HEXIPADDR (some machines do not request the .ARCH part of the filename). In my case, it is C0A80104.SUN4U. So if, like me you don't fancy calculating this name, start the bootparamd and the rarpd (you may need to start the rarpd with -e as some versions will not respond to rarp queries if there is not a corresponding image in /tftpboot to serve.
According to Jon,
perl -e 'printf "%02x"x4 ."\n",192,168,1,4;'|tr a-z A-Z
will give you the hex address (where the IP is 192.168.1.4).
Similarly, you can do it in shell like this:
printf %02x 192 168 1 4|tr [:lower:] [:upper:]
Once your services are started, get tcpdump on the go (this is best done on a quiet or switched network, and boot net - install your client. tcpdump should produce a line like this:
08:59:24.640821 jumpstartclient.40337 > jumpstartserver.beau.net.tftp: 23 RRQ "C0A80104.SUN4U"
Alternativley, running bootparamd with -d and -s flags should write the filename being requested to the syslog
Once you have this filename, you can copy the appropriate inetboot image from your /home/jumpstart/install hierachy. The example below is appropriate for a sun4m architecture machine, modify it for other systems
cp /home/jumpstart/install/Solaris_8/Tools/Boot/usr/platform/sun4m/lib/fs/nfs/inetboot /tftpboot/inetboot.sun4u
ln -s inetboot.sun4u C0A80104.SUN4U
ln -s inetboot.sun4u C0A80104
Enable your tftpd and you should be ready to go!
Jumpstart the client
Stop-A the client and get it to the openboot prompt. From there type either:
boot net - install
(for a non-interactive install)
boot net - text
(for an interactive install)
IMPORTANT. One problem I have had with this is that when it boots, after it configured the network interface (a message like "Configured interface le0" is displayed), the client just sits there. Sending the client a ping should wake it up and it will continue fine. Weird eh?