In this tutorial I will be sharing step by step instructions to configure IPv6 UEFI PXE Boot with Kickstart using RHEL/CentOS 8 Linux server.
Sequential order to configure IPv6 UEFI PXE Boot with Kickstart
- Setup Installation Repo
- Install and Configure TFTP
- Install and Configure DHCPv6
- Install and Configure HTTP
- Prepare kickstart file
- Perform UEFI PXE Boot
Lab Environment
I have two physical hardware running on HPE Proliant blades with UEFI BIOS. Now the source server can be any Linux server actually, although the steps to configure DHCPv6, TFTP and other services would vary if you choose to use any other Linux variant such as Ubuntu, Debian. In my case, the source server is running on Legacy BIOS while the target server where I intend to do the automated installation is with UEFI BIOS.
Here are my server details:
Hostname:Â server.example.com
Release:Â CentOS Linux release 8.2.2004 (Core)
IP Address: 10.43.138.7/27, 2001:1:1:1442::407/122
Below is the output of my primary interface. I have a dual stack server so I have configured both IPv4 and IPv6 but I will be using IPv6 for the network boot.
[root@server ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:17:a4:77:00:26 brd ff:ff:ff:ff:ff:ff inet 10.43.138.7/27 brd 10.43.138.31 scope global noprefixroute eno49 valid_lft forever preferred_lft forever inet6 2001:1:1:1442::407/122 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::d478:91c3:ecd7:4ff9/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@server ~]# ip -6 route ::1 dev lo proto kernel metric 256 pref medium 2001:1:1:1442::400/122 dev eno49 proto kernel metric 100 pref medium fe80::/64 dev eno49 proto kernel metric 100 pref medium default via 2001:1:1:1442::43f dev eno49 proto static metric 100 pref medium
Pre-requisite
- You must have RHEL/CentOS 8 installed OS on a server. Now this server may or may not have UEFI BIOS.
- The interface used for PXE must have an IPv6 address
- If you are using RHEL 8 then you must have an active RHN subscription
- If you are using CentOS 8 then you must have an active internet connection to download and install package. Although you may also configure offline repository if your server doesn't have active internet connection
- It is recommended to have umask set as 022 as the kickstart installation over network would need world readable access for all required files and directories
Steps to configure IPv6 UEFI PXE Boot Server using Kickstart
Step-1: Setup Installation Repository
We would need an installation repository with all the rpms from the RHEL/CentOS 8 image which will be used to install our target server. I have downloaded the CentOS 8.2 image which I will mount on /mnt
and then copy the content to my local directory.
# mount /tmp/CentOS-8.2.2004-x86_64-dvd1.iso /mnt # cd /mnt # mkdir -p /home/images/centos82
I have created /home/images/centos82
directory where I will copy all the files from /mnt
:
HINT:
# cp -rvf /mnt* /home/images/centos82/
In some cases thee hidden file from the base image i.e. .treeinfo
and .discinfo
is not copied by default so copy them manually
IMPORTANT NOTE:
.treeinfo
and .discinfo
from the image or else your installation is expected to fail. These are referred during the installation over the network using PXE to validate the integrity of the repository.cp /mnt/.discinfo /home/images/centos82/ cp /mnt/.treeinfo /home/images/centos82/
After copying all the files:
Step-2: Install and Configure TFTP Server
Next we will use TFTP server to transfer the UEFI PXE Boot files required for installing the target nodes over network. Use the following command to install tftp packages:
~]# dnf install tftp-server -y
Once the package is installed, you can check for the path of systemd unit file using following command:
~]# rpm -ql tftp-server | grep -E "service|socket"
Next you can check the content of the service unit file:
~]# cat /usr/lib/systemd/system/tftp.service
Here you see that by default the tftp service will search for TFTP files inside /var/lib/tftpboot
. So we will place all our UEFI PXE Boot files under this location. If you plan to use a different path then you can modify this service file and execute following command to update your changes:
]# systemctl daemon-reload ]# systemctl restart tftp.service
Next enable and start this service to make sure the service is started automatically post reboot.
]# systemctl enable tftp.service --now Created symlink /etc/systemd/system/sockets.target.wants/tftp.socket → /usr/lib/systemd/system/tftp.socket.
Since the tftp service is managed by tftp socket, it is important that the socket is up and running. As and when there is an incoming TFTP request, the socket will start the service automatically.
Check the status of the socket to make sure it was started successfully.
~]# systemctl status tftp.service
Step-3: Configure UEFI PXE Boot Server
Next to perform UEFI {XE Boot installation, we will need PXE boot files. Normally for Legacy BIOS PXE boot we needed pxelinux.0
 and ldlinux.c32
 part of syslinux-tftpboot
 rpm.
But for UEFI BIOS we need following files:
- grubx64.efi provided by grub2-efi-x64 rpm
- shimx64.efi provided by shim-x64 rpm
- BOOTX64.EFIÂ provided by shim-x64 rpm
You can copy the mentioned rpms from the image to some temporary location such as /tmp
 and extract the rpm to get the required files:
]# cp /home/images/centos82/BaseOS/Packages/grub2-efi-x64-2.02-81.el8.x86_64.rpm /tmp/ ]# cp /home/images/centos82/BaseOS/Packages/shim-x64-15-11.el8.x86_64.rpm /tmp/
Next extract these rpms using rpm2cpio command.
]# cd /tmp ]# rpm2cpio shim-x64-15-11.el8.x86_64.rpm | cpio -idm ]# rpm2cpio grub2-efi-x64-2.02-81.el8.x86_64.rpm | cpio -idm
We will store all our PXE files inside /var/lib/tftpboot/pxelinux
. Now if you recall, by default TFTP will look into /var/lib/tftpboot
 so we must handle the extra pxelinux
 directory while setting up our UEFI PXE Boot server.
]# mkdir /var/lib/tftpboot/pxelinux
Copy the PXE boot files from /tmp
 where we extracted the rpm to this location:
]# cp /tmp/boot/efi/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/pxelinux/ ]# cp /tmp/boot/efi/EFI/centos/shimx64.efi /var/lib/tftpboot/pxelinux/ ]# cp /tmp/boot/efi/EFI/centos/grubx64.efi /var/lib/tftpboot/pxelinux/
Next we need initrd
 and vmlinuz
 file to load the Operating System until hard disk and other interfaces are detected. I hope you are familiar with the steps of Linux Boot Process. These files can again be copied from the image, so we will copy and place them also inside /var/lib/tftpboot/pxelinux/
]# cp /home/images/centos82/isolinux/vmlinuz/var/lib/tftpboot/pxelinux/ ]# cp /home/images/centos82/isolinux/initrd.img /var/lib/tftpboot/pxelinux/
Following is the content of my /var/lib/tftpboot/pxelinux
 at this stage:
~]# ls -l /var/lib/tftpboot/pxelinux/ total 78460 -rwx------. 1 root root 1877384 Jan 2 11:02 , -rwxr-xr-x. 1 root root 1211224 Jan 2 11:00 BOOTX64.EFI -rwxr-xr-x. 1 root root 1877384 Jan 2 11:02 grubx64.efi -r--r--r--. 1 root root 65114456 Jan 2 11:01 initrd.img -rwxr-xr-x. 1 root root 1211224 Jan 2 11:02 shimx64.efi -r-xr-xr-x. 1 root root 8913656 Jan 1 22:17 vmlinuz
Step-4: Configure DHCPv6 for IPv6 UEFI PXE Boot
Next we need to install and configure DHCP to support UEFI PXE Boot installation.
]# dnf -y install dhcp-server
You can check a sample dhcpd6.conf file under /usr/share/doc/dhcp-server/dhcpd6.conf.example
. Here is my sample dhcpd6.conf
file:
~]# vim /etc/dhcp/dhcpd6.conf # # DHCPv6 Server Configuration file. # see /usr/share/doc/dhcp-server/dhcpd6.conf.example # see dhcpd.conf(5) man page # default-lease-time 2592000; preferred-lifetime 604800; option dhcp-renewal-time 360; option dhcp-rebinding-time 720; allow leasequery; dhcpv6-lease-file-name "/var/lib/dhcpd/dhcpd6.leases"; option dhcp6.info-refresh-time 21600; option dhcp6.bootfile-url code 59 = string; option dhcp6.vendor-class code 16 = {integer 32, integer 16, string}; subnet6 2001:0001:0001:1442::0400/122 { range6 2001:0001:0001:1442::0405 2001:0001:0001:1442::0420; option dhcp6.bootfile-url "tftp://[2001:0001:0001:1442::0407]/pxelinux/BOOTX64.EFI"; }
You can follow the official documentation to understand about the different options used in dhcpd6.conf
file. Although let me explain the subnet6
declaration part i.e.:
subnet6 2001:0001:0001:1442::0400/122 { range6 2001:0001:0001:1442::0405 2001:0001:0001:1442::0420; option dhcp6.bootfile-url "tftp://[2001:0001:0001:1442::0407]/pxelinux/BOOTX64.EFI"; }
Here we have basically defined our IPv6 subnet and netmask. You can get this using route -n
command as shown below:
~]# route -6 -n Kernel IPv6 routing table Destination Next Hop Flag Met Ref Use If ::1/128 :: U 256 2 0 lo 2001:1:1:1442::400/122 :: U 100 16 0 eno49
Here eno49 is our primary interface using the same subnet i.e. 2001:1:1:1442::400/122
. Now the start and end IP Address provided in the range is something which you will have to add based on your environment. The IP address will be assigned from this range for the target server.
With DHCPv6 we don't use next-server and filename any more, instead we have to use dhcp6.bootfile-url
which will contain the path of PXE file which we extracted in previous step.
Next enable and start the DHCP server service:
HINT:
dhcpd6.service
instead of dhcpd.service
# systemctl enable dhcpd6 --now
Check the status of the dhcpd6
service:
Step-5: Configure Kickstart file for automated installation
Next we will create our kickstart file to have an un-attended automated installation. Now I have already explained different syntax and parameters used in kickstart file so I will not repeat the same here.
By default, when we install CentOS or RHEL server, we will have /root/anaconda.cfg
 file available which will contain the parameters used for the current installation. You can always take this file as your base and further modify it based on your requirement.
I will create a new directory to store our kickstart file for the UEFI PXE Boot purpose:
~]# mkdir /ks ~]# cp /root/anaconda-ks.cfg /ks/kickstart.conf
Make sure the file is world readable and permission of /ks
directory is 755
[root@server ~]# ls -dl /ks/kickstart.conf -rw-r--r--. 1 root root 1601 Jan 2 12:50 /ks/kickstart.conf [root@server ~]# ls -dl /ks drwxr-xr-x. 2 root root 28 Jan 2 12:50 /ks
We will update our kickstart.conf
at later part of this tutorial once we have configured HTTPD service
Step-6: Configure HTTP Server
Now we also need a service to host our image repository, we can use FTP or HTTP or NFS to host our image repository which we created in Step-1 of this tutorial. In my previous example where I had setup kickstart server using Legacy BIOS, I had used NFS so this time I decided to use HTTP server.
~]# dnf -y install httpd
Next we will configure Virtual Hosting to host our image repo path. I have created a new file ks-server.conf
 under /etc/httpd/conf.d/
 with the following content:
<VirtualHost [2001:1:1:1442::407]:80> ServerAdmin root@server1.example.com DocumentRoot / ServerName server.example.com ErrorLog logs/ks-server.example.com-error_log CustomLog logs/ks-server.example.com-access_log common <Directory /ks> Options Indexes MultiViews AllowOverride All Require all granted </Directory> <Directory /home/images/centos82> Options Indexes MultiViews AllowOverride All Require all granted </Directory> </VirtualHost>
So here I am basically serving two different PATH over my HTTP server i.e. my kickstart configuration file and my image repository. I have also provided the required permission to access these path, you may check Apache DirectoryListings for more information.
The next important thing we must do is to allow visibility of hidden files in the HTTP server as I mentioned earlier, installation over network requires validation of the repository using .treeinfo
 file which is basically a hidden file in Linux. So by default this file will not be visible on the web server.
So to fix this we must remove .??*
 from IndexIgnore
 parameter of /etc/httpd/conf.d/autoindex.conf
 file.
Change
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
To
IndexIgnore *~ *# HEADER* README* RCS CVS *,v *,t
Next enable and start the httpd service:
# systemctl enable httpd --now
Make sure the service has started successfully:
~]# systemctl status httpd
Next try to access the image repository path over the web server:
Similarly try to access the kickstart config file on the web browser:
For any issues you can check the log file which you have added in your virtual hosting configuration file:
[root@server ~]# ls -l /etc/httpd/logs/* -rw-r--r--. 1 root root 0 Jan 2 12:32 /etc/httpd/logs/access_log -rw-r--r--. 1 root root 6638 Jan 2 12:57 /etc/httpd/logs/error_log -rw-r--r--. 1 root root 12646 Jan 2 14:19 /etc/httpd/logs/ks-server.example.com-access_log -rw-r--r--. 1 root root 6750 Jan 2 12:45 /etc/httpd/logs/ks-server.example.com-error_log
Step-7: Update kickstart configuration file
Now we had taken kicksrart template from anaconda which was created for an installation performed using CDROM in my case, so I have to do some changes to use HTTP server for the installation instead of CDROM
So replace cdrom with the following entry
url --url=http://[2001:1:1:1442::407]/home/images/centos82/AppStream
Update the AppStream repo url, as with CDROM by default file://
 handler is used but since we place to use HTTP so we will have to use following path, additionally also mention the path of BaseOS repository.
# Create APPStream Repo repo --name="AppStream" --baseurl=http://[2001:1:1:1442::407]/home/images/centos82/AppStream repo --name="BaseOS" --baseurl=http://[2001:1:1:1442::407]/home/images/centos82/BaseOS
Now you can choose to modify other configurations as well, let me add a static IPv6 address for my interface:
# Network information network --bootproto=dhcp --device=eno49 --noipv4 --ipv6=2001:1:1:1442::409/122 --activate --ipv6gateway=2001:1:1:1442::43f network --hostname=myhost.example.com
You can use python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'
 command to generate an encrypted password which can be used in the kickstart file for any user.
rootpw --iscrypted $6$w7El/FYx9mbTG6x9$Te.Yg6dq0TsQwGpdSjeDGSw4J9ZBAkLXzT9ODMV7I7lHvX3n5.9PCS4jIkS2GbVLZOpVRLvrua3wwbwA.cfWX.
Here is my sample kickstart configuration file:
#version=RHEL8 ignoredisk --only-use=sda,sdb autopart --type=lvm # Partition clearing information clearpart --all --initlabel --drives=sda,sdb # Use graphical install graphical # Use CDROM installation media url --url=http://[2001:1:1:1442::407]/home/images/centos82/AppStream # Keyboard layouts keyboard --vckeymap=us --xlayouts='us' # System language lang en_US.UTF-8 # Create APPStream Repo repo --name="AppStream" --baseurl=http://[2001:1:1:1442::407]/home/images/centos82/AppStream repo --name="BaseOS" --baseurl=http://[2001:1:1:1442::407]/home/images/centos82/BaseOS # Network information network --bootproto=dhcp --device=eno49 --noipv4 --ipv6=2001:1:1:1442::409/122 --activate --ipv6gateway=2001:1:1:1442::43f network --bootproto=dhcp --device=eno50 --onboot=off --ipv6=auto network --bootproto=dhcp --device=eno51 --onboot=off --ipv6=auto network --bootproto=dhcp --device=eno52 --onboot=off --ipv6=auto network --bootproto=dhcp --device=eno53 --onboot=off --ipv6=auto network --bootproto=dhcp --device=eno54 --onboot=off --ipv6=auto network --bootproto=dhcp --device=eno55 --onboot=off --ipv6=auto network --bootproto=dhcp --device=eno56 --onboot=off --ipv6=auto network --hostname=myhost.example.com # Root password rootpw --iscrypted $6$E1ogwDVio48x2y7K$ZX1EPw78y8gc7BXqcvpSAx16DzHmvA8cnNULjPBRq8zd/aj7FmfgXS1u/0Z5/Zp76nHO9InF4G.DXUYwc9AKd0 # X Window System configuration information xconfig --startxonboot # Run the Setup Agent on first boot firstboot --enable # System services services --disabled="chronyd" # Reboot after installation reboot # System timezone timezone Asia/Kolkata --isUtc --nontp user --groups=wheel --name=deepak --password=$6$aJ53Yzqx8A1gBbfE$TgZ3dkZXi7nmCBCdhSbDxdP4aXxlpV0XsuMdQ7M0LR6TdwiXfYAXLDLdACqluWsWjWPrKGIqOnqPrQxoxYzGk. --iscrypted --gecos="deepak" %packages @^graphical-server-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-8: Configure grub.cfg (Dracut Kernel Menu)
For UEFI PXE Boot we need a grub.cfg
 file with the details of PXE boot files required for installation over network. Following is the content from my grub.cfg
 file:
~]# cat /var/lib/tftpboot/pxelinux/grub.cfg set timeout=30 menuentry 'Install CentOS 8' { linuxefi pxelinux/vmlinuz inst.ks=http://[2001:1:1:1442::407]/ks/kickstart.conf inst.stage2=http://[2001:1:1:1442::407]/home/images/centos82/ ip=[2001:1:1:1442::409]::[2001:1:1:1442::43F]:122::eno49:none initrdefi pxelinux/initrd.img }
Here we have created a single menu entry with the location of our kickstart configuration file. The inst.stage2=
 boot option specifies the location of the installation program’s runtime image. This option expects the path to a directory that contains a valid .treeinfo
 file and reads the runtime image location from the .treeinfo
 file.
Additionally I am assigning a static IP Address to my client because by default DHCPv6 will assign /128 subnet to all the clients. This has been discussed at multiple forums and looks like something which needs to be fixed at the router side.
The syntax to assign static IP address via dracut command line is as below:
ip=<client-IP-number>:[<server-id>]:<gateway-IP-number>:<netmask>:<client-hostname>:<interface>:{dhcp|dhcp6|auto6|on|any|none|off}
In our case, 2001:1:1:1442::409
will be the client's IP Address with 122
subnet and gateway 2001:1:1:1442::43F
assigned to eno49
interface.
Alternatively, if you have MAC address of your client, then you can create different grub.cfg file for individual MAC address and assign static IP Address but again this is something which I have not tested with IPv6 and UEFI yet, I have previously explained this with IPv4 and Legacy BIOS. You can give it a try and share your experience.
Step-9: Configure Firewall
We have three services which must be allowed in the firewall i.e. DHCP, TFTP and HTTP. Since we are using firewalld, we will use firewall-cmd
to enable these service/ports:
~]# firewall-cmd --add-service=http --add-service=tftp --add-service=dhcpv6 --permanent
~]# firewall-cmd --reload
success
Verify the rules are added properly
~]# firewall-cmd --list-service cockpit dhcpv6 dhcpv6-client http ssh tftp
Step-10: Configure SELinux
I have kept my SELinux into Permissive mode for the sake of this tutorial.
~]# getenforce
Permissive
You can also set it to permissive mode using following command
~]# setenforce 0
or you may also choose to completely disable it.
Step-11: Verify TFTP Access
It is a good practice to verify if your TFTP server is working properly and if you are able to access the files via tftp client. As if there is any problem then during PXE boot, it would be very hard to troubleshoot as there won't be much logs to debug such issues.
I will use the same server to verify this, you may choose a different client node as well. Go ahead and nstall tftp package:
~]# dnf -y install tftp
Next navigate into temporary folder, connect to your TFTP server using the IPv6 address as you have provided in grub.cfg file and attempt to download any file:
[root@server ~]# cd /tmp/
[root@server tmp]# tftp [2001:0001:0001:1442::0407]
tftp> get pxelinux/grub.cfg
tftp> quit
[root@server tmp]# ls -l grub.cfg
-rw-r--r--. 1 root root 291 Jan 2 15:15 grub.cfg
As you can see, I was successfully able to download grub.cfg
file. If you want, you can repeat the same for other files which are served over TFTP or just make sure, all of them have world readable permission
Step-12: Perform IPv6 UEFI PXE Boot
Now we are all setup to perform IPv6 UEFI PXE Boot of our target client blades to install them over the network.
Boot your client node and perform a network based installation. Now the shortcut button to boot over network may vary for different hardware but on most cases we are expected to press F12 to boot from network:
If your UEFI PXE Boot Server configuration is proper, then the TFTP files should get successfully downloaded as shown below
Next we should be able to see our boot menu as per grub.cfg
configuration. Hit Enter or the default option would be selected after the provided timeout value:
You can also check the server logs using journalctl -f
:
Jan 02 14:53:18 server.example.com dhcpd[6050]: Solicit message from fe80::217:a4ff:fe77:32 port 546, transaction ID 0x5740AE00 Jan 02 14:53:18 server.example.com dhcpd[6050]: Picking pool address 2001:1:1:1442::410 Jan 02 14:53:18 server.example.com dhcpd[6050]: Advertise NA: address 2001:1:1:1442::410 to client with duid 00:04:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 iaid = -559186 valid for 2592000 seconds Jan 02 14:53:18 server.example.com dhcpd[6050]: Sending Advertise to fe80::217:a4ff:fe77:32 port 546 Jan 02 14:53:22 server.example.com dhcpd[6050]: Request message from fe80::217:a4ff:fe77:32 port 546, transaction ID 0x5740AF00 Jan 02 14:53:22 server.example.com dhcpd[6050]: Reply NA: address 2001:1:1:1442::410 to client with duid 00:04:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 iaid = -559186 valid for 2592000 seconds Jan 02 14:53:22 server.example.com dhcpd[6050]: Sending Reply to fe80::217:a4ff:fe77:32 port 546 Jan 02 14:53:33 server.example.com in.tftpd[6520]: tftp: client does not accept options Jan 02 14:53:34 server.example.com in.tftpd[6521]: Client 2001:1:1:1442::410 finished pxelinux/BOOTX64.EFI Jan 02 14:53:34 server.example.com in.tftpd[6522]: Client 2001:1:1:1442::410 finished /pxelinux/grubx64.efi Jan 02 14:53:34 server.example.com dhcpd[6050]: Release message from fe80::217:a4ff:fe77:32 port 546, transaction ID 0x5740B000 Jan 02 14:53:34 server.example.com dhcpd[6050]: Client 00:04:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 releases address 2001:1:1:1442::410 Jan 02 14:53:34 server.example.com dhcpd[6050]: Sending Reply to fe80::217:a4ff:fe77:32 port 546 Jan 02 14:53:35 server.example.com in.tftpd[6525]: Client 2001:1:1:1442::410 finished /pxelinux/grub.cfg Jan 02 14:53:35 server.example.com in.tftpd[6530]: Client 2001:1:1:1442::410 finished /pxelinux/grub.cfg Jan 02 14:53:42 server.example.com in.tftpd[6531]: Client 2001:1:1:1442::410 finished pxelinux/vmlinuz Jan 02 14:53:48 server.example.com in.tftpd[6532]: Client 2001:1:1:1442::410 finished pxelinux/initrd.img
Next if everything is good, then your installation should start, so looks like all the boxes are checked successfully and now the installation should start, you can go prepare your coffee.
Sit back and relax..
So our client is successfully installed using IPv6 UEFI PXE Boot:
Summary
In this tutorial I shared step by step instructions to configure IPv6 UEFI PXE Boot server using DHCPv6. There were some hicups during the testing phase, mostly related to DHCPv6 as the configuration is quiet different for dpcpd6 compared to dhcpd when it comes to the usage for network installation. But the one thing which still remains open is the handling of /128 subnet which is assigned by DHCPv6 to all the clients. Due to which the connection over network doesn't happen because we may not be always using /128 subnet as in my case I was using /122 subnet.
I hope someone can come up with a solution or I will try to come up with one in future when we go for production with such environment. For now, let's settle with assigning static IP address and go ahead.
Further Reading
Setting up a UEFI HTTP Boot server
Excellent !!!!!!!!!!!!!!!!!!!!!!!. Thank you so much brother.
Will definitely help me a lot.