Ubuntu : tftp, pxe et http

Bonjour,

Aujourd'hui, un billet rapide sur un serveur TFTP pour du boot PXE avec les ressources en HTTP.

Attention cependant, certains clients PXE ne supportent pas le chargement des sources via HTTP, par exemple, j'ai eu le cas sur un Lenovo M700 : TFTP obligatoire sinon les ressources ne sont pas trouvées car le client essaye d'utiliser l'url comme chemin TFTP.

Ce serveur est sous Ubuntu 22.04 LTS, hébergé sur un cluster Proxmox.

Certains packages sont nécessaires :

apt install tftpd-hpa pxelinux syslinux-common nginx

Il faut ensuite créer l'arborescence du TFTP (le dossier /srv/tftp est créé à l'installation de tftp-hpa) :

mkdir /srv/tftp/pxelinux.cfg
mkdir /srv/tftp/netboot

On copie ensuite le nécessaire pour le boot PXE :

cd /srv/tftp/
cp /usr/lib/PXELINUX/pxelinux.0 .
cp /usr/lib/syslinux/memdisk .
cp /usr/lib/syslinux/modules/bios/* .

En l'état, on pourrait faire le fichier default pour le boot PXE via TFTP mais c'est très lent donc on va servir les sources via HTTP.

Pour commencer, création de l'arborescence nécessaire :

root@deploy:/srv# tree -d deploy/ 
deploy/
├── cloudinit
│   └── ubuntu
│       └── jammy
├── images
│   ├── freebsd
│   │   └── 13.2
│   ├── gparted
│   └── ubuntu
│       └── jammy
├── post-install
├── preseed
└── sources
    ├── debian
    │   └── bookworm
    ├── gentoo
    └── ubuntu
        ├── focal
        └── jammy

Le vhost Nginx qui servira les sources:

# MANAGED BY PUPPET
server {
  listen *:80;


  server_name           deploy.adm.securmail.fr;

  
  index  index.html index.htm index.php;
  access_log            /var/log/nginx/deploy.access.log;
  error_log             /var/log/nginx/deploy.error.log;

  location /pxelinux/ {
    alias /srv/tftp/netboot;

    autoindex on;
    index     index.html index.htm index.php;
  }

  location / {
    root      /srv/deploy;
    index     index.html index.htm index.php;
  }
}

Il faut ensuite gérer les différentes sources.

Source Debian 12 :

wget https://deb.debian.org/debian/dists/bookworm/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar xzf netboot.tar.gz -C /srv/tftp/netboot/debian/12/
cd /srv/tftp/netboot/debian/12/debian-installer/amd64/
cp linux /srv/deploy/sources/debian/bookworm/
cp initrd.gz /srv/deploy/sources/debian/bookworm/

Source Ubuntu 20.04 :

wget http://archive.ubuntu.com/ubuntu/dists/focal-updates/main/installer-amd64/current/legacy-images/netboot/netboot.tar.gz
tar xzf netboot.tar.gz -C /srv/tftp/netboot/ubuntu/20.04
cd /srv/tftp/netboot/ubuntu/20.04/ubuntu-installer/amd64/
cp linux /srv/deploy/sources/ubuntu/focal/
cp initrd.gz /srv/deploy/sources/ubuntu/focal/

Source Ubuntu 22.04 :

cd /srv/deploy/images/
wget https://releases.ubuntu.com/22.04.3/ubuntu-22.04.3-live-server-amd64.iso
mount -o loop ubuntu-22.04.3-live-server-amd64.iso /mnt/
cd /mnt/casper/
cp initrd /srv/deploy/sources/ubuntu/jammy/
cp vmlinuz /srv/deploy/sources/ubuntu/jammy/
umount /mnt

Une fois tout cela en place (avec les droits corrects suivant votre configuration), on peut créer le fichier /srv/tftp/pxelinux.cfg/default qui contiendra les différentes entrées PXE :

DEFAULT vesamenu.c32
PROMPT 0

MENU TITLE PXE Boot Menu
LABEL Mfsbsd 13.2 UFS
    MENU LABEL Mfsbsd ^13.2 UFS
    KERNEL memdisk
    APPEND iso
    INITRD http://deploy.adm.securmail.fr/images/freebsd/13.2/mfsbsd-13.2-custom-ufs.iso.gz

LABEL Gparted
    MENU LABEL Gparted
    KERNEL memdisk
    APPEND iso
    INITRD http://deploy.adm.securmail.fr/images/gparted/gparted-live-1.5.0-6-amd64.iso

LABEL Gentoo
    MENU LABEL Gentoo live CD
    KERNEL http://deploy.adm.securmail.fr/sources/gentoo/kernel
    initrd http://deploy.adm.securmail.fr/sources/gentoo/network.igz
    APPEND root=/dev/ram0 init=/linuxrc  dokeymap looptype=squashfs loop=/image.squashfs  cdroot net.ifnames=0

LABEL Ubuntu 20.04 LTS preseed
    MENU LABEL Ubuntu ^20.04 LTS preseed
    kernel http://deploy.adm.securmail.fr/sources/ubuntu/focal/linux
    append initrd=http://deploy.adm.securmail.fr/sources/ubuntu/focal/initrd.gz DECONF_DEBUG=5 debian-installer/locale=en_US keyboard-configuration/layoutcode=fr auto=true priority=critical interface=auto netcfg/dhcp_timeout=60 vga=off fb=false preseed/url=http://deploy.adm.securmail.fr/preseed/ubuntu_focal

LABEL Ubuntu 20.04 LTS preseed tftp
    MENU LABEL Ubuntu ^20.04 LTS preseed tftp
    kernel netboot/ubuntu/20.04/ubuntu-installer/amd64/linux
    append initrd=netboot/ubuntu/20.04/ubuntu-installer/amd64/initrd.gz DECONF_DEBUG=5 debian-installer/locale=en_US keyboard-configuration/layoutcode=fr auto=true priority=critical interface=auto netcfg/dhcp_timeout=60 vga=off fb=false preseed/url=http://deploy.adm.securmail.fr/preseed/ubuntu_focal

LABEL Ubuntu 20.04 LTS no preseed
    MENU LABEL Ubuntu ^20.04 LTS no preseed
    KERNEL http://deploy.adm.securmail.fr/sources/ubuntu/focal/linux
    INITRD http://deploy.adm.securmail.fr/sources/ubuntu/focal/initrd.gz
    APPEND initrd=http://deploy.adm.securmail.fr/sources/ubuntu/focal/initrd.gz

LABEL Ubuntu 20.04 LTS no preseed tftp 
    MENU LABEL Ubuntu ^20.04 LTS no preseed tftp
    kernel netboot/ubuntu/20.04/ubuntu-installer/amd64/linux
    append initrd=netboot/ubuntu/20.04/ubuntu-installer/amd64/initrd.gz

LABEL Ubuntu 22.04 LTS preseed
    MENU LABEL Ubuntu ^22.04 LTS preseed
    KERNEL http://deploy.adm.securmail.fr/sources/ubuntu/jammy/vmlinuz
    INITRD http://deploy.adm.securmail.fr/sources/ubuntu/jammy/initrd
    APPEND root=/dev/ram0 ramdisk_size=1500000 ip=dhcp cloud-config-url=/dev/null url=http://deploy.adm.securmail.fr/images/ubuntu/jammy/ubuntu-22.04.3-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://deploy.adm.securmail.fr/cloudinit/ubuntu/jammy/

LABEL Ubuntu 22.04 LTS no preseed
    KERNEL http://deploy.adm.securmail.fr/sources/ubuntu/jammy/vmlinuz
    INITRD http://deploy.adm.securmail.fr/sources/ubuntu/jammy/initrd
    APPEND root=/dev/ram0 ramdisk_size=1500000 ip=dhcp cloud-config-url=/dev/null url=http://deploy.adm.securmail.fr/images/ubuntu/jammy/ubuntu-22.04.3-live-server-amd64.iso

LABEL Debian 12 preseed
    MENU LABEL Debian ^12 preseed
    KERNEL http://deploy.adm.securmail.fr/sources/debian/bookworm/linux
    APPEND initrd=http://deploy.adm.securmail.fr/sources/debian/bookworm/initrd.gz DECONF_DEBUG=5 debian-installer/locale=en_US keyboard-configuration/layoutcode=fr auto=true priority=critical interface=auto netcfg/dhcp_timeout=60 vga=off fb=false preseed/url=http://deploy.adm.securmail.fr/preseed/debian_bookworm

LABEL Debian 12 no preseed
    MENU LABEL Debian ^12 no preseed
    KERNEL http://deploy.adm.securmail.fr/pxelinux/debian/12/debian-installer/amd64/linux
    APPEND initrd=http://deploy.adm.securmail.fr/sources/debian/bookworm/initrd.gz

Il reste à dire au DHCP le next-server. Utilisant isc-dhcp, il faut rajouter ces options dans la partie générale du fichier dhcpd.conf :

# PXE
next-server 192.168.0.29;
filename "pxelinux.0";

Un restart de isc-dhcp et tout est disponible.

Pour donner un ordre d'idée : l'installation d'Ubuntu 22.04 avec curtin c'est environ 20/25mins (avec la mise à jour de l'installation, l'installation de puppet et d'autres paramètres dans le curtin).

Have fun.