I recently built a new file server (SuperMicro C2SBX+, Q9550, 8GB, 2*1TB - nice and fast, and has good Solaris support) on which I planned to install Solaris 10 10/08. I'm not a fan of CD/DVD installs, so wanted to jumpstart via PXE, though I only had OSX handy. Here's how I installed my new machine (gromit.adsl.perkin.org.uk/192.168.1.10) from my iMac (192.168.1.30) over the local network.
Step 1, Prepare File System
First off, HFS+ case-insensitive file systems will not work, pkgadd(1M) just cannot grok packages served up like that, so you need to create a UFS image on which to serve your jumpstart environment. Here I create an 8G (plenty for just one install, once I've installed Solaris I'll use that as my jumpstart server) image which I then mount under /install
# hdiutil create -size 8g -type SPARSE -fs UFS -volname "install" install # hdiutil attach install.sparseimage -mountpoint /install
Next up, download and mount sol-10-u6-ga1-x86-dvd.iso then copy it across to /install.
# rsync -av /Volumes/SOL_10_1008_X86/ /install/sol10u6x/
Step 2, NFS
Share /install via NFS with the correct options. -alldirs allows clients to mount from any point within that file system (which jumpstart requires), and -maproot=root is also required by jumpstart. As this allows root-owned files to be created, make sure you understand the security risks.
# vi /etc/exports /install -alldirs -maproot=root # nfsd checkexports && nfsd enable
Step 3, DHCP
For DHCP I happen to already use my Cisco router as a DHCP server on the local network, so added the following configuration:
ip dhcp pool gromit.adsl.perkin.org.uk host 192.168.1.10 255.255.255.0 hardware-address xxxx.xxxx.xxxx bootfile /boot/grub/pxegrub next-server 192.168.1.30 client-name gromit domain-name adsl.perkin.org.uk dns-server xxx.xxx.xxx.xxx default-router 192.168.1.1
however, given this is a guide for setting everything up under OSX I also tried using ISC DHCP on OSX to prove it can be done that way too.
I used pkgsrc to install it (I'll add another blog some time showing how to set up pkgsrc)
# cd /usr/pkgsrc/net/isc-dhcpd # bmake package
And here is my DHCP configuration file in full.
# vi /usr/pkg/etc/dhcp/dhcpd.conf
option domain-name "adsl.perkin.org.uk";
option domain-name-servers xxx.xxx.xxx.xxx;
ddns-update-style none;
authoritative;
log-facility local7;
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
}
group {
filename "/boot/grub/pxegrub";
next-server 192.168.1.30;
host gromit {
hardware ethernet xx:xx:xx:xx:xx:xx;
fixed-address 192.168.1.10;
option host-name "gromit.adsl.perkin.org.uk";
}
}
Finally, start DHCP with:
# /usr/pkg/sbin/dhcpd
Most parts of these configurations should be self-explanatory. The /boot/grub/pxegrub entry is important for our next step, and I'd recommend using that exact pathname for reasons explained later.
Step 4, TFTP
Now, enable the TFTP server which comes with OSX. I added the -s option so tftpd would chroot to the tftpboot directory, both for security reasons and also to ensure that paths specified as /path/to/file would work correctly (relative to /install/tftpboot). I also changed the location of the tftpboot directory so that everything was self-contained within the UFS image. In previous attempts I didn't do this and ran into problems with GRUB which I think are again caused by case-insensitive file systems.
# vi /System/Library/LaunchDaemons/tftp.plist
[...]
<key>ProgramArguments</key>
<array>
<string>/usr/libexec/tftpd</string>
<string>-i</string>
<string>-s</string>
<string>/install/tftpboot</string>
</array>
[...]
# mkdir /install/tftpboot
# launchctl load -w /System/Library/LaunchDaemons/tftp.plist
You can then create a test file and check that it's working as you expect, using:
# echo "testing" >/install/tftpboot/testfile # printf "verbose\ntrace\nget testfile\n" | tftp localhost
Step 5, GRUB
Next up, configure PXE booting using GRUB. We need to copy the GRUB images and configuration from the Solaris install DVD then modify it for our environment
# rsync -av /install/sol10u6x/boot/grub /install/tftpboot/boot/
# rsync -av /install/sol10u6x/boot/multiboot /install/sol10u6x/boot/x86.miniroot \
/install/tftpboot/sol10u6x/
As we are copying the boot files from the DVD, they come hardcoded with particular pathnames to e.g. the menu.lst file. While it may be possible to pass extra parameters to pxegrub and load this from a different path, I simply recommend doing as I do and replicating the /boot/grub/ path structure so that everything Just Works.
The menu.lst file includes kernel arguments and allows you to choose which type of install to perform at startup. My file listed below has 3 choices:
- Unattended install using a graphical environment (if available). The 'install' keyword after the kernel instructs it to perform an unattended install, so long as it can find the necessary settings from sysidcfg etc.
- As above, but force the use of the console and do not start a graphical environment (using the 'nowin' keyword)
- A manual install, so you need to go through the steps of layout out disks, selecting packages, etc.
# vi /install/tftpboot/boot/grub/menu.lst
default=0
timeout=60
title Solaris PXE Unattended Install
kernel /sol10u6x/multiboot kernel/unix - install -B install_media=192.168.1.30:/install/sol10u6x,sysid_config=192.168.1.30:/install/jumpstart,install_config=192.168.1.30:/install/jumpstart
module /sol10u6x/x86.miniroot
title Solaris PXE Unattended Install (console)
kernel /sol10u6x/multiboot kernel/unix - install nowin -B install_media=192.168.1.30:/install/sol10u6x,sysid_config=192.168.1.30:/install/jumpstart,install_config=192.168.1.30:/install/jumpstart
module /sol10u6x/x86.miniroot
title Solaris PXE Manual Install
kernel /sol10u6x/multiboot kernel/unix -B install_media=192.168.1.30:/install/sol10u6x
module /sol10u6x/x86.miniroot
Anyone used to doing jumpstart but with RARP/bootparams will notice the symmetry between install_config etc in the GRUB configuration and similar options in /etc/bootparams. Make sure that the full kernel arguments are all on one line, and that there are no spaces in between the install_media=...,sysid_config=... options.
Step 6, Jumpstart
Finally, set up your Jumpstart configuration. Here's what I personally use, you may want something different
# mkdir /install/jumpstart
# cd /install/jumpstart
# vi sysidcfg
name_service=DNS
{
domain_name=adsl.perkin.org.uk
name_server=xxx.xxx.xxx.xxx
}
network_interface=PRIMARY
{
default_route=192.168.1.1
netmask=255.255.255.0
protocol_ipv6=yes
}
nfs4_domain=dynamic
root_password=xxxxxxxx
terminal=xterm
timeserver=localhost
timezone=Europe/London
security_policy=NONE
service_profile=limited_net
system_locale=C
Ordinarily this file is processed using a 'check' script available in the jumpstart_sample directory on the Solaris DVD, however this only works from a Solaris host. To create the rules.ok file, we need to strip out any comments and put entries on one line, then create the checksum (although this isn't actually necessary).
# vi rules # emacs sucks!
hostname gromit.adsl.perkin.org.uk - profile -
# cp rules rules.ok
# echo "# version=2 checksum=$(cksum -o 2 rules | awk '{print $1}')" >> rules.ok
Machine profile. This gives me a full Solaris install (minus OEM stuff) on mirrored ZFS disks with additional dump/swap space (the defaults made dump a bit too small I found).
# vi profile install_type initial_install pool store auto 4g 4g mirror c1t0d0s0 c1t1d0s0 bootenv installbe bename s10x_u6wos_07b cluster SUNWCall
Step 7, Make A Cup Of Tea
With everything set up you should be able to enable PXE booting in your BIOS and watch it automatically install. One small minor problem you may have if you don't have a BIOS which allows you to hit F12 or similar and choose PXE booting for one boot only is that it will infinitely cycle through installing-rebooting-installing-rebooting... until you change your boot options. If this happens, I recommend making more cups of tea until you happen to return in time to change the BIOS settings. If you aren't able to do this for a while, you may need to add the extra steps 8, 9 and 10 titled "Visit The Bathroom".