Kickstart and PXELinux

As part of a vertical consolidation and virtualization project, I had set up a Kickstart configuration in order to boot x86 servers and install the VMWare ESX Server software. While I wrote this document specifically for ESX installations, the underlying OS was a modified Redhat 7.x distro (or something that seemed awfully similar). So here are the steps to implement and use a PXEBooting Kickstart environment.


  1. Linux server (can use a manually built ESX server for this purpose) with dhcpd (dhcp daemon), tftpd (tftp daemon) and nfs server services turned on.
  2. Have the dump of the ESX installation media CD in a directory/filesystem large enough to hold it.
mount /dev/cdrom /mnt

mkdir –p /images/install

cp –pra /mnt/* /images/install

umount /mnt

cd /images/ install/images

mount –o loop ./bootnet.img /mnt

cd /mnt

mkdir –p /tftpboot/pxelinux.cfg

cp boot.msg initrd.img syslinux.cfg vmlinuz /tftpboot

cd /tftpboot

umount /mnt

cp syslinux.cfg pxelinux.cfg/default


  • Having copied these files over, now make a copy of the /tftpboot/pxelinux.cfg/default to /tftpboot/pxelinux.cfg/bootnet
  • Edit /tftpboot/pxelinux.cfg/bootnet to make it look like this:

default ks
prompt 0
timeout 0
display boot.msg
F1 boot.msg
label linux
kernel vmlinuz
append initrd=initrd.img
label ks
kernel vmlinuz
append apic ks=nfs: ramdisk_size=10240 initrd=initrd.img

NOTE: Make sure that there isn’t actually a line break in the line starting with append (the entries following the “append” directive need to be on the same line and “\” has been put in for ease of readability only).

  • Get a copy of the “syslinux” distribution (run the commands listed below):

Explode the tarball like this:

# cp syslinux-3.07.tar.gz /tmp
# tar zxvf /tmp/syslinux-3.07.tar.gz
# cd /tmp/syslinux-3.07
# cp syslinux.0 /tftpboot

  • Edit the dhcp configuration file like this:

# vi /etc/dhcpd.conf

# ddns-update-style none;
ignore client-updates;
allow bootp;
allow booting;
option ip-forwarding false;
option mask-supplier false;
get-lease-hostnames off;
use-host-decl-names off;
option routers;

subnet netmask {
default-lease-time 1800;
max-lease-time 3600;
option subnet-mask;

host hostA {
hardware ethernet 00:AA:BB:CC:DD:EE;
#option option-214 “0AA5D6A4”;
filename “/tftpboot/pxelinux.0”;

NOTE: Choose the correct subnet (that your servers will reside in).

  • Make sure that the tftpd daemon is installed and edit the file /etc/xinetd.d/tftp to look like this:

service tftp
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = no
per_source = 11
cps = 100 2

  • It is to be noted that the default ESX server install comes with gcc (2.96) and make (GNU Make version 3.79.1). But the tftp daemon and the dhcp daemon (server-side) aren’t installed by default.
  • Download the latest versions of the dhcp sources (can obtain the software by following instructions at this url: and build it by following the instructions in the README file or INSTALL file of the distribution (usually it is a standard method of ./configure; make; make install)
  • Similarly, obtain a copy of the latest tftp source from ( Following the build instructions will result in the installation of the tftpd binary on the system.
  • Start the dhcp daemon by running:

dhcpd -cf /etc/dhcpd.conf

  • Start the tftp daemon by sending a SIGHUP to the xinetd daemon

kill -HUP `ps -ef|grep xinetd|grep -v grep|awk ‘{print $2}’`

  • The NFS server services need to be started up after creating the appropriate NFS shares in /etc/exports. The contents of the /etc/exports file should look like this:

/vmimages/install *(ro,no_root_squash)
/vmimages/kickstart *(ro,no_root_squash)
/tftpboot *(ro,no_root_squash)

  • Start NFS services by running the following commands:

# cd /etc/rc.d/init.d
# ./portmap start
# ./nfs start
# ./nfslock start

  • After ensuring that the target ESX server (hardware) is plugged into the right subnet, boot the server and choose the PXE boot option. The booting from the PXE Ethernet ROM happens like this:

  1. Server boots and the PXE ROM loads, tries to acquire an IP address from the DHCP server (bootp).
  2. Once the IP address is obtained, the pxelinux.0 binary loads and obtains the vmlinuz kernel image via tftp.
  3. The initial ramdisk image (initrd, also acquired via tftp) is loaded into memory (to create the root filesystem in RAM).
  4. The kickstart configuration (ks.cfg) is acquired via NFS and used by the installer to do the “hands-free” installation.

Using the script

#!/usr/bin/perl -w

# Version: 1.2 (SCCS)

use File::Copy;

use Getopt::Std;

my %Args;
my $dhcp_config = “/etc/dhcpd.conf”;
my $null = “/dev/null”;
my $tftpdir = “/tftpboot”;
my $pxedir = “$tftpdir/pxelinux.cfg”;
my $netboot_cfg = “$pxedir/netboot.1”;

# Main

getopts( “m:s:i:h”, \%Args );

if ($Args{h}) {
printUsage() && exit 0;

$mac = $Args{m} || printUsage() && die “Unable to continue without a mac address \n”;

$hostname = $Args{s} || printUsage() && die “Unable to continue without a server name \n”;

$ip = $Args{i} || printUsage() && die “Unable to continue without an IP address \n”;

copy(“$dhcp_config”, “$dhcp_config.$$”) or die “Unable to backup $dhcp_config: $! n”;

open(DHCP, “>> $dhcp_config”) or die “Unable to write to $dhcp_config : $! \n”;

print DHCP “\n”;
print DHCP “host $hostname\{ \n”;
print DHCP “hardware ethernet $mac; \n”;
print DHCP “fixed-address $ip; \n”;
print DHCP “filename \”$tftpdir/pxelinux.0\”; \n”;
print DHCP “\} \n”;

print “Killing dhcp daemon…\n”;
system(“/usr/bin/pkill dhcpd”);
print “Starting dhcp daemon….\n”;
$start_cmd = “/usr/sbin/dhcpd -cf $dhcp_config”;

sub printUsage {
print “Correct Usage: $0 -m \”\” -s -i \”\” | -h \n”;

Using the script (modify to your heart’s content) , one could set up the dhcpd entries (knowing well that our friendly vi editor isn’t necessarily the most user-friendly (especially to the UNIX un-initiates..)) rather quickly/easily.

Here’s how:

# chmod +x
# ./ –m “11:22:33:44:55:66” –s buildserver01 –i “”

Would set up entries in dhcpd.conf like this:

[root@ksserver bin]# ./ -m “11:22:33:44:55:66” -s buildserver01 > -i “”
Killing dhcp daemon…
Starting dhcp daemon….
Internet Systems Consortium DHCP Server V3.0.1
Copyright 2004 Internet Systems Consortium.
All rights reserved.
For info, please visit
Wrote 0 deleted host decls to leases file.
Wrote 0 new dynamic host decls to leases file.
Wrote 0 leases to leases file.
Listening on LPF/eth0/00:11:0a:53:e8:98/
Sending on LPF/eth0/00:11:0a:53:e8:98/
Sending on Socket/fallback/fallback-net

Take a look at the /etc/dhcpd.conf file later:

[root@ksserver bin]# tail /etc/dhcpd.conf
hardware ethernet 00:11:AA:BB:CC:DD;
filename “/tftpboot/pxelinux.0”;

host buildserver01{
hardware ethernet 11:22:33:44:55:66;
filename “/tftpboot/pxelinux.0”;

4 thoughts on “Kickstart and PXELinux”

  1. Great article,

    one correction i noticed so far,

    Explode the tarball like this:

    When working with syslinux, change syslinux.0 to pxelinux.0
    # cp pxelinux.0 /tftpboot

    I got great stuff for vmware esx on my site, visit htttp://


  2. another correction in dhcpd.conf file

    filename “/tftpboot/pxelinux.0”;
    filename “pxelinux.0”;


    I got great stuff for vmware esx on my site, visit htttp://


  3. Implicate Order

    Hi ServerChief,

    Thanks for your comments.
    However, what I have here is a working configuration — I’ve had the Windows Admins build literally 100s of servers using this configuration tool + method.

    I should also test the procedure with your tweaks…

    thx for stopping by…

  4. Hi Implicate Order,

    Thanks for the response, I’m surprised no mentioned what I said.

    Here is my setup: I’m purposely using Redhat 3 release to match ESX as closely as possible. I have deployed 5 ESX hosts just now..

    Issues I have encountered are few hours old. There are few more things that don’t match.

    There is a mismatch between images directory and vmimages in this post. Example

    mkdir –p /images/install

    and then you NFS mount vmimages

    /vmimages/install *(ro,no_root_squash)
    /vmimages/kickstart *(ro,no_root_squash)

    This applies to ESX 3.0.1:
    The initrd and vmlinuz must copied of /images/install/images/boot.iso

    There is another iso file called bootdisk.iso, however, the initrd and vmlinuz don’t contain network/scsi modules, therefore NFS mount will fail. Don’t use bootdisk.iso

    All in all, i’m really thankful for this post. Please take my messages as a suggestion only.


Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.