Step-by-setp setup instructions for remote boot server(dhcp+tftp) based on Ubuntu 16.04 Xenial. Two possible options: dnsmasq and dhcpd+tftpd.
Change IP addresses for your network. Place into ${TFTP_DIR} generated images: vmlinuz
, initrd.img
, rootfs.squashfs
, home.tar.gz
.
dnsmasq as all-on-one solution: DHCP and TFTP server.
THIS_SERVER_IP=192.168.10.254
SUBNET=192.168.10.0
NETMASK=255.255.255.0
ROUTER=192.168.10.254
DNS1=192.168.10.254
DNS2=192.168.10.254
DHCP_START=192.168.10.129
DHCP_END=192.168.10.253
TFTP_DIR=/var/lib/tftpboot
apt install dnsmasq syslinux-common pxelinux
mkdir -p "$TFTP_DIR"
cd "$TFTP_DIR"
ln -sf /usr/lib/syslinux/modules/bios/ldlinux.c32 ldlinux.c32
ln -sf /usr/lib/PXELINUX/pxelinux.0 pxelinux.0
mkdir pxelinux.cfg
cat > pxelinux.cfg/default <<EOF
default thinclient
prompt 0
# DEBUG with serial console
# console=tty1 console=ttyS0,115200n8
# DEBUG shell inside initrd
# initrddebug=y
# Mount overlays over rootfs
# overlayproto=http overlays=overlay1.tar.gz,overlay2.tar.gz
# Set compressed RAM (zram) disk size to specified percent of available RAM. Default is 50, 0 disables it.
# Documentation: https://www.kernel.org/doc/Documentation/blockdev/zram.txt
# zram_size_pct=50
# Fallback mode for graphics and framebuffer
# Documentation: https://www.kernel.org/doc/Documentation/fb/uvesafb.txt
# uvesafb=mode_option=1280x800-32;scroll=ywrap
label thinclient
kernel vmlinuz
append boot=ram initrd=initrd.img rootproto=http rooturl=/rootfs.squashfs homeproto=http homeurl=/home.tar.gz rdpservers=rdp%server1:dc1.example.net:3389;rdp%server2:dc2.example.net:5555:/sec:rdp%/bpp:24
EOF
cat > /etc/dnsmasq.conf <<EOF
# Do not run as DNS server
port=0
dhcp-range=${DHCP_START},${DHCP_END},${NETMASK}
# All available options: dnsmasq --help dhcp
dhcp-option=option:dns-server,${DNS1}
dhcp-option=option:dns-server,${DNS2}
dhcp-option=option:router,${ROUTER}
# If dnsmasq is providing a TFTP service (see --enable-tftp ) then only the filename is required here to enable network booting.
dhcp-boot=/pxelinux.0
# TFTP service
enable-tftp
tftp-root=${TFTP_DIR}
EOF
# Check config syntax
dnsmasq --test
systemctl restart dnsmasq.service
ISC DHCP Server and tftpd-hpa.
THIS_SERVER_IP=192.168.10.254
SUBNET=192.168.10.0
NETMASK=255.255.255.0
ROUTER=192.168.10.254
DNS1=192.168.10.254
DNS2=192.168.10.254
DHCP_START=192.168.10.129
DHCP_END=192.168.10.253
TFTP_DIR=/var/lib/tftpboot
apt install isc-dhcp-server tftpd-hpa syslinux-common pxelinux
mkdir -p "$TFTP_DIR"
cd "$TFTP_DIR"
# tftpd-hpa won't work with symlinks
cp -f /usr/lib/syslinux/modules/bios/ldlinux.c32 ldlinux.c32
cp -f /usr/lib/PXELINUX/pxelinux.0 pxelinux.0
mkdir pxelinux.cfg
cat > pxelinux.cfg/default <<EOF
default thinclient
prompt 0
# DEBUG with serial console
# console=tty1 console=ttyS0,115200n8
# DEBUG shell inside initrd
# initrddebug=y
# Mount overlays over rootfs
# overlayproto=http overlays=overlay1.tar.gz,overlay2.tar.gz
# Set compressed RAM (zram) disk size to specified percent of available RAM. Default is 50, 0 disables it.
# Documentation: https://www.kernel.org/doc/Documentation/blockdev/zram.txt
# zram_size_pct=50
# Fallback mode for graphics and framebuffer
# Documentation: https://www.kernel.org/doc/Documentation/fb/uvesafb.txt
# uvesafb=mode_option=1280x800-32;scroll=ywrap
label thinclient
kernel vmlinuz
append boot=ram initrd=initrd.img rootproto=http rooturl=/rootfs.squashfs homeproto=http homeurl=/home.tar.gz rdpservers=rdp%server1:dc1.example.net:3389;rdp%server2:dc2.example.net:5555:/sec:rdp%/bpp:24
EOF
cat > /etc/default/tftpd-hpa <<EOF
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="${TFTP_DIR}"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
EOF
cat > /etc/dhcp/dhcpd.conf <<EOF
default-lease-time 600;
max-lease-time 7200;
subnet ${SUBNET} netmask ${NETMASK} {
range ${DHCP_START} ${DHCP_END};
option domain-name-servers ${DNS1}, ${DNS2};
option subnet-mask ${NETMASK};
option routers ${ROUTER};
allow booting;
#option option-128 code 128 = string;
#option option-129 code 129 = text;
next-server ${THIS_SERVER_IP};
filename "pxelinux.0";
}
EOF
systemctl restart tftpd-hpa.service
systemctl restart isc-dhcp-server.service