Fedora 26: Install PXE Boot server for thin client with NFS

This article will run PXE Boot server with NFS for thin client, and run Fedora 26 on client which is connected to PXE Boot server via network. You do not need to install Fedora 26 on client.

1 Install PXE Boot server

The following script will install PXE Boot server. Change the variables to your environment.

  • SERVER_IPADDR is IP adress of PXE Boot server.
  • DHCP_SERVER_INTERFACESv4 is network interface name for DHCP. DHCP will be provided via this network interface.
  • DHCP_SUBNET is network address for DHCP.
  • DHCP_NETMASK is subnet for DHCP.
  • DHCP_DNS is DNS for DHCP.
  • DHCP_ROUTER is gateway for DHCP.
  • DHCP_CLIENT_HOSTNAME is hostname of client.
  • DHCP_CLIENT_IPADDR is IP address of client.
  • DHCP_CLIENT_MACADDR is MAC address of client.

NFS root filesystem is set to the following.

  • Set root user password to "fedora".
  • Create user which name is "fedora" and password is "fedora".
#!/bin/sh

set -e

# Change the following variable to yours.
[ -z "${SERVER_IPADDR}" ] && \
  SERVER_IPADDR=$(hostname -I | awk '{ print $1 }')
[ -z "${DHCP_SUBNET}" ] && DHCP_SUBNET=192.168.11.0
[ -z "${DHCP_NETMASK}" ] && DHCP_NETMASK=255.255.255.0
[ -z "${DHCP_DOMAIN}" ] && DHCP_DOMAIN=hiroom2.com
[ -z "${DHCP_DNS}" ] && DHCP_DNS="192.168.11.2, 192.168.11.1"
[ -z "${DHCP_ROUTER}" ] && DHCP_ROUTER=192.168.11.1
[ -z "${DHCP_CLIENT_HOSTNAME}" ] && \
  DHCP_CLIENT_HOSTNAME=fedora-26-pxeboot-client
[ -z "${DHCP_CLIENT_IPADDR}" ] && DHCP_CLIENT_IPADDR=192.168.11.254
[ -z "${DHCP_CLIENT_MACADDR}" ] && DHCP_CLIENT_MACADDR=52:54:00:5e:7a:a4

if [ -z "${MIRROR_URL}" ]; then
  F26=https://dl.fedoraproject.org/pub/fedora/linux/releases/26
  MIRROR_URL=${F26}/Everything/x86_64/os/
fi

tftp_server_install()
{
  sudo dnf install -y tftp-server
  sudo firewall-cmd --add-service=tftp --permanent
  sudo firewall-cmd --reload
  sudo systemctl enable tftp
  sudo systemctl restart tftp
}

dhcp_install()
{
  sudo dnf install -y dhcp

  cat <<EOF | sudo tee /etc/dhcp/dhcpd.conf
subnet ${DHCP_SUBNET} netmask ${DHCP_NETMASK} {
  option domain-name "${DHCP_DOMAIN}";
  option domain-name-servers ${DHCP_DNS};
  option routers ${DHCP_ROUTER};
  next-server ${SERVER_IPADDR};
  filename "pxelinux.0";
}

host ${DHCP_CLIENT_HOSTNAME} {
  hardware ethernet ${DHCP_CLIENT_MACADDR};
  fixed-address ${DHCP_CLIENT_IPADDR};
}
EOF

  sudo firewall-cmd --add-service=dhcp --permanent
  sudo firewall-cmd --reload
  sudo systemctl enable dhcpd
  sudo systemctl restart dhcpd
}

nfs_utils_install()
{
  sudo dnf install -y nfs-utils
  sudo firewall-cmd --add-service=nfs --permanent
  sudo firewall-cmd --reload
  sudo systemctl enable nfs
  sudo systemctl restart nfs

  sudo mkdir /var/lib/nfsroot
  cat <<EOF | sudo tee /etc/exports
/var/lib/nfsroot *(rw,sync,no_root_squash,no_subtree_check)
EOF
  sudo exportfs -ra

  sudo mkdir /var/lib/nfsroot/proc
  sudo mount -o bind /proc /var/lib/nfsroot/proc
  # shellcheck disable=SC2086
  sudo dnf group install -y --releasever=25 \
       --installroot=/var/lib/nfsroot "Fedora Workstation"

  # https://bugzilla.redhat.com/show_bug.cgi?id=1374427
  sudo restorecon /var/lib/nfsroot/etc/passwd* /var/lib/nfsroot/usr/bin/passwd

  sudo systemd-nspawn -D /var/lib/nfsroot sh -c "
# Set root password and create user.
yes fedora | passwd
useradd -m -s /bin/bash fedora
yes fedora | passwd fedora

# Locale setting.
echo LANG=\"en_US.UTF-8\" | tee /etc/locale.conf
"
}

syslinux_install()
{
  sudo dnf install -y syslinux

  cd /var/lib/tftpboot
  sudo cp /usr/share/syslinux/pxelinux.0 .
  sudo cp -a /usr/share/syslinux .

  sudo wget -q ${MIRROR_URL}/isolinux/initrd.img
  sudo wget -q ${MIRROR_URL}/isolinux/vmlinuz

  sudo mkdir pxelinux.cfg
  cat <<EOF | sudo tee pxelinux.cfg/default
path syslinux
include menu.cfg
default syslinux/vesamenu.c32
prompt 0
timeout 10
EOF

  cat <<EOF | sudo tee menu.cfg
menu hshift 13
menu width 49
menu margin 8
menu tabmsg

menu title Thin client boot menu
label fedora-26-thin-client
  menu label ^Fedora 26 thin client
  kernel vmlinuz
  append vga=788 initrd=initrd.img ip=dhcp \
    root=/dev/nfs nfsroot=${SERVER_IPADDR}:/var/lib/nfsroot rw selinux=0
menu end
EOF
}

pxeboot_main()
{
  tftp_server_install
  dhcp_install
  nfs_utils_install
  syslinux_install
}

pxeboot_main

2 Run Fedora 26 thin client with NFS

This article runs Fedora 26 thin client on virtual machine on KVM. Virtual machine on VirtualBox and real machine too can run Fedora 26 thin client with enabling network boot. Please check your BIOS setting.

Enable "NIC" of "Boot device order" and make it top of order with virt-manager.

0001_BootDeviceOrder.png

iPXE sends DHCP requests, receives DHCP response from PXE Boot server, download and run boot image.

0002_iPXE.png

syslinux's menu is displayed. After 1 second, "Fedora 26 thin client" will be selected automatically.

0003_syslinux.png

Fedora 26 thin client is started.

0004_BootFedora.png

Login is displayed.

0005_Login.png