Tuesday, November 13, 2012

CentOS 6 Anaconda / Kickstart PXE Boot & Install Server HOWTO


This page describes how to configure CentOS 6.3 as an Anaconda & Kickstart PXE boot and install server.   The following guide outlines the details for setting up both CentOS 6.3 x86_64 and CentOS 6.3 i386 on the same server.  With a bit more effort, it is also possible to install other Enterprise Linux versions using the same install server (e.g. CentOS 5.8 or any version of Red Hat Enterprise Linux).

Step 1)  Download the CentOS DVD ISOs


o   Keep these available, you'll need them again later in this process.

# 64-bit
wget http://www.gtlib.gatech.edu/pub/centos/6.3/isos/x86_64/CentOS-6.3-x86_64-bin-DVD1.iso
# 32-bit
wget http://www.gtlib.gatech.edu/pub/centos/6.3/isos/i386/CentOS-6.3-i386-bin-DVD1.iso

Step 2) Install CentOS 6.3


o   This will be the anaconda / kickstart server.
o   Start with a 'minimal' install.
o   Make sure to have at least 40GB of free space on / or mounted as /export.
o   This guide uses yum to install the required additional packages.
o   Internet (or a Satellite Server) access isn't necessarily required, but it does make it easier.
o   In lieu of Internet/Satellite access, you could use rpm to install the required packages, but it's more difficult and you will have to install all dependent packages manually.

Step 3) Configure the network interface(s)


o   Don't use dhcp for the anaconda / kickstart server's network interface.
o   Configure /etc/resolv.conf and /etc/nsswitch.conf appropriately for your environment.
o   Remember to check that Internet (or Satellite Server) access works (e.g. yum makecache)

vi /etc/sysconfig/network-scripts/ifcfg-eth1:

-- begin example /etc/sysconfig/network-scripts/ifcfg-eth1--
DEVICE="eth1"
BOOTPROTO="none"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR=192.168.111.1
MASK=255.255.255.0
-- end example /etc/sysconfig/network-scripts/ifcfg-eth0--

Step 4) Disable iptables


o   This isn’t absolutely necessary, it’s just easier.

chkconfig iptables off
service iptables stop

Step 5) Disable selinux


·         Again, not necessary but easier.

vi /etc/selinux/config

-- begin example /etc/selinux/config--
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
-- end example /etc/selinux/config--

Step 6) Install required packages


yum -y install wget syslinux syslinux-tftpboot xinetd tftp-server tftp dhcp httpd openssh-clients

Step 7) Create the anaconda directory structure


mkdir -p /export/anaconda/iso/CentOS
mkdir -p /export/anaconda/media
mkdir -p /export/anaconda/media/CentOS-6.3-x86_64
mkdir -p /export/anaconda/media/CentOS-6.3-i386
mkdir -p /export/anaconda/tftpboot
mkdir -p /export/anaconda/tftpboot/pxelinux.cfg
mkdir -p /export/anaconda/tftpboot/CentOS-6.3-x86_64
mkdir -p /export/anaconda/tftpboot/CentOS-6.3-i386
mkdir -p /export/anaconda/postinstall/
mkdir -p /export/anaconda/cfg/
ln -s /export/anaconda /anaconda

Step 8) Enable anaconda tftp boot via xinetd


vi /etc/xinetd.d/tftp

-- begin example /etc/xinetd.d/tftp--
# default: on
# 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
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /export/anaconda/tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}
-- end example /etc/xinetd.d/tftp--
  

Step 9) Configure the DHCP server


o   Note that the example dhcpd.conf below is not authoritative. 
o   For PXE boot to work, you must enter the correct hardware ethernet (MAC) address for each of the clients you want to kickstart.
o   This could be changed to authoritative for a given subnet, but it's safer to prevent *any* client from obtaining an IP address from this dhcp server.
o   Once a client is installed via kickstart, be sure to remove (or change) the MAC address in dhcpd.conf so it doesn't accidentally get re-installed.
o   Preventing fully automatic installs is generally a good practice.

vi /etc/dhcp/dhcpd.conf

-- begin example /etc/dhcp/dhcpd.conf--
ddns-update-style ad-hoc;

not authoritative;

option domain-name              "defaultdomain";

deny unknown-clients;
allow booting;
allow bootp;

option ip-forwarding    false;
option mask-supplier    false;

subnet 192.168.111.0 netmask 255.255.255.0 {
      option routers                  192.168.111.1;
      option domain-name-servers      192.168.111.1;
      option subnet-mask              255.255.255.0;
}

group {
      next-server                     192.168.111.1;
      filename                        "pxelinux.0";
      max-lease-time                  86400;
      default-lease-time              43200;
      min-lease-time                  43200;

      host anaconda-dhcp-200 {
              hardware ethernet 00:0c:29:1b:f7:84; # red
              fixed-address 192.168.111.200;
      }

      host anaconda-dhcp-201 {
              hardware ethernet 00:0c:29:fa:74:e5; # orange
              fixed-address 192.168.111.201;
      }

}
-- end example /etc/dhcp/dhcpd.conf--

Step 10) Copy the CentOS DVD media


o   Use the ISOs downloaded earlier.  Or, download them again.
o   (somehow) Copy them to /export/anaconda/iso/CentOS, e.g.

scp CentOS-6.3-x86_64-bin-DVD1.iso root@192.168.111.1:/export/anaconda/iso/CentOS
scp CentOS-6.3-i386-bin-DVD1.iso root@192.168.111.1:/export/anaconda/iso/CentOS

Or ...

cd /export/anaconda/iso/CentOS
# 64-bit
wget http://www.gtlib.gatech.edu/pub/centos/6.3/isos/x86_64/CentOS-6.3-x86_64-bin-DVD1.iso
# 32-bit
wget http://www.gtlib.gatech.edu/pub/centos/6.3/isos/i386/CentOS-6.3-i386-bin-DVD1.iso

Once the ISOs exist in /export/anaconda/iso/CentOS on the server ...

# 64-bit
cd /export/anaconda/media/CentOS-6.3-x86_64/
mount -o loop /export/anaconda/iso/CentOS/CentOS-6.3-x86_64-bin-DVD1.iso /mnt
cp -rp /mnt/* .
umount /mnt
# 32-bit
cd /export/anaconda/media/CentOS-6.3-i386/
mount -o loop /export/anaconda/iso/CentOS/CentOS-6.3-i386-bin-DVD1.iso /mnt
cp -rp /mnt/* .
umount /mnt

Step 11) Configure default boot menu


o   Adding the default option to boot to rescue mode can avoid fully automatic (accidental) installs.
o   Manual selection of the correct installation / kickstart configuration profile is my best practice.

vi /export/anaconda/tftpboot/pxelinux.cfg/default

-- begin example /export/anaconda/tftpboot/pxelinux.cfg/default--
timeout 3600
default menu.c32

menu title Automatic Anaconda / Kickstart Boot Menu

label 1
    menu label ^ 1) CentOS-6.3-x86_64 (64-bit)
    kernel CentOS-6.3-x86_64/vmlinuz
    append initrd=CentOS-6.3-x86_64/initrd.img ramdisk_size=15491 ip=dhcp ksdevice=bootif ks=http://192.168.111.1/anaconda/cfg/CentOS-6.3-x86_64-ks.cfg
    IPAPPEND 2

label 2
    menu label ^ 2) CentOS-6.3-i386 (32-bit)
    kernel CentOS-6.3-i386/vmlinuz
    append initrd=CentOS-6.3-i386/initrd.img ramdisk_size=15491 ip=dhcp ksdevice=bootif ks=http://192.168.111.1/anaconda/cfg/CentOS-6.3-i386-ks.cfg
    IPAPPEND 2

label 3
    menu label ^ 3) Rescue CentOS-6.3-x86_64 (64-bit)
    kernel CentOS-6.3-x86_64/vmlinuz
    append initrd=CentOS-6.3-x86_64/initrd.img ramdisk_size=15491 ip=dhcp repo=http://192.168.111.1/anaconda/CentOS-6.3-x86_64 lang=en_US.UTF-8 keymap=us rescue

label 4
    menu label ^ 4) Rescue CentOS-6.3-i386 (32-bit)
    menu default
    kernel CentOS-6.3-i386/vmlinuz
    append initrd=CentOS-6.3-i386/initrd.img ramdisk_size=15491 ip=dhcp repo=http://192.168.111.1/anaconda/CentOS-6.3-i386 lang=en_US.UTF-8 keymap=us rescue
-- end example /export/anaconda/tftpboot/pxelinux.cfg/default--

Step 12) Configure /etc/httpd/conf.d/anaconda.conf


vi /etc/httpd/conf.d/anaconda.conf

-- begin example /etc/httpd/conf.d/anaconda.conf--
# anaconda/kickstart
#

Alias /anaconda/cfg /export/anaconda/cfg
<Directory /export/anaconda/cfg/>
    Options Indexes FollowSymLinks
    Allow from All
</Directory>

Alias /anaconda/postinstall /export/anaconda/postinstall
<Directory /export/anaconda/postinstall/>
    Options Indexes FollowSymLinks
    Allow from All
</Directory>

Alias /anaconda /export/anaconda/media
<Directory /export/anaconda/media/>
    Options Indexes FollowSymLinks
    Allow from All
</Directory>
-- end example /etc/httpd/conf.d/anaconda.conf--

Step 13) Customize kickstart configuration files


o   These are working examples, but you should tailor them to your individual needs.

# 64-bit
vi /export/anaconda/cfg/CentOS-6.3-x86_64-ks.cfg

-- begin example /export/anaconda/cfg/CentOS-6.3-x86_64-ks.cfg--
# Example kickstart configuration file for a RHEL 6.3 x86_64 (64-bit) standard install.
#

install

# Specifies the language
lang en_US.UTF-8

# Specifies the keyboard layout
keyboard us

# Skip Red Hat subscriber key input
key --skip

# Forces the text installer to be used (saves time)
text

# Forces the cmdline installer to be used (debugging)
#cmdline

# Skips the display of any GUI during install (saves time)
skipx

# Used with an HTTP install to specify where the install files are located
url --url http://192.168.111.1/anaconda/CentOS-6.3-x86_64

# Assign a static IP address upon first boot & set the hostname
network --onboot yes --bootproto dhcp --hostname rhel63

# Give the second interface a DHCP address (if you are not using a second interface comment this line out)
#network --device eth1 --bootproto=dhcp

# Set the root password
rootpw r00tp@55w0rd

# Enable the firewall and open port 22 for SSH remote administration
firewall --enabled --port=22:tcp

# Setup security and SELinux levels
#authconfig --enableshadow --enablemd5
authconfig --enableshadow --passalgo=sha512

selinux --disabled

# Set the timezone
timezone --utc Etc/UTC

# Create the bootloader in the MBR with drive sda being the drive to install it on
bootloader --location=mbr --driveorder=sda,sdb --append=audit=1

# Wipe all partitions and build them with the info below
clearpart --all --initlabel

#Disk partitioning information
zerombr

# Create primary partitions
part /boot --fstype ext4 --size=500 --asprimary --ondisk=sda
part swap --size=4096 --asprimary --ondisk=sda
part pv.01 --size=100 --grow --asprimary --ondisk=sda
# use the entire second disk for swap
#part swap --size=100 --grow --ondisk=sdb

# Create LVM logical volumes
volgroup system --pesize=32768 pv.01
logvol  /var  --vgname=system  --size=8196  --name=var_vol
logvol  /tmp  --vgname=system  --size=2048  --name=tmp_vol
logvol  /  --vgname=system  --size=100  --grow  --name=root_vol

# reboot when installation completes
reboot

# Install the Core software packages, aka "minimal", plus a couple extras
%packages
# minimal
@core
@server-policy
#@base
#@network-file-system-client
#@server-policy
%end

%pre
# redirect debugging output to tty3
#exec < /dev/tty3 > /dev/tty3
#chvt 3

%post --log=/var/tmp/install.log
# redirect debugging output to tty3
#exec < /dev/tty3 > /dev/tty3
#chvt 3

echo "Creating CentOS-6.3-x86_64 post installation directory ..."
mkdir -p /opt/postinstall

echo "Downloading CentOS-6.3-x86_64 post installation files ..."
cd /opt/postinstall
wget http://192.168.111.1/kickstart/postinstall/CentOS-6.3-x86_64-postinstall.tgz
tar zxf CentOS-6.3-x86_64-postinstall.tgz
rm CentOS-6.3-x86_64-postinstall.tgz > /dev/null 2>&1

echo "Executing CentOS-6.3-x86_64 post installation script ..."
./CentOS-6.3-x86_64-postinstall >> CentOS-6.3-x86_64-postinstall.out 2>&1
echo "Done."
-- end example /export/anaconda/cfg/CentOS-6.3-x86_64-ks.cfg--

# 32-bit
vi /export/anaconda/cfg/CentOS-6.3-i386-ks.cfg

-- begin example /export/anaconda/cfg/CentOS-6.3-i386-ks.cfg--
# Example kickstart configuration file for a RHEL 6.3 i386 (32-bit) standard install.
#

install

# Specifies the language
lang en_US.UTF-8

# Specifies the keyboard layout
keyboard us

# Skip Red Hat subscriber key input
key --skip

# Forces the text installer to be used (saves time)
text

# Forces the cmdline installer to be used (debugging)
#cmdline

# Skips the display of any GUI during install (saves time)
skipx

# Used with an HTTP install to specify where the install files are located
url --url http://192.168.111.1/anaconda/CentOS-6.3-i386

# Assign a static IP address upon first boot & set the hostname
network --onboot yes --bootproto dhcp --hostname rhel63

# Give the second interface a DHCP address (if you are not using a second interface comment this line out)
#network --device eth1 --bootproto=dhcp

# Set the root password
rootpw r00tp@55w0rd

# Enable the firewall and open port 22 for SSH remote administration
firewall --enabled --port=22:tcp

# Setup security and SELinux levels
#authconfig --enableshadow --enablemd5
authconfig --enableshadow --passalgo=sha512

selinux --disabled

# Set the timezone
timezone --utc Etc/UTC

# Create the bootloader in the MBR with drive sda being the drive to install it on
bootloader --location=mbr --driveorder=sda,sdb --append=audit=1

# Wipe all partitions and build them with the info below
clearpart --all --initlabel

#Disk partitioning information
zerombr

# Create primary partitions
part /boot --fstype ext4 --size=500 --asprimary --ondisk=sda
part swap --size=4096 --asprimary --ondisk=sda
part pv.01 --size=100 --grow --asprimary --ondisk=sda
# use the entire second disk for swap
#part swap --size=100 --grow --ondisk=sdb

# Create LVM logical volumes
volgroup system --pesize=32768 pv.01
logvol  /var  --vgname=system  --size=8196  --name=var_vol
logvol  /tmp  --vgname=system  --size=2048  --name=tmp_vol
logvol  /  --vgname=system  --size=100  --grow  --name=root_vol

# reboot when installation completes
reboot

# Install the Core software packages, aka "minimal", plus a couple extras
%packages
# minimal
@core
@server-policy
#@base
#@network-file-system-client
#@server-policy
%end

%pre
# redirect debugging output to tty3
#exec < /dev/tty3 > /dev/tty3
#chvt 3

%post --log=/var/tmp/install.log
# redirect debugging output to tty3
#exec < /dev/tty3 > /dev/tty3
#chvt 3

echo "Creating CentOS-6.3-i386 post installation directory ..."
mkdir -p /opt/postinstall


echo "Downloading CentOS-6.3-i386 post installation files ..."
cd /opt/postinstall
wget http://192.168.111.1/kickstart/postinstall/CentOS-6.3-i386-postinstall.tgz
tar zxf CentOS-6.3-i386-postinstall.tgz
rm CentOS-6.3-i386-postinstall.tgz > /dev/null 2>&1

echo "Executing CentOS-6.3-i386 post installation script ..."
./CentOS-6.3-i386-postinstall >> CentOS-6.3-i386-postinstall.out 2>&1
echo "Done."
-- end example /export/anaconda/cfg/CentOS-6.3-i386-ks.cfg--

Step 15) Finish configuring the PXE boot environment


cp /usr/share/syslinux/pxelinux.0 /export/anaconda/tftpboot/
cp /usr/share/syslinux/menu.c32 /export/anaconda/tftpboot/
# 64-bit
cd /export/anaconda/tftpboot/CentOS-6.3-x86_64/
cp /export/anaconda/media/CentOS-6.3-x86_64/images/pxeboot/* .
# 32-bit
cd /export/anaconda/tftpboot/CentOS-6.3-i386/
cp /export/anaconda/media/CentOS-6.3-i386/images/pxeboot/* .

Step 16) Enable services


chkconfig dhcpd on
chkconfig httpd on
chkconfig xinetd on
service dhcpd restart
service httpd restart
service xinetd restart
reboot

Step 17) PXE Boot the install clients


o   Different hardware manufacturers have different methods for invoking PXE network booting.
o   Make sure to verify the client’s MAC address is in /etc/dhcp/dhcpd.conf and that you’ve restarted dhcpd (e.g. service dhcpd restart).
o   If everything’s correct then you should see screens similar to the following screen shots.

 


 

 

 

 
  

 

20 comments:

  1. Great tutorial. I have one question though.

    What in your postintall file and where do you get it? The directories you created in this tutorial do not include the kickstart directory referenced in the kickstart files.

    ReplyDelete
  2. Thanks and IF I correctly understand the question ...

    My 'postinstall' file is actually many files contained within a single tar.gz file (CentOS-6.3-x86_64-postinstall.tgz). It's made available to the install client via the http server (i.e. Step 13).

    E.G.

    This post installation directory gets created on the newly installed client (via the %post directive in the kickstart config).

    echo "Creating CentOS-6.3-i386 post installation directory ..."
    mkdir -p /opt/postinstall


    Then, I use wget to get a copy of the tar file from the http server ...

    echo "Downloading CentOS-6.3-i386 post installation files ..."
    cd /opt/postinstall
    wget http://192.168.111.1/kickstart/postinstall/CentOS-6.3-i386-postinstall.tgz

    Finally, untar it ..

    tar zxf CentOS-6.3-i386-postinstall.tgz
    rm CentOS-6.3-i386-postinstall.tgz > /dev/null 2>&1

    Inside the tar is the executable (now available on the client) ...

    echo "Executing CentOS-6.3-i386 post installation script ..."
    ./CentOS-6.3-i386-postinstall >> CentOS-6.3-i386-postinstall.out 2>&1
    echo "Done."

    Hopefully that helps clarify what's going on with regard to the postinstall file.

    ReplyDelete
  3. very nice tutorial!
    just have a question - in your kickstart file:
    # Used with an HTTP install to specify where the install files are located
    url --url http://192.168.1.20/anaconda/CentOS-6.3-x86_64

    Don't you have the install files on 192.168.111.1? why a different host (192.168.1.20)?

    ReplyDelete
  4. Thanks. That's a copy/paste error on my part ... initially, I had everything running on a single subnet (192.168.1.0/24) and later decided that I didn't want (another) dhcp server running there. So, I set up a second interface on another subnet (192.168.111.0/24) to more freely test different dhcp options, etc (without interfering with other clients on 192.168.1.0/24).

    ReplyDelete
  5. Hello Joseph,

    I have my server configured and pxe booting on the client. I select option "1" 64 bit and start booting. Everything goes fine until right after "Retrieving" then I get a "No disks found" error that says:

    No usable disks have been found (Try Again, or Exit Installer).

    Sorry this is my first attempt at PXE booting. I assumed that I need no disks in my client machine (no HD, no USB, no CD/DVD etc.) so I assume I didn't export space somewhere? My "/" directory on the server has probably 500gig space free. What am I doing wrong? Can you please post a step by step?


    Thanks,

    Art

    ReplyDelete
  6. Joseph, sorry if this is a dumb question but is this setup only for installs? If so then obviously I need drives for each client etc. and in that case what I am really looking for is to setup a pxe server where clients can have diskless workstations. Any advice appreciated. I like centos 6.3!

    Thanks for your how to here!

    BBBB

    ReplyDelete
    Replies
    1. Yes, you would need a drive in each client. This HOWTO is for doing (kickstart) installs (to a machine that has a dedicated hard disk).

      Though, it is possible to use PXE boot for diskless clients (E.G. DRBL). The last time I've done that was many years ago (and not with CentOS 6.x). It shouldn't be too difficult, though. You could use a Live-CD boot image (initrd) or NFS for the root disk, etc. Maybe this will help get you going ... https://en.wikipedia.org/wiki/Diskless_Remote_Boot_in_Linux

      Delete
  7. Could you tell me how it would work if you were not allowed to use DHCP for installation?
    I could give it a static address but am not sure how it would work.
    Thanks,
    Rick

    ReplyDelete
  8. You'd have to assign a static IP (mask, default gw, etc) to the client(s) via the boot menu (Step 11) and in the Kickstart cfg (Step 13). But, you'd loose the primary benefit of dhcp (its ability to install multiple clients simultaneously (because different IPs are given based on MAC address)). That could be circumvented (somewhat) with multiple boot menu entries, though (i.e. have a different boot entry for each static IP and a separate kickstart cfg for each, too).

    ReplyDelete
  9. Hallo.

    Erst mal ein lob an Dich, nach langen suchen mit goole habe ich auch Deine todo gefunden.

    Nach dem ich ein paar schreibfehler (von mir ) besitigt hatte und noch ein paar denkfehler, funktioniert die Anleitung.

    Vielleicht als Tip für Dich um die Anleitung zu verbessern.
    Las mal einen Linux neuling rüber schauen ob er mit der Anleitung klar kommt.
    So kannst Du noch die eine oder andre Verbesserung einfügen.

    Was ich noch recht gut fand war die Versions Nr. von CentOS, viele schreiben eine todo ohne Angaben welche Version Nr. von der Distribution.

    Gruß.

    B.

    ReplyDelete
  10. Hi ,

    Have a small (may be dumb)doubt , if KS file is sent via HTTP to the client , how can the client understand the HTTP protocol with out any OS on it .

    ReplyDelete
    Replies
    1. When the Linux kernel first boots (regardless) it loads the initrd (initial ram disk). The initrd contains a scaled down operating system capable of basic functions, such as TCP/IP (dns, http, etc.). Once the initrd loads successfully, the kernel attempts to boot the full OS from disk (e.g. load additional drivers, remount root, etc).

      Delete
  11. Thanks for this great tutorial, i would have a question.
    If i wanted all the clients to have to GUI, how would i install the desktop?

    ReplyDelete
    Replies
    1. Make sure the ks.cfg installs the correct packages under the %packages section. You'd probably want to add @Desktop Platform and/or @Desktop Platform Development. Using the groups convention is easiest (e.g. add them after @Base).

      Here's a list of groups that should be available on the media ....

      Installed Groups:
      Base
      Development tools
      Milkymist
      Networking Tools
      Available Groups:
      Additional Development
      Backup Client
      Backup Server
      CIFS file server
      Compatibility libraries
      Console internet tools
      Debugging Tools
      Desktop
      Desktop Debugging and Performance Tools
      Desktop Platform
      Desktop Platform Development
      Dial-up Networking Support
      Directory Client
      Directory Server
      E-mail server
      Eclipse
      Educational Software
      Electronic Lab
      Emacs
      FCoE Storage Client
      FTP server
      Fedora Packager
      Fonts
      General Purpose Desktop
      Graphical Administration Tools
      Graphics Creation Tools
      Hardware monitoring utilities
      Haskell
      Infiniband Support
      Input Methods
      Internet Applications
      Internet Browser
      Java Platform
      KDE Desktop
      Large Systems Performance
      Legacy UNIX compatibility
      Legacy X Window System compatibility
      Mainframe Access
      Messaging Client Support
      Messaging Server Support
      MySQL Database client
      MySQL Database server
      NFS file server
      Network Infrastructure Server
      Network Storage Server
      Network file system client
      Office Suite and Productivity
      PHP Support
      Performance Tools
      Perl Support
      PostgreSQL Database client
      PostgreSQL Database server
      Print Server
      Printing client
      Remote Desktop Clients
      SNMP Support
      Scientific support
      Security Tools
      Server Platform
      Server Platform Development
      Smart card support
      Storage Availability Tools
      System Management
      System administration tools
      TeX support
      Technical Writing
      TurboGears application framework
      Virtualization
      Virtualization Client
      Virtualization Platform
      Virtualization Tools
      Web Server
      Web Servlet Engine
      Web-Based Enterprise Management
      X Window System
      Xfce
      iSCSI Storage Client

      Delete
    2. Thank you for a great tutorial. I had been looking for awhile trying to find something written very well and to the point. I am not getting to far unfortunately for me. I am trying centos 6.4 and tried to change all the 6.3 -> 6.4 references but obviously I have messed something up. Once the client boots into PXE I get about 3-4 dots then get "File Not Found". I found a couple files that I hadn't edited to 6.4 from 6.3 but I am not even as far as getting the menu to load. I tried to go to the http page to make sure it can get to the kickstart config files but it's not even getting that far. I am trying to look into any logs that gives me any clue to what's wrong. Can you tell me where I should start to walk through what's it's missing? I would appreciate anyone's help.

      Delete
    3. There are virtually no differences between 6.3 & 6.4 other than the semantics.

      It sounds like something's wrong with your httpd config, dhcpd config, or boot menu.

      A few things that I'd check are the URL you're pointing to in the boot menu. Also, tail -f the httpd access & error logs while booting the client. If all's well then you should see the client try to download a bunch of files from the web server. If not, then again, verify the URL in the boot menu.

      If that fails, make sure the dhcpd.conf has the correct mac address, etc.

      Double check everything.

      Delete
  12. hi Joseph,
    Thanks for this tut! this helped me get going.
    As for the pxeboot, once the installation completes, it reboots and goes back to the anaconda / kickstart menu. So If I did leave the station for awhile, this will forever loop itself by reinstalling over and over. I'm curious to learn about your method to break out of the installation once initial installation finishes.

    ReplyDelete
    Replies
    1. nvm. I found the solution here. http://wiki.centos.org/HowTos/PXE/PXE_Setup/Menus

      Delete
    2. Yes, that'll do. In step 9 I wrote this, too...

      o Once a client is installed via kickstart, be sure to remove (or change) the MAC address in dhcpd.conf so it doesn't accidentally get re-installed.

      Delete