Serveur PXE

De Wiki doc


L'armorçage par le réseau impose dans bien de ces implémentations deux services:

  • DHCP: Pour l'apprentissage du serveur TFTP fournissant les fichiers de démarrage par le client
  • TFTP: Pour la fourniture de ces fichiers

J'ajouterai un service HTTP afin d'améliorer les performances par rapport au service TFTP (qui est vraiment tout pourris). Ce dernier ne servira donc qu'a l'amorçage de PXELinux, HTTP s'occupant du transfère des différents fichiers de démarrage.

INFORMATION

Cette documentation ne traite que de l'amorçage PXE via un BIOS. Pour un fonctionnement sous UEFI, le document suivant est plus approprié.

Installation des services

Pour cet exemple j'utiliserai les services suivants:

apt install isc-dhcp-server tftpd-hpa apache2

Configuration des services

Service DHCP

Isc-dhcp-server

vim /etc/dhcp/dhcpd.conf
#Désactivation du dynDNS
ddns-update-style none;

#Limitation du DDoS
deny declines;

#Permet l'envoi de requette DHCPNAK
authoritative;

#------ autorisation du pxe ------

allow bootp;
allow booting;

#------ POUR LE PXE ------

#adresse du serveur tftpd
next-server 192.168.183.254;
#fichier de boot pxe
filename "lpxelinux.0";

#------ définition des serveurs DNS ------

option domain-name-servers 192.168.170.171;

subnet 192.168.183.0 netmask 255.255.255.0 {
	range 192.168.183.2 192.168.183.99;
	option subnet-mask 255.255.255.0;
	option broadcast-address 192.168.183.255;
	option routers 192.168.183.254;
	default-lease-time 600;
	max-lease-time 7200;
}
vim /etc/default/isc-dhcp-server
# Spécifiez vos interfaces en les séparant par des espaces
INTERFACESv4="eth0"
INTERFACESv6=""

Redémarrer le service

systemctl restart isc-dhcp-server.service

Dnsmasq

DHCP Cisco

Si vous voulez utiliser le service DHCP d'un équipement Cisco, vous pouvez vous référez à la documentation appropriée.

Service TFTP

vim /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure -v"
RUN_DAEMON="yes"

Redémarrer le service

systemctl restart tftpd-hpa.service

Service HTTP

vim /etc/apache2/apache2.conf
<Directory /srv/tftp>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>
vim /etc/apache2/sites-available/pxe.conf
<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	DocumentRoot /srv/tftp

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
a2dissite 000-default.conf
a2ensite pxe.conf
systemctl reload apache2.service

Provisionnement des fichiers d'amorçage

Nous utiliserons PXELinux (Syslinux via le réseau) pour effectuer la tâche de chargeur d'amorçage par le réseau.

Téléchargement de Syslinux

wget https://www.kernel.org/pub/linux/utils/boot/syslinux/Testing/6.04/syslinux-6.04-pre1.tar.gz -P /tmp

Si le lien venait à mourir, Syslinux est téléchargeable ici.

Extraction de son contenu

tar xzvf /tmp/syslinux-6.04-pre1.tar.gz -C /tmp

Copie des fichiers d’intérêts pour notre usage

cp /tmp/syslinux-6.04-pre1/bios/com32/elflink/ldlinux/ldlinux.c32 /srv/tftp/
cp /tmp/syslinux-6.04-pre1/bios/com32/lib/libcom32.c32 /srv/tftp/
cp /tmp/syslinux-6.04-pre1/bios/com32/libutil/libutil.c32 /srv/tftp/
cp /tmp/syslinux-6.04-pre1/bios/core/lpxelinux.0 /srv/tftp/
cp /tmp/syslinux-6.04-pre1/bios/memdisk/memdisk /srv/tftp/
mkdir /srv/tftp/boot-screens/
cp /tmp/syslinux-6.04-pre1/bios/com32/menu/vesamenu.c32 /srv/tftp/boot-screens/
mkdir /srv/tftp/pxelinux.cfg

INFORMATION

Vous pouvez utiliser le fichier /tmp/syslinux-6.04-pre1/bios/core/lpxelinux.0 pour assurer la compatibiliter avec le protocole HTTP ou le fichier /tmp/syslinux-6.04-pre1/bios/core/pxelinux.0 /srv/tftp/ pour rester classique et n'utiliser que le TFTP. Pensez dans ce cas à adapter le fichier fournit par votre DHCP.

Création du menu PXE

vim /srv/tftp/pxelinux.cfg/default
##########################
# Personnalisation du menu 
##########################

default /boot-screens/vesamenu.c32
menu hshift 13
menu width 49
menu vshift 12
menu title Menu PXE Yohan
menu background boot-screens/bg-debian.png

# Rend l'écran blanc transparent (n'affecte pas le menu)
#menu color screen	37;40      #80ffffff #ccffffff std

# Couleur du selectueur (là ou est le curseur. Je le met en orange non transpatrent (ff). 00 pour transparent à 100%
menu color sel		7;37;40    #e0000000 #ccff8000 all

# Couleur du font du menu (ne comprend pas le fond du titre). En noir
menu color unsel	37;44      #90ffffff #cc000000 std

# Couleur du fond du titre (d'une hauteur d'1em donc ça couvre que la taille du texte).
menu color title	1;36;44    #c00090f0 #20000000 std

menu tabmsg Press ENTER to boot or TAB to edit a menu entry
menu autoboot Starting Local System in # seconds
prompt 0

##################################
# Entrée des systèmes de démarrage 
##################################

# Démarrage automatique de l'entrée spécifié au bout de 3 secondes
timeout 30
ONTIMEOUT Debian_Stretch
MENU AUTOBOOT Lancement de Debian_Stretch dans # secondes

LABEL Disque_local
MENU LABEL Amorcer le disque local
localboot -1

LABEL Debian_Stretch
MENU LABEL Lancer Debian Stretch
LINUX http://192.168.183.254/noyaux/stretch/vmlinuz-2 quiet
APPEND initrd=http://192.168.183.254/noyaux/stretch/initrd.img-2 boot=live vga=792 config noswap noprompt fetch=http://192.168.183.254/images/stretch-pxe.squashfs ramdisk_size=6666 root=/dev/ram0 rw net.ifnames=0 showmounts toram quickreboot

LABEL Installation_Debian_manu
MENU LABEL Installer Debian 9 manu
KERNEL http://192.168.183.254/noyaux/stretch/debian-installer/linux quiet
APPEND vga=normal initrd=http://192.168.183.254/noyaux/stretch/debian-installer/initrd.gz priority=low

LABEL Installation_Debian_auto
MENU LABEL Installer Debian 9 auto
KERNEL http://192.168.183.254/noyaux/stretch/debian-installer/linux quiet
APPEND vga=normal initrd=http://192.168.183.254/noyaux/stretch/debian-installer/initrd.gz auto=true interface=auto netcfg/dhcp_timeout=60 netcfg/choose_interface=auto priority=critical url=http://192.168.183.254/scripts/preseed/preseed.cfg DEBCONF_DEBUG=5 IPAPPEND 2

Enfin, envoyez une image PNG (640x480) sur votre serveur pour le fond de votre menu. J'utilise celle-ci.

wget https://doc.ycharbi.fr/fichiers/amor%C3%A7age/syslinux/pxe/bg-debian.png -P /srv/tftp/boot-screens/

Provisionnement des systèmes distants

Démarrage sur le disque local

Si un système est déjà installé sur le volume local de votre machine, vous pouvez utiliser la première entrée du menu configuré plus haut avec l'option localboot.

SquashFS

Pour la création d'une image SquashfS, je vous invites à lire la documentation appropriée.

Création des répertoires d'accueils

mkdir -p /srv/tftp/noyaux/stretch/
mkdir /srv/tftp/images/

Importation de son noyau

scp vmlinuz-2 root@192.168.183.254:/srv/tftp/noyaux/stretch/

Importation de son initrd

scp initrd.img-2 root@192.168.183.254:/srv/tftp/noyaux/stretch/

Importation de l'image

scp stretch-pxe.squashfs root@192.168.183.254:/srv/tftp/images

Vous pouvez désormais démarrer une machine en PXE avec cette image SquashFS.

Debian-installer

Les fichiers suivants sont présents dans l'archive netboot.tar.gz de debian-installer du dépôt officiel de Debian.

Importation du noyau

scp linux root@192.168.183.254:/srv/tftp/noyaux/stretch/debian-installer/

Importation de l'installateur Debian

scp initrd.gz root@192.168.183.254:/noyaux/stretch/debian-installer/

Preseed

Pour la création d'un fichier Preseed, je vous invites à lire la documentation appropriée.

La partie sur le noyau et l'initrd est identique à la section Debian-installer.

Création des répertoires d'accueils

mkdir -p /srv/tftp/scripts/preseed/
mkdir /srv/tftp/noyaux/stretch/debian-installer/

Importation du script d'installation

scp preseed.cfg root@192.168.183.254:/srv/tftp/scripts/preseed/

Importation du noyau

scp linux root@192.168.183.254:/srv/tftp/noyaux/stretch/debian-installer/

Importation de l'installateur Debian

scp initrd.gz root@192.168.183.254:/noyaux/stretch/debian-installer/

Vous pouvez désormais installer une machine en PXE de façon automatique.