Diskless Machine(PxE boot)
What is PxE ?
PxE is a way of booting OS kernel over the network rather than from disk. It consist of one or more PxE servers which holds all kernel and initial ramdisk image. And PxE clients which are actual host where user application and services start. It is depicted in the Figure-1. PxE server running tftp and dhcp services. It is only necessary to PxE supported NIC on the client side. I will use Arch Linux as a PxE server. It is the one of the most lightweight and flexible Linux distribution. I will use CentOS6 kernel image for the PxE client.
Figure-1: PxE Boot
Installing Necessary Packages: First think we need to install necessary packages on the PxE server.
Installing tftp:
Directory for the tftp service is /srv/tftp.
[[email protected] netctl]# pacman -S tftp-hpa
[[email protected] netctl]# systemctl enable tftpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/tftpd.service → /usr/lib/systemd/system/tftpd.service.
[[email protected] netctl]# systemctl start tftpd.service
Installing dhcp:
You may get an error on the starting dhcpd4 service due to the fact that we have not configured yet the service.
[[email protected] netctl]# pacman -S dhcpd
[[email protected] netctl]# systemctl enable dhcpd4.service
[[email protected] netctl]# systemctl start dhcpd4.service
Installing NFS:
There are many options to boot the kernel over network such as NFS, HTTP, iSCSI etc. We will boot the host via NFS.
[[email protected] etc]# pacman -S nfs-utils
[[email protected] etc]# systemctl enable nfs-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[[email protected] etc]# systemctl start nfs-server.service
Installing Syslinux Syslinux is a packages that contains plenty of boot-loaders such as SYSLINUX (FAT filesystem bootloader), EXTLINUX (ext2/3/4 , btrfs and xfs filesystem bootloader), PXELINUX (Network PXE bootloader) and ISOLINUX (ISO-9660) for CD/DVD bootloading.
Configuration on the PxE Server:
dhcp:
[[email protected] ~]# cat /etc/dhcpd.conf
allow booting;
allow bootp;
option domain-name-servers 192.168.122.1, 172.16.25.1;
option subnet-mask 255.255.255.0;
option routers 172.16.25.1;
subnet 172.16.25.0 netmask 255.255.255.0 {
range 172.16.25.100 172.16.25.110;
}
next-server 172.16.25.60;
filename "pxelinux.0";
tftp:
As indicated before /srv/tftp the root directory of the tftp server. So all necessary configurations such as OS kernel images, initial ram disk images to boot over network will be stored in this (sub)directories.
[[email protected] syslinux]# pwd
/usr/lib/syslinux
[[email protected] syslinux]# ls -ltr
total 16
drwxr-xr-x 2 root root 4096 Jan 14 20:47 efi32
drwxr-xr-x 2 root root 4096 Jan 14 20:47 efi64
drwxr-xr-x 2 root root 4096 Jan 14 20:47 diag
drwxr-xr-x 2 root root 4096 Jan 14 20:47 bios
In order for properly booting the kernel over network we need to copy some syslinux binaries to the /srv/tftpboot.
[[email protected] syslinux]# cp /usr/lib/syslinux/bios/pxelinux.0 /srv/tftp
[[email protected] syslinux]# cp /usr/lib/syslinux/bios/menu.c32 /srv/tftp
[[email protected] syslinux]# cp /usr/lib/syslinux/bios/libutil.c32 /srv/tftp
[[email protected] syslinux]# cp /usr/lib/syslinux/bios/ldlinux.c32 /srv/tftp
we also need to create a special folder named pxelinux.cfg under /srv/tftp which holds configuration for the grub-like menu. There is a directory named rhce6 under the /srv/tftp which holds our PxE client kernel and initrd image.
#For more information see /usr/share/doc/syslinux/pxelinux.txt
[[email protected] syslinux]# mkdir -p /srv/tftp/pxelinux.cfg
[[email protected] syslinux]# cat << EOF > /srv/tftp/pxelinux.cfg/default
default menu.c32
timeout 30
prompt 1
label diskless6
kernel /rhce6/vmlinuz-2.6.32-696.10.3.el6.x86_64
append initrd=/rhce6/netboot6.img rw root=nfs:172.16.25.60:/srv/diskless/rhce6 selinux=0 enforcing=0
NFS:
NFS server will be used to mounting root (/) file by the kernel. All our applications and OS configurations live here. So I created a folder named diskless/rhce6 under the /srv.
[[email protected] rhce6]# cat /etc/exports
/srv/diskless/rhce6 *(rw,no_root_squash,no_subtree_check)
Creating a special initrd for the PxE client.
Here is the magic comes in. It is very important that we need to create initrd image that is able to mount the root (/) by using NFS protocol. By the way we do not do it on the PxE server. I have a running CentOS6 machine which has the same kernel version as the host that will be used as PxE client.
We need to install dracut-network package.
[[email protected] ~]# yum install dracut-network
Creating a initrd image:
[[email protected] ~]# dracut -f /boot/netboot6.img `uname -r` root=dhcp root-path=nfs:172.16.25.60:/srv/diskless/rhce6
Only thing that we need to do is, copying the kernel image(vmlinuz) and initrd(in this case netboot6.img) to /srv/tftp/rhce6
[[email protected] rhce6]# pwd
/srv/tftp/rhce6
[[email protected] rhce6]# ls
netboot6.img vmlinuz-2.6.32-696.10.3.el6.x86_64
Copying images to the PxE Server:
We need to copy CentOS root(/) folder to the PxE server. And PxE server serve this place as nfs export.
[[email protected] ~]# rsync -vaHAXSz --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / [email protected]:/srv/diskless/rhce6
Changing Hostname:
[[email protected] ~]# cat /srv/diskless/rhce6/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=diskless.sfp.local
fstab We need to modify fstab suitable for the PxE boot.
[[email protected] ~]# cat /srv/diskless/rhce6/etc/fstab
172.16.25.60:/srv/diskless/rhce6/ / nfs defaults 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
Network:
I configured PxE client IP as dhcp which automatically given an IP by the dhcp server.
[[email protected] ~]# cat /srv/diskless/rhce6/etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=ethernet
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
PxE client Options:
Create a New Virtual Machine on the KVM and choose “Network Boot(PXE)”
Chose interface device model virtio in the NIC section.
Experiment
Finally I am ready to fire my virtual guest without adding a disk.
Booting over Network:
Disk Status
IP
That’s all for now. Happy booting 🙂