Normally to do a kickstart install, you need to first boot off an install disk (usually the NetBoot one) and then enter some extra params on the boot line. But what if you want a more automated process or don’t want to have to deal with disks? PXE boot to the rescue!
PXE boot is a process of having a computer fire up its network card, get an IP from DHCP, then pull down a bootable file.
TFTP
First we need to get a TFTP server set up, preferably on the same server as our installation source.
yum install tftp-server xinetd
Then we need to enable the TFTP server, as it comes disabled by default.
sed -i '/disable/s/yes/no/' /etc/xinetd.d/tftp
Allow TFTP through the firewall
firewall-cmd --add-service=tftp
firewall-cmd --permanent --add-service=tftp
tftp-server
is a sub-service of the good old xinetd, so enable and start that.
systemctl start xinetd.service
systemctl enable xinetd.service
PXE Files
Next we need to get some PXE bootable image, preferably one with a menu system. Thankfully there already exists one! syslinux
is a tool for installing a bootloader onto a FAT filesystem disk, but it comes with all the bits we need to boot from the network.
yum install syslinux
All the goodies we want are in /usr/share/syslinux/
. We just need the pxelinux.0
boot image, and a menu displayer vesamenu.c32
. Copy these to our TFTP server.
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/
Now we need to config the PXE menu. pxelinux.0
will look in pxelinux.cfg/
for a file called default
. Let’s create that file.
mkdir /var/lib/tftpboot/pxelinux.cfg vi /var/lib/tftpboot/pxelinux.cfg/default
Here is what we are going to put in it
# Use the ncurses menu default menu.c32 # Show the prompt prompt 0 # Don't timeout timeout 0 menu title PXE Install CentOS # Install CentOS 7 label centos7 menu label Install CentOS 7 # Use this as the default menu default kernel CentOS-7.2.1511/vmlinuz ipappend 2 append initrd=CentOS-7.2.1511/initrd.img inst.ks=http://10.0.2.10/7.ks menu separator label rescue7 menu label Rescure CentOS 7 kernel CentOS-7.2.1511/vmlinuz ipappend 2 append initrd=CentOS-7.2.1511/initrd.img inst.repo=http://10.0.2.10/CentOS-7.2.1511/ inst.lang=en_US.UTF-8 inst.keymap=us inst.rescue # Boot the local disk label local menu label Boot from local drive localboot 0xffff
Now we’ll copy in the kernel and init ramdisk from a install disk.
cp /media/CentOS-7.2.1511/images/pxeboot/vmlinuz /var/lib/tftpboot/CentOS-7.2.1511/ cp /media/CentOS-7.2.1511/images/pxeboot/initrd.img /var/lib/tftpboot/CentOS-7.2.1511/
DHCP Server
We need is a DHCP server to hand out an IP and pass along some pxeboot options. Your network might already have one, in which case you can simply configure it to point to your PXE server.
Let’s install and configure a DHCP server on our install server.
yum install dhcp
Put something like the following into /etc/dhcp/dhcpd.conf
subnet 10.0.2.0 netmask 255.255.255.0 { option routers 10.0.2.1; range 10.0.2.100 10.0.2.200; next-server 10.0.2.10; filename "pxelinux.0"; }
Enable and start the DHCP server
systemctl enable dhcpd systemctl start dhcpd
Showtime!
Now boot another server on the same network, and poke the appropriate BIOS button to get it to PXE boot. A sweet menu will show up and let you install CentOS with a single click!