Search This Blog

NIM: Installation and Configuration


When we first set up a Network Installation Management server for AIX in our own test lab, the unclear and somewhat self-contradictory NIM manual for AIX 4.3.3 made it a painful experience. Our goal is to make your path to a working NIM server/client environment shorter and more interesting. This article is intended as a practical, step-by-step guide for setting up a NIM server for AIX, and we provide it as a complement to the official manual.
We will not go into great detail of NIM basics. We still encourage you to read the "Network Installation Management Guide and Reference" for additional information, but we hope the manual will be easier to understand after you read this article.
A Few Assumptions
NIM client name: aix7
NIM master name: march
DNS domain name: testlab.com
Network where the machines are located: 192.168.1.0/24
The master should run the highest version of AIX that you are going to install via NIM. You cannot install AIX 5.2 from a master that runs on AIX 4.3.3. We also encourage you to install the latest firmware available for your machines. You can get it from the IBM Support Web site:
http://www-1.ibm.com/servers/eserver/support/pseries/index.html
NIM Server Installation
Before you start, we advise you to decide where you want the NIM lpp_source, SPOT, and other resources allocated. We found that having it on a separate logical volume makes sense for future optimization. We created separate logical volumes for lpp_source and SPOT resources. I cannot tell you if it's really a great idea to have it separate; you may find it unnecessary. In our situation, however, we were tight for hard-disk space, so saving a few gigabytes in this fashion made sense.
This article assumes you have created two filesystems: /export/nim/lpp_source and /export/nim/spot. The following two commands will create these filesystems. Note that both are created within nimvg. You might want to create a separate volume group (as we did) for NIM resources to improve disk I/O performance even further:
crfs -v jfs -g nimvg -a size=$((2000*500)) -m \
 /export/nim/lpp_source \
 -Ayes -prw -tno -a frag=4096 -a nbpi=4096 -a compress=no

crfs -v jfs -g nimvg -a size=$((2000*300)) -m /export/spot \
 -Ayes -prw -tno -a frag=4096 -a nbpi=4096 -a compress=no
Check that the NIM server fileset is installed (bos.sysmgt.nim):
lslpp -l | grep bos.sysmgt.nim
If it's not installed, put the first AIX CD into the server's CD drive and run:
installp -aXgd /dev/cd0 bos.sysmgt.nim
Once you have the disk space allocated for resources and the NIM fileset installed, you can carry on with the configuration.

To begin, let's define the network; run:
nimconfig -a netname=testlab -a pif_name=en0 -a platform=chrp \
 -a cable_type1='N/A'
Our master server was of chrp architecture. You can find out about yours by running:
 lscfg | grep Arch
Now we can define lpp_source and SPOT:
nim -o define -t lpp_source -a source=/dev/cd0 -a server=master \
 -a location='/export/nim/lpp_source/aix53_cd_lpp' aix53_cd_lpp

nim -o define -t spot -a source=aix53_cd_lpp -a server=master \
 -a location='/export/nim/aix53_cd_spot' aix53_cd_spot
In our lab, we defined a name convention and named directories containing a resource's files the same as the resource name. So, in the command above, the resource name is aix53_cd_lpp, and the location option defines where the files will be kept (i.e., in the directory called /export/nim/lpp_source/aix53_cd_lpp). The source option can be a directory that contains files from the AIX CD or any set of files that you want to define as a resource (see "Custom Software Installation with NIM" below).
We will need two services to be running on the master to facilitate network boot of clients: TFT and BOOTP. Put the following lines into the master's /etc/inetd.conf file:
tftp   dgram udp6 SRC  nobody /usr/sbin/tftpd  tftpd
bootps dgram udp  wait root   /usr/sbin/bootpd bootpd /etc/bootptab
and make inetd re-read the file by running:
refresh -s inetd
You may already have these lines in place if you didn't change the defaults. For the security-conscious (as we all should be), we will later show how to wrap this up with the TCP Wrapper program.
NIM Client Installation
Now we have defined the server resources, and we can set up our first NIM client. You will need to install the NIM client fileset (bos.sysmgt.nim.client) on the client machine. Put the first AIX CD into the CD drive and run:
installp -aXgd /dev/cd0 bos.sysmgt.nim.client
We need remote shell service to be running on the client side to make NIM operations possible. Put the following line into your /etc/inetd.conf file on client machine:
shell stream tcp6 nowait root /usr/sbin/rshd rsh
and make inetd re-read the file by running:
refresh -s inetd
Again, this line might already be in your /etc/inetd.conf if you didn't change the defaults. We will later show how to wrap it up with TCP Wrapper. For the moment, however, let's concentrate on getting the system working without the security features for easier troubleshooting.
We do need to put the master's root account name into the client's root $HOME/.rhosts file. The file should look like this:
march                root
march.testlab.com    root
It's good to have both short and fully qualified names of the master server in the file. This can save you the hassle of wondering why the rshell is not working.
At this point, we can use either of the following approaches:
1. We can define an NIM client by running the nim command on the master:
nim -o define -t standalone -a platform='rspc' \
 -a netboot_kernel='mp' -a if1='find_net aix7 000629F71EB' \
 -a cable_type1='N/A' -a net_definition='ent 255.255.255.0 \
 192.168.1.1 192.168.1.1' aix7
Remember that the client machine name is aix7. The machine is an older model 43P (rspc architecture) with single CPU (see parameter netboot_kernel; 'up' -- single CPU, 'mp' -- for SMP system). Note the long number after the machine name (000629F71EB) is the MAC address of the client Ethernet adapter. The two identical IP addresses later in the command (192.168.1.1) are the default gateway and the NIM master server default gateway, respectively. There might be a case when you have your master server on a different NIM client network.
2. We can use the niminit command on the client machine to do the same:
niminit -a name='aix7' -a master=march -a pif_name='en0' \
 -a cable_type1='N/A' -a platform=rspc -a netboot_kernel='mp'
As you can see, there are only a few differences between the nim and niminit parameters. Both commands do the same operation resulting in a record created for the machine (aix7) on the master NIM server and file /etc/niminfo on the client.
NIM Operations
Now we have everything necessary to try our first Base Operating System (BOS) installation. The process involves installing and configuring the minimum amount of software needed to bring a machine to the running state. All NIM operations can be initiated from either a server (push installation) or client (pull installation).
Let's look at a push installation:
nim -o bos_inst -a source=rte -a lpp_source=aix53_cd_lpp \
 -a spot=aix53_cd_spot -a boot_client=no aix7
In this example, we asked the NIM server to begin the installation of the OS from lpp_source and SPOT resources without a client reboot. Client reboot is the main thing here. You can push-install the OS and make the client machine reboot immediately (boot_client=yes) or you can prevent the immediate reboot (as we did using boot_client=no) and only allocate the resources for the client. The actual installation will begin when you reboot the client and force it to boot over the network.
For both methods, you will need to use SMS (System Management Services) to have the correct server, client, and gateway IP addresses configured for the network boot.
Access the SMS Menus
The SMS main menu looks similar to the following examples. Although it's slightly different on different pSeries models, it's easy to find your way through the menu.
To get to SMS menu, type F1 (or Esc+1 if you working through the serial port) when you see this line on the screen during initial boot of the machine:
memory      keyboard     network      scsi      speaker
Here is the menu you will see on pSeries 6C1:
pSeries Firmware
Version xxxxxxxx
(c) Copyright IBM Corp. 2000, 2002  All rights reserved.
------------------------------------------------------------------
Main Menu

1  Select Language
2  Change Password Options
3  View Error Log
4  Setup Remote IPL (Initial Program Load)
5  Change SCSI Settings
6  Select Console
7  Select Boot Options
8  View System Configuration Components
9  Update System/Service Processor Firmware

------------------------------------------------------------------
Navigation Keys:

                                    X = eXit System Management Services
------------------------------------------------------------------

Type the number of the menu item and press Enter or Select a Navigation Key:
And this is menu you will see on 44P-170:
RS/6000 Firmware
Version xxxxxxxx
------------------------------------------------------------------
System Management Services

1  Display Configuration
2  Multiboot
3  Utilities
4  Select Language


                                                          .------.
                                                          |X=Exit|
                                                          '------'
You have to change the IP addresses of Server, Client, and Gateway for the machine to boot successfully over the network:
RS/6000 Firmware
Version xxxxxxxx)
------------------------------------------------------------------
IP Parameters

1.  Client IP Address                   [192.168.1.3]
2.  Server IP Address                   [192.168.1.2]
3.  Gateway IP Address                  [192.168.1.1]
4.  Subnet Mask                         [255.255.255.0]
When you do boot_client=no, you must alter boot sequence of the client machine to get it to boot over the network first. With boot_client=yes, the sequence will be altered for you by NIM system and will return to "hard drive first" when the installation is over.
If the nim operation failed, use the following command to reset the client state:
nim -Fo reset aix7
You can investigate the problem using the NIM log facility:
nim -o showlog aix7
You may encounter difficulty if you forgot to add the remote shell to the client's /etc/inetd.conf file, if you forgot to mention the master's root account in client's root $HOME/.rhost file, or you have name resolution problems (check DNS settings). If everything was configured properly, you will see the usual AIX installation screen on the client after network boot.
If you go one step further and create a custom bosinst.data file, you can get a non-prompted network installation. We will talk later about using mksysb images in your NIM environment. This will let you clone your systems over the network using the power of NIM.
Custom Software Installation with NIM
Here we will cover installation of extra software, APARs, or maintenance-level packages. Let's say we have our client installed and we have maintenance level 9 on it (because that's the level of AIX on the CDs that we used for creation of the lpp_source and spot resources). Later, we need to upgrade the client to maintenance level 11. Let's do that using our freshly installed NIM system.
First, we must create an lpp_source resource consisting of the maintenance-level files. The files are in /mnt/patches/aix/433/ml0911. So, we run the following command on the master to define the lpp_source:
nim -o define -t lpp_source -a server=master \
 -a source=/mnt/patches/aix/433/ml0911 \
 -a location=/export/nim/lpp_source/aix53_ml0911_lpp \
 -a comments="4.3.3 maintenance level upgrade 09->11" aix53_ml0911_lpp
Second, we can use the "cust" operation to install from the lpp_source:
nim -o cust -a lpp_source=aix53_ml0911_lpp -a filesets='all' aix7
Note that for AIX 5.x lpp_source definition, the command would be different. We noticed that in 4.3.3, even if the source directory didn't have all the filesets for the lpp_source resource to have the "simages" attribute (meaning you can run the BOS installation using the lpp_source), the command above would finish successfully with a warning that you cannot use the lpp_source for bos_inst operation.
To define an lpp_source with not enough filesets (see NIM manual; lpp_source resource description) for the resource to have the "simages" attribute, you must use the "packages" attribute in the command. The attribute will list all the filesets you want to have in the resource directory. That is a lot of filesets! But, thanks to Unix, we have a solution. Here is the command:
nim -o define -t lpp_source -a server=master \
 -a source=/mnt/patches/aix/520/ml4fixes \
 -a location=/export/nim/lpp_source/aix520_ml4fixes_lpp \
 -a packages="`installp -L -d /mnt/patches/aix/520/ml4fixes \
 | awk -F: '{print $1}'`" aix520_3apars
We use a combination of the installp command and awk to list the filesets available in the source directory.
One thing that is not mentioned in the NIM manual is the installation of rpm packaged software that comes on the "Linux for AIX toolbox" CD.
Let's say you want to add the vnc rpm package to NIM lpp_source and install it using the NIM system. How would you make NIM use rpm instead of installp to do this? Simple. To begin, add the package to the lpp_source. To do this, you must copy the rpm package from the CD into the RPMS/ppc directory of the lpp_source.
For example, our aix53_cd_lpp resource directory is /export/nim/lpp_source/aix53_cd_lpp, so we copy the file into the /export/nim/lpp_source/aix53_cd_lpp/RPMS/ppc directory. Then we tell NIM about the change. Run the following command:
nim -o check aix53_cd_lpp
Now we can run the installation of vnc to the client:
nim -o cust -a lpp_source=aix53_cd_lpp -a filesets='R:vnc-3.3.3r1-2'
That's it. Thanks to the guys from the AIX newsgroup for the tip!
The same approach is valid when you want to add extra software into your lpp_source, which wasn't installed there by NIM during the define operation. Just copy the filesets into the installp/ppc directory under the lpp_source directory.
For example, our aix53_cd_lpp resource directory is /export/nim/lpp_source/aix53_cd_lpp, so we copy the filesets into the /export/nim/lpp_source/aix53_cd_lpp/installp/ppc directory. Then we can use the "check" operation shown previously for the vnc rpm file.
Mksysb and NIM
Another handy resource is mksysb. This tool allows you to clone your machines even faster than before. Say you already had a mksysb image of your client machine and now you'd like to use NIM to install it. All you need to do is to tell NIM where the mksysb image file is when defining a mksysb resource:
nim -o define -t mksysb -a server=master \
 -a location=/export/nim/mksysb/aix7.433.mksysb aix7_433_mksysb
Here we already copied mksysb image file aix7.433.mksysb into the /export/nim/mksysb directory, and we want to define it as a resource.
If you want to take the mksysb image from the client, then do:


nim -o define -t mksysb -a server=master \
 -a location=/export/nim/mksysb/aix7.433.mksysb \
 -a source=aix7 -a mk_image='yes' aix7_433_mksysb
Note that "aix7" as a source is not a machine name but is the NIM resource called aix7, the one the defines the machine aix7.
Now you can run the client installation using the image:
nim -o bos_inst -a source=mksysb -a mksysb=aix7.433.mksysb \
 -a spot=aix53_cd_spot -a boot_client=yes aix7
Note that the SPOT resource must be defined for the same version of AIX as your mksysb image. The maintenance level of the SPOT and the mksysb image must be the same as well.
Although it's handy to have an image of every machine in your lab, that takes a lot of disk space on your NIM master server. We found it more flexible to have a neutral mksysb image with all the necessary software but without any machine-name or IP-specific settings. This allowed us to clone many machines using a single mksysb image and apply final scripts to set the IP and other machine-specific parameters at the end of the BOS installation. This setup saves loads of disk space and makes maintenance of NIM easier.
Security
It's always good to have firewalls to secure your company networks, but really paranoid sys admins (as we all should be) would go one step further and secure each server. An extremely useful tool for this is the TCP Wrapper program, written by Wietse Venema. We will not describe the tool here. For those who want to know more, we recommend Practical UNIX & Internet Security by Garfinkel, Spafford, and Schwartz.
You can download TCP Wrapper already built for your version of AIX from:
http://www.bullfreeware.com/
Or, you can build it yourself with sources available from:
ftp://coast.cs.purdue.edu/pub/tools/tcp_wrappers
For our NIM installation, we want to protect both the server and the client. Let's do the server first. Change the lines in /etc/inetd.conf file (as mentioned at the beginning of the article) to the following:
tftp   dgram udp6 SRC  nobody /usr/local/bin/tcpd /usr/sbin/tftpd
bootps dgram udp  wait root   /usr/local/bin/tcpd /usr/sbin/bootpd \
  /etc/bootptab
and make inetd re-read the file by running:
refresh -s inetd
Create file /etc/hosts.allow and put the following line in it:
tftpd,bootpd:    192.168.1.
Next, create file /etc/hosts.deny and put the following line in it:
ALL: ALL
We will protect the client in a similar way. The line in /etc/inetd.conf transforms into:
shell stream tcp6 nowait root /usr/local/bin/tcpd /usr/sbin/rshd
Then we make inetd re-read the file by running:
refresh -s inetd
Next, add march into /etc/hosts.allow:
rshd: march.testlab.com
The /etc/hosts.deny file is the same as on the server.
Run /usr/local/bin/tcpdchk -v to verify that your settings are correct. That's the simplest way to protect our NIM operations.