Configure kickstart server | PXE boot server | RHEL/CentOS 8

In this article we will setup a PXE boot server using RHEL/CentOS 8 ISO Image. To perform network based installation we will also configure kickstart server. Below are the brief list of steps involved to setup PXE boot server

  • Setup installation repo using Red Hat 8.1 ISO
  • Setup PXE boot server environment
  • Configure kickstart server to automate the installation
  • Configure DHCP Server to assign IP Address
  • Configure TFTP server to transfer PXE files
  • Configure NFS server to share installation repo and kickstart file

 

Lab Environment

I have created two Virtual Machines using Oracle VirtualBox installed on my Linux server. We will perform VirtualBox PXE boot installation where first VM will be used to setup pxe boot kickstart server while we perform network based installation on the second VM.

Below are the server specifications:

 VM1VM2
Hostnamecentos-8centos8-4
IP Address10.10.10.12NIC1: eth0 - DHCP
NIC2: eth1 - DHCP
PurposePXE Boot ServerVirtualBox PXE Boot Client

 

Step 1: Setup Installation Repo

We will setup PXE boot server to install RHEL 8 using network based installation. Create a new directory where we will place all the RHEL image files

[root@centos-8 pxelinux]# mkdir /images

I have virtually mounted RHEL 8 ISO to my virtual machine, to access this ISO I will mount the image to /mnt

[root@centos-8 ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.

Copy all the files from the RHEL 8 ISO Image to /images directory

[root@centos-8 ~]# cp -apr /mnt/* /images/

Note that here copying of hidden file will be ignored and .treeinfo file which is required for a valid installation source so manually copy these hidden files.

[root@centos-8 ~]# cp -apr /mnt/.discinfo /mnt/.treeinfo /images/

Verify the repository content

[root@centos-8 ~]# ls -al /images/
total 92
drwxr-xr-x   7 root root  4096 Apr 19 20:33 .
dr-xr-xr-x. 33 root root  4096 Apr 19 19:57 ..
dr-xr-xr-x   4 root root  4096 Oct 15  2019 AppStream
dr-xr-xr-x   4 root root  4096 Oct 15  2019 BaseOS
-r--r--r--   1 root root    60 Apr 19 20:33 .discinfo
dr-xr-xr-x   3 root root  4096 Oct 15  2019 EFI
-r--r--r--   1 root root  8266 Oct 15  2019 EULA
-r--r--r--   1 root root  1455 Oct 15  2019 extra_files.json
-r--r--r--   1 root root 18092 Oct 15  2019 GPL
dr-xr-xr-x   3 root root  4096 Oct 15  2019 images
dr-xr-xr-x   2 root root  4096 Oct 15  2019 isolinux
-r--r--r--   1 root root   103 Oct 15  2019 media.repo
-r--r--r--   1 root root  1669 Oct 15  2019 RPM-GPG-KEY-redhat-beta
-r--r--r--   1 root root  5134 Oct 15  2019 RPM-GPG-KEY-redhat-release
-r--r--r--   1 root root  1796 Oct 15  2019 TRANS.TBL
-r--r--r--   1 root root  1566 Apr 19 20:33 .treeinfo

 

Step 2: Install and Configure TFTP Server

Next we will configure TFTP server to transfer PXE image files to the client for network based installation.

Install tftp-server and xinetd using dnf

NOTE:

On RHEL system you must have an active subscription to RHN or you can configure a local offline repository using which "yum" package manager can install the provided rpm and it's dependencies.
[root@centos-8 ~]# dnf install tftp-server xinetd -y

Earlier with RHEL/CentOS 7, tftp service was managed by xinetd. Although even with RHEL/CentOS 7 we had an option to disable xinetd and fork TFTP process using systemd.

NOTE:

You can fork TFTP process either by xinetd or by systemd but not both. For more details check: TFTP service is getting inactive automatically in RHEL7

In this example we will fork TFTP process using systemd.
The tftp-server rpm installation will create /usr/lib/systemd/system/tftp.service unit file

Below is the content of this service unit file

[root@centos-8 pxelinux.cfg]# cat /usr/lib/systemd/system/tftp.service
[Unit]
Description=Tftp Server
Requires=tftp.socket
Documentation=man:in.tftpd

[Service]
ExecStart=/usr/sbin/in.tftpd -s /var/lib/tftpboot
StandardInput=socket

[Install]
Also=tftp.socket
  • From ExecStart we can see that the default location for TFTP server is /var/lib/tftpboot.
  • So we must place all the PXE boot server files under this location
  • You can also use any other directory but then you will have to modify this service unit file to use the custom path for tftp service

Next start the tftp service and enable it to start automatically post reboot

[root@centos-8 pxelinux.cfg]# systemctl enable tftp.service --now
Created symlink /etc/systemd/system/sockets.target.wants/tftp.socket → /usr/lib/systemd/system/tftp.socket.
  • TFTP service uses to tftp.socket to serve TFTP requests
  • So it is possible that if there are no incoming TFTP requests then the tftp service will become inactive on it's own
  • But as soon as a TFTP request goes to tftp.socket, the socket will start tftp.service and serve the request

Check the status of tftp.socket

[root@centos-8 ~]# systemctl status tftp.socket
● tftp.socket - Tftp Server Activation Socket
   Loaded: loaded (/usr/lib/systemd/system/tftp.socket; enabled; vendor preset: disabled)
   Active: active (listening) since Sun 2020-04-19 19:32:40 IST; 7h ago
   Listen: [::]:69 (Datagram)
   CGroup: /system.slice/tftp.socket

Apr 19 19:32:40 centos-8.example.com systemd[1]: Listening on Tftp Server Activation Socket.

 

Step 3: Setup PXE boot server

  • Next to perform PXE network based installation, we must configure PXE boot server.
  • We will need Linux boot images to boot the RHEL 8 OS with minimal configuration
  • This is performed using initrd and vmlinuz. I hope you are familiar with the Linux boot process which covers this part
  • Before the actual kernel loads, initrd and vmlinuz will load the necessary drivers from the memory to boot up the server

We will create another directory "pxelinux" under /var/lib/tftpboot to store PXE images

[root@centos-8 ~]# mkdir -p /var/lib/tftpboot/pxelinux

 

Step 3.1: Extract syslinux-tftpboot

With RHEL/CentOS 8, the pxelinux file is part of syslinux-tftpboot rpm so we will copy this file from our RHEL 8 ISO to a temporary location

[root@centos-8 ~]# cp /mnt/BaseOS/Packages/syslinux-tftpboot-6.04-4.el8.noarch.rpm /tmp/

Next extract the syslinux-tftpboot rpm. We will not use all the contents of this rpm and only required files

[root@centos-8 ~]# cd /tmp/
[root@centos-8 tmp]# rpm2cpio syslinux-tftpboot-6.04-4.el8.noarch.rpm | cpio -idm

The above command will extract syslinux-tftpboot under /tmp.

Next we will copy pxelinux.0 and ldlinux.c32 to /var/lib/tftpboot/pxelinux/ required to setup PXE boot server

[root@centos-8 tmp]# cp /tmp/tftpboot/ldlinux.c32 /var/lib/tftpboot/pxelinux/
[root@centos-8 tmp]# cp /tmp/tftpboot/pxelinux.0 /var/lib/tftpboot/pxelinux/

 

Step 3.2: Copy initrd and vmlinuz

We also need other PXE boot images which will be under isolinux folder of the RHEL/CentOS 8 Image.
Since we had copied the ISO content to /images, we will copy required PXE boot images from /images/isolinux to /var/lib/tftpboot/pxelinux/

[root@centos-8 tmp]# cp /images/isolinux/initrd.img /var/lib/tftpboot/pxelinux/
[root@centos-8 tmp]# cp /images/isolinux/vmlinuz /var/lib/tftpboot/pxelinux/

 

List all the PXE boot image files:

[root@centos-8 tmp]# ls -l /var/lib/tftpboot/pxelinux/
total 58880
-r--r--r-- 1 root root 62248424 Apr 19 19:14 initrd.img
-rw-r--r-- 1 root root   116096 Apr 19 19:47 ldlinux.c32
-rw-r--r-- 1 root root    42821 Apr 19 19:01 pxelinux.0
-r-xr-xr-x 1 root root  8106848 Apr 19 19:14 vmlinuz

Next navigate to pxelinux folder

[root@centos-8 tmp]# cd /var/lib/tftpboot/pxelinux

 

Step 3.3: Create Boot Menu

  • We will create PXE boot server which can be used to install multiple images so we will create a boot menu.
  • This boot menu will be displayed to initiate the installation for user input.
  • Create a new file boot.msg under /var/lib/tftpboot/pxelinux
  • You can use any name for this file as per your requirement.

Since I intent to configure Kickstart server only for single Image, I have only created two menu entries.

[root@centos-8 pxelinux]# cat boot.msg
Welcome to the installation of "My Linux Server" !
Red Hat Enterprise linux 8.1 (x86_64)
Version: 1.0
Architecture: x86_64

To start the installation enter :
    '1', '2' and press .

Available boot options:

  1 - Install Red Hat Enterprise Linux 8.1
  2 - Boot from Harddisk (this is default)

Have a lot of fun...

 

Step 3.4: Create PXE configuration file

  • Once the client retrieves and executes pxelinux.0, it is hard-coded to look for a file from the pxelinux.cfg/ sub directory relative to where pxelinux.0 was found
  • In large deployments we create individual PXE configuration file per node.
  • The naming syntax of these PXE configuration file is very important
  • First, it will look for a file named after the MAC address, in the form 01-xx-xx-xx-xx-xx-xx
  • For example, in this example my client't NIC MAC Address is 08:00:27:83:1e:2a so my PXE configuration file will be 01-08-00-27-83-1e-2a
  • Next, it will look for a file named by the IP address as provided by the DHCP server.
  • The IP address is looked up in hexadecimal format.
  • You can use printf to get the hexadecimal format of an IP Address, for example to get the hexadecimal value of 10.10.10.12
# printf "%02x%02x%02x%02xn" 10 10 10 12
0a0a0a0cn
  • Since I am not assigning any static IP Address, I cannot use the hexadecimal format file. Although I can use MAC address based file.
  • If both MAC Address and hexadecimal format file are not found under pxelinux.cfg then the installer will look for "default" file
  • In this example I will use default file but I have also verified the PXE network installation using MAC based file 01-08-00-27-83-1e-2a

We will create a new directory pxelinux.cfg

[root@centos-8 ~]# mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg

Create the PXE configuration file /var/lib/tftpboot/pxelinux/pxelinux.cfg/default

[root@centos-8 ~]# cat /var/lib/tftpboot/pxelinux/pxelinux.cfg/default
timeout 600
display boot.msg
default 1
prompt  1

label 1
  menu label ^Install Red Hat Enterprise Linux 8
  kernel vmlinuz
  append initrd=initrd.img showopts ks=nfs:10.10.10.12://ks/kickstart.conf ip=dhcp net.ifnames=0 biosdevname=0

label 2
  menu label Boot from ^local drive
  localboot 0x80

menu end
  • I have created two labels based on our Boot Menu
    • label 1: This will be used to install Red Hat Linux 8
    • label 2: To continue booting from hard disk
  • I have provided label 2 as the default option.
  • So if a user input is not provided until the timeout value i.e. 600, the installer will choose label 2 and continue to boot from hard disk
  • I will use NFS server to configure kickstart server to perform network based installation.
  • My kickstart file will be available under /ks directory which we will create in next steps
  • ip=dhcp is optional, as the client will anyhow get the IP address from the DHCP server.
  • net.ifnames and biosdevname are also optional, as I do not wish to use consistent network device naming scheme for my client node.

Make sure the PXE configuration files have read permission for "other" users

[root@centos-8 ~]# ls -l /var/lib/tftpboot/pxelinux/
total 68880
-rw-r--r-- 1 root root      325 Apr 19 19:10 boot.msg
-r--r--r-- 1 root root 62248424 Apr 19 19:14 initrd.img
-rw-r--r-- 1 root root   116096 Apr 19 19:47 ldlinux.c32
-rw-r--r-- 1 root root    42821 Apr 19 19:01 pxelinux.0
drwxr-xr-x 2 root root     4096 Apr 20 01:47 pxelinux.cfg
-r-xr-xr-x 1 root root  8106848 Apr 19 19:14 vmlinuz

[root@centos-8 ~]# ls -l /var/lib/tftpboot/pxelinux/pxelinux.cfg/default
-rw-r--r-- 1 root root 307 Apr 20 01:47 /var/lib/tftpboot/pxelinux/pxelinux.cfg/default

 

Step 4: Install and Configure DHCP server

You can also use DNSMASQ server to assign IP address but we will use DHCP server in this example to perform network based installation in Linux.

[root@centos-8 pxelinux.cfg]# dnf install dhcp-server -y

Below is a very basic example of DHCP server configuration

  • The PXE file name is defined with filename. Since the tftp is configured to use /var/lib/tftp as default location we have provided pxelinux/pxelinux.0
  • next-server defines the IP address of the TFTP server
  • range is used to assign IP address for DHCP requests
[root@centos-8 pxelinux.cfg]# cat /etc/dhcp/dhcpd.conf

allow bootp;
allow booting;
max-lease-time 1200;
default-lease-time 900;
log-facility local7;

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

   subnet 10.10.10.0 netmask 255.255.255.0 {

       option  routers   10.10.10.1;
       option  domain-name-servers  127.0.0.1;
       range 10.10.10.100 10.10.10.140;
       next-server 10.10.10.12;
       filename "pxelinux/pxelinux.0";
   }

Enable and start the dhcpd service

[root@centos-8 pxelinux.cfg]# systemctl enable dhcpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.

Make sure the dhcpd service status is active and running

[root@centos-8 ~]# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2020-04-19 19:45:45 IST; 6h ago
     Docs: man:dhcpd(8)
           man:dhcpd.conf(5)
 Main PID: 30897 (dhcpd)
   Status: "Dispatching packets..."
    Tasks: 1 (limit: 26213)
   Memory: 5.1M
   CGroup: /system.slice/dhcpd.service
           └─30897 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid

 

Step 5: Configure kickstart server

  • To configure kickstart server we would need a kickstart file to automate the installation.
  • With every Red Hat and CentOS installation, a default kickstart file is created under home folder of root user i.e. /root/anaconda-ks.cfg
  • This anaconda kickstart file contains the values used to install your server
  • We can use this anaconda file to create our kickstart configuration file and configure kickstart server
  • You can also use online kickstart generator tool provided by Red Hat. Although I am not very fond of this tool has very limited options while a kickstart supports many more features
  • In this example I will use the default anaconda.cfg template to configure kickstart server

Create /ks directory where we will store our kickstart file

[root@centos-8 pxelinux.cfg]# mkdir /ks

Copy the content of anaconda-ks.cfg and rename to /ks/kickstart.conf

[root@centos-8 pxelinux.cfg]# cp /root/anaconda-ks.cfg /ks/kickstart.conf

Make sure the kickstart file is readable by other users while ks directory has read and execute permission for others.

[root@centos-8 ~]# ls -l /ks/kickstart.conf
-rw-r--r-- 1 root root 1688 Apr 19 20:55 /ks/kickstart.conf

 

Step 5.1: Sample kickstart configuration file

Below is my sample kickstart configuration file. I prefer to perform text based network installation (Since the day I started using Linux, I sort of have got addicted to CLI rather than graphics)

I won't be able to explain the entire content of kickstart file in this article as it would be too long, I will plan to write another article with detailed description of all the values from kickstart file.

[root@centos-8 pxelinux]# cat /ks/kickstart.conf

#version=RHEL8
ignoredisk --only-use=sda

# Partition clearing information
clearpart --all

# Use text install
text

# Create APPStream Repo
repo --name="AppStream" --baseurl=file:///run/install/repo/AppStream

# Use NFS Repo
nfs --server=10.10.10.12 --dir=/images/

# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'

# System language
lang en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=eth0 --ipv6=ignore --activate
network  --bootproto=dhcp --device=eth1 --onboot=off --ipv6=ignore --activate
network  --hostname=centos8-4.example.com

# Root password
rootpw --iscrypted $6$w7El/FYx9mbTG6x9$Te.Yg6dq0TsQwGpdSjeDGSw4J9ZBAkLXzT9ODMV7I7lHvX3n5.9PCS4jIkS2GbVLZOpVRLvrua3wwbwA.cfWX.

# Run the Setup Agent on first boot
firstboot --enable

# Do not configure the X Window System
skipx

# System services
services --enabled="chronyd"

# System timezone
timezone Asia/Kolkata --isUtc

# Reboot after installation completes
reboot

# Disk partitioning information
autopart --type=plain --fstype=ext4

# Packages to be installed
%packages
@^virtualization-host-environment
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'
%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

 

Step 6: Install and Configure NFS

I have already written a separate article with detailed description and steps to install and configure both NFSv4 and NFSv3 server. Hence I will be very brief here:

Install nfs-utils rpm required to configure NFS

[root@centos-8 ~]# dnf -y install nfs-utils

Below are the directories I plan to share for my Linux kickstart server.
Here /ks contains the kickstart configuration file
and /images contains the RHEL 8 ISO content for installation

[root@centos-8 ~]# cat /etc/exports
/ks     *(ro,sync,no_root_squash)
/images *(ro,sync,no_root_squash)

Re-export the shares

[root@centos-8 ~]# exportfs -r

Print the available shares

[root@centos-8 ~]# exportfs -v
/ks             (sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,no_root_squash,no_all_squash)
/images         (sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,no_root_squash,no_all_squash)

Enable and start the nfs-server.service. Here since we are using NFSV4, we have not started or installed rpcbind.
You can read more at: Step-by-Step Guide to install and configure NFSv4 and NFSv3 server & client in RHEL/CentOS 7/8

[root@centos-8 ~]# systemctl enable nfs-server --now

Make sure nfs-server service up and running

[root@centos-8 ~]# systemctl status nfs-server
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
  Drop-In: /run/systemd/generator/nfs-server.service.d
           └─order-with-mounts.conf
   Active: active (exited) since Sun 2020-04-19 19:49:17 IST; 6h ago
  Process: 31119 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 31117 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 31116 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 31144 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 31132 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
  Process: 31131 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 31144 (code=exited, status=0/SUCCESS)

Apr 19 19:49:17 centos-8.example.com systemd[1]: Starting NFS server and services...
Apr 19 19:49:17 centos-8.example.com systemd[1]: Started NFS server and services.

We are all done with the steps to setup PXE boot server to perform network based installation in Linux. Using kickstart as the mode of installation we also have configure kickstart server on the same node.

Next we will perform VirtualBox PXE Boot Installation on the Client Virtual Machine

 

Step 7: Perform VirtualBox PXE Boot Installation

I will share the steps to perform VirtualBox PXE Boot installation as I am not using physical hardware here. "Power ON" the client virtual machine and press "F12" to select boot device

Configure kickstart server | PXE boot server | RHEL/CentOS 8

 

You will get a list of Boot device options to boot from, I will press 'l' to boot from LAN

Configure kickstart server | PXE boot server | RHEL/CentOS 8

 

In the next screen, DHCP request is sent using the first NIC card. The client will send a broadcast request to all the servers around in the network looking for an IP Address.
As soon as the broadcast request reaches our PXE boot server (also configured as DHCP server), it will release an IP address
You can see below set of messages on your PXE boot server. I am using journalctl to view the system messages

Apr 20 01:49:14 centos-8.example.com dhcpd[30897]: DHCPOFFER on 10.10.10.100 to 08:00:27:83:1e:2a via eth1
Apr 20 01:49:15 centos-8.example.com dhcpd[30897]: DHCPDISCOVER from 08:00:27:83:1e:2a via eth1
Apr 20 01:49:15 centos-8.example.com dhcpd[30897]: DHCPOFFER on 10.10.10.100 to 08:00:27:83:1e:2a via eth1
Apr 20 01:49:17 centos-8.example.com dhcpd[30897]: Wrote 2 leases to leases file.
Apr 20 01:49:17 centos-8.example.com dhcpd[30897]: DHCPREQUEST for 10.10.10.100 (10.10.10.12) from 08:00:27:83:1e:2a via eth1
Apr 20 01:49:17 centos-8.example.com dhcpd[30897]: DHCPACK on 10.10.10.100 to 08:00:27:83:1e:2a via eth1

Configure kickstart server | PXE boot server | RHEL/CentOS 8

 

Once the client gets the IP Address, next it will search of PXE boot files using TFTP.
At this stage you should see below logs in /var/log/messages on the PXE boot Server (also used as TFTP boot server)

Apr 20 01:49:17 centos-8.example.com systemd[1]: Started Tftp Server.
Apr 20 01:49:17 centos-8.example.com in.tftpd[19710]: Client ::ffff:10.10.10.100 finished pxelinux/pxelinux.0
Apr 20 01:49:17 centos-8.example.com in.tftpd[19711]: Client ::ffff:10.10.10.100 finished pxelinux/ldlinux.c32
Apr 20 01:49:17 centos-8.example.com in.tftpd[19722]: Client ::ffff:10.10.10.100 finished pxelinux/pxelinux.cfg/default
Apr 20 01:49:17 centos-8.example.com in.tftpd[19723]: Client ::ffff:10.10.10.100 finished pxelinux/boot.msg
Apr 20 01:49:30 centos-8.example.com in.tftpd[19732]: Client ::ffff:10.10.10.100 finished pxelinux/vmlinuz
Apr 20 01:49:36 centos-8.example.com in.tftpd[19734]: Client ::ffff:10.10.10.100 finished pxelinux/initrd.img

Configure kickstart server | PXE boot server | RHEL/CentOS 8

 

if everything is correct, you should get the BOOT MENU which you had created using boot.msg file.

As soon as you press "1", the network based installation would start using kickstart configuration file. Here is a screenshot of my client virtual machine after successful installation.

Configure kickstart server | PXE boot server | RHEL/CentOS 8

 

Lastly I hope the steps from the article to configure kickstart server and PXE boot server on Linux was helpful. So, let me know your suggestions and feedback using the comment section.

 
References:
Perform Network Based Installation using PXE Boot Server

 

Related Searches: network based installation of linux, configure kickstart server linux step step, centos netboot, kickstart installation linux, kickstart linux tutorial, fedora anaconda kickstart, red hat network install, virtualbox PXE boot installation

Leave a Comment

Please use shortcodes <pre class=comments>your code</pre> for syntax highlighting when adding code.