Setting Up a PXE Server on an RPM-based OS

From Alteeve Wiki
Revision as of 04:31, 23 June 2010 by Digimer (talk | contribs)
Jump to navigation Jump to search

 AN!Wiki :: How To :: Setting Up a PXE Server on an RPM-based OS

This tutorial covers the steps needed to make a PXE server. It will be used for hosting multiple Operating Systems that can be booted from a machine's network card. The main reason for this setup is to host installation media removing the requirement for have optical drives in machines. It also saves you from having a pile of optical discs kicking around.

Prerequisite

This tutorial assumes that you have a fresh install of Fedora 13 and that the machine's eth0 device has been statically set to 192.168.1.10 and the subnet's router is set to 192.168.1.1. This should be easy to adapt to other distributions and network configurations.

Parts Needed

A PXE boot server is fairly strait forward. You need:

  • dhcp; This answers a workstation's request for an IP during the boot process.
  • tftp-server; This is a PXE compliant FTP server than handles passing the core boot files to the remote machine.
  • syslinux; This handles those special boot files that the remote machine needs to boot.
  • httpd; Once the boot files start up the remote machine, generally you will tell it to pull the main files from a webserver. This is the Apache webserver that will server that purpose.

dhcp

You're probably familiar with DHCP from a client perspective; It's the method used to get an IP address from most networks when you join them. This is a pretty old and simple protocol and is easy to setup.

A Word On Network Separation

Before you do though, you must take into account any other DHCP servers on your network. More to the point, you need to make sure there are no other DHCP servers on your network. The reason is that, when you try to PXE-boot a machine, it's up to the DHCP server that responds first to tell the client about the PXE server. If a "normal" DHCP server answers first, there simply won't be any instructions and your machine will not actually boot.

Configuration File

The core file to edit is /etc/dhcp/dhcpd.conf.

Note: On many systems, this *used* to be /etc/dhcpd.conf, but on Fedora 13 it's been moved into it's own directory. If you are adapting this tutorial for another operating system, please check to see where your server expects this file to be.

vim /etc/dhcp/dhcpd.conf
### Global options
# General domain information
option domain-name "alteeve.com";
option domain-name-servers 192.139.81.117, 192.139.81.1;

# Tell the server that it's authoritive on our network.
authoritive;

### Subnet options
subnet 192.168.1.0 netmask 255.255.255.0 {
	# This is the DHCP server, but not the actual Internet gateway. So this
	# Argument points our clients to the right box.
	option routers 192.168.1.1;
	
	# Set our range. This can be whatever you want so long as it fits in
	# your netmask.
	range 192.168.1.100 192.168.1.220;
	
	# If clients don't ask, make the lease available for the following
	# number of seconds. If the client does ask, allow up to this number of
	# seconds. 86,400s = 24h.
	default-lease-time 86400;
	max-lease-time 86400;

	# These two options tell clients where to go to get the file needed to
	# start the boot process.
	next-server 192.168.1.10;
	filename "pxelinux.0";
}

Now set dhcpd to start with your machine and then start it up for the first time.

chkconfig dhcpd on
/etc/init.d/dhcpd start

Done!

This isn't meant to be a dhcpd tutorial, so I am not showing a lot of options you may find useful. Please take the time to read the man dhcpd.conf and man dhcp-options page to see all the other neat things you can do.

tftp

This is the PXE-compliant FTP program that transfers the boot files from the PXE server to the client. It is pretty trivial to set up.

Edit /etc/xinted.d/tftp and simply add disable = no. The edited file should look like this:

vim /etc/xinetd.d/tftp
# default: off
# description: The tftp server serves files using the trivial file transfer \
#       protocol.  The tftp protocol is often used to boot diskless \
#       workstations, download configuration files to network-aware printers, \
#       and to start the installation process for some operating systems.
service tftp
{
        disable                 = no
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        disable                 = yes
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

Being an xinetd service, that is what we need to enable at boot time and then start.

chkconfig dhcpd xinetd
/etc/init.d/xinetd restart

Done!

pxelinux

In the xintd file for tftp was this line:

        server_args             = -s /var/lib/tftpboot

This determines where the PXE boot files will be setup. Some people like to change this to be /tftpboot, but we'll keep it there to keep things simple. In Fedora, this directory already exists and should be world-readable. If it isn't for some reason, create it and set the permissions to 0755 or 0777, depending on your security requirements.

Setting Up the Boot Environment

Next up, we need to copy a couple files into the tftpboot directory. These files are provided by the syslinux package we installed earlier and can be found in the /usr/share/syslinux/ directory.

The main files are:

  • pxelinux.0: This is the actual kernel that is passed to the client to begin the boot process. You'll notice this is the file specified in the dhcpd.conf file earlier in our setup. It boots the client far enough so that it can see the boot menu, if any, and then move on to find the main system to boot. This "main system" could be a boot DVD or a full OS.
  • vesamenu.c32: This is the 32-bit comboot file. This enables 32-bit colour images to be used for the boot menu (alpha+rr+gg+bb). This replaces the older 16-colour menu.c32 of earlier version that allow for very basic images.
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/vesamenu.c32 /var/lib/tftpboot/

Client Configuration Files

Client configuration files will be placed in a new directory under tftpboot called pxelinux.cfg. So to start, we need to create it:

mkdir /var/lib/tftpboot/pxelinux.cfg

Before we talk about the contents of the configuration files, it is important to understand how the PXE server decides which one to use for a given client.

When a client connects, the PXE server looks at the client's MAC address and checks to see if there is a matching hyphen-separated configuration file. If that isn't found, it then looks at the client's IP address, as set by the DHCP server. It looks for configuration files matching the hexadecimal representation of the IP address. For example, If the client was given the IP address 192.168.1.200, the PXE server will start by looking for a configuration file called C0A801C8. If it doesn't find a matching file, it will then knock-off the right-most nibble and check again. It will do this until all the possible file names are checked.

If the PXE server finds no configuration file matching the MAC address or any variant on the IP address, it falls back to a configuration file called default.

Let's show this series using the example of a client with MAC address 00:24:7e:69:6f:0e and having been assigned the IP address 192.168.1.200. The PXE server will then look for the following configuration file names in the following order:

/var/lib/tftpboot/pxelinux.cfg/00-24-7E-69-6F-0E
/var/lib/tftpboot/pxelinux.cfg/C0A801C8
/var/lib/tftpboot/pxelinux.cfg/C0A801C
/var/lib/tftpboot/pxelinux.cfg/C0A801
/var/lib/tftpboot/pxelinux.cfg/C0A80
/var/lib/tftpboot/pxelinux.cfg/C0A8
/var/lib/tftpboot/pxelinux.cfg/C0A
/var/lib/tftpboot/pxelinux.cfg/C0
/var/lib/tftpboot/pxelinux.cfg/C
/var/lib/tftpboot/pxelinux.cfg/default

I've made a little script to convert decimal-type IP addresses into hexadecimal-type specifically to help in naming these configuration files. I am sure there are many others out there.

Inside the Configuration Files

All of the possible configuration files can be setup using the same set of options and can be setup in similar ways. There is nothing special about any given configuration file. For this reason, we will cover the contents of the default configuration file. Any other configuration files will most likely be simpler that the one below, so it should be relatively easy to adapt.

Let's start by looking at an complete example file:

default vesamenu.c32 
timeout 600
prompt 0

menu background isolinux/splash.jpg
menu title  Interlink PXE Server

menu color border 0 #ffffffff #ee000000 std
menu color title 0 #ffffffff #ee000000 std
menu color sel 0 #ffffffff #85000000 std
menu color unsel 0 #ffffffff #ee000000 std
menu color pwdheader 0 #ff000000 #99ffffff rev
menu color pwdborder 0 #ff000000 #99ffffff rev
menu color pwdentry 0 #ff000000 #99ffffff rev
menu color hotkey 0 #ffff3f7f #ee000000 std
menu color hotsel 0 #ffffffff #85000000 std
menu color tabmsg 0 #ff00dfdf #00000000


LABEL next
	menu label ^1) Boot local hard drive.
	localboot

label f13_i386
        menu label ^2) Fedora 13 i386 Full Install.
        kernel f13/i386/vmlinuz
        append initrd=f13/i386/initrd.img ramdisk_size=7000 ks=http://10.255.0.1/f13/i386/ks/ks.cfg ksdevice=eth0 text

label f13_x86_64
        menu label ^3) Fedora 13 x86_64 Full Install.
        kernel f13/x86_64/vmlinuz
        append initrd=f13/x86_64/initrd.img ramdisk_size=7000 ks=http://10.255.0.1/f13/x86_64/ks/ks.cfg ksdevice=eth0 text

label c5_x86_64
        menu label ^4) CentOS x86_64 Full Install.
        kernel c5/x86_64/vmlinuz
        append initrd=c5/x86_64/initrd.img ramdisk_size=7000 text

To keep things simple, this configuration file doesn't use sub-menus. Let's now take a look at the various parts.

Credits

References used:

 

Any questions, feedback, advice, complaints or meanderings are welcome.
Alteeve's Niche! Enterprise Support:
Alteeve Support
Community Support
© Alteeve's Niche! Inc. 1997-2024   Anvil! "Intelligent Availability®" Platform
legal stuff: All info is provided "As-Is". Do not use anything here unless you are willing and able to take responsibility for your own actions.