Serveur PXE UEFI

De Wiki doc

EN CHANTIER

Article en cours d'écriture et/ou de test. Certains éléments peuvent être incomplets et mener à un résultat non fonctionnel.
Merci de ne pas rager.

Cette page traite de la mise en place d'un serveur PXE avec prise en charge des micrologiciels UEFI. Elle reprend un certains nombre de ces éléments tout en retravaillant la partie BIOS pour maintenir une cohérence avec la nouvelle fonctionnalité: l'amorçage UEFI.

Pourquoi amorcer PXE en UEFI ? Pour plusieurs raisons. Tout d'abord, le BIOS devrai totalement disparaître des nouvelles cartes mères en 2020 (décision d'Intel, à voir ce que fera AMD) pour être remplacés par des UEFI Classe 3+ (imposant le secure boot...). Le mode "legacy" ne pourra donc plus être utilisé et toute les documentations concernant le démarrage PXE classique seront alors obsolètes. Ensuite, le PXE en UEFI est le seul à permettre un amorçage via IPv6. Là encore, inutile de préciser l’intérêt de ce préparer à ce protocole... Enfin, dans bien des cas, le seul moyen d'installer un système d'exploitation en mode UEFI est de démarrer son support d'installation en UEFI (c'est complètement débile mais c'est comme ça...). Amorcer PXE en UEFI permettra donc de ce passer de clé USB pour installer ces machines.

Installation des services

apt install isc-dhcp-server tftpd-hpa

Configuration des services

Isc-dhcp-server

Une particularité pour le serveur DHCP va être de détecter le type de micrologiciel exécutant la demande de bail. En fonction de celui-ci (BIOS, UEFI 32 ou 64 bits), un ficher d'amorçage différent sera présenté au client.

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.182.1;

# Active la gestion des architectures de micrologiciels
option arch code 93 = unsigned integer 16;

# Fichier d'amorçage à fournir en fonction de l'architecture demandeuse
if option arch = 00:06 {
	filename "efi32/syslinux.efi";
} else if option arch = 00:07 {
	filename "efi64/syslinux.efi";
} else if option arch = 00:09 {
	filename "efi64/syslinux.efi";
} else {
	filename "bios/lpxelinux.0";
}

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

option domain-name-servers 192.168.170.171;

subnet 192.168.182.0 netmask 255.255.255.0 {
	range 192.168.182.2 192.168.182.99;
	option subnet-mask 255.255.255.0;
	option broadcast-address 192.168.182.255;
	option routers 192.168.182.254;
	default-lease-time 600;
	max-lease-time 7200;
}

On note que la structure conditionnelle pour la fourniture des logiciels d'amorçage renvoie vers un fichier contenue dans l'arborescence correspondant au type d'architecture demandant l'amorce (argument "filename"). Il est important de comprendre que PXELinux (du logiciel Syslinux) va chercher des fichiers via un chemin relatif (c'est codé en dur dedans). Le répertoire contenant le fichier d'amorce sera la racine du système d'exécution lancé par PXELinux. On peut donc séparer les architecture dans des répertoires dédiés et ceux, afin de permettre cette amorce multi-genre. En effet, les fichiers qui seront chargés par la suite comportent le même nom peut un porte le type de micrologiciel de la carte mère démarrant en PXE. Il est important de segmenter dé le départ les ressources.

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

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

Création de l'arborescence

mkdir -p /srv/tftp/{bios,efi32,efi64,pxelinux.cfg,systemes}

Provisionnement des fichiers d'amorçage

PXELinux

Téléchargement

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

Fichier en cache ici.

Extraction de son contenu

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

Copie des fichiers

BIOS

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

UEFI 32 bits

cp /tmp/syslinux-6.04-pre1/efi32/efi/syslinux.efi /srv/tftp/efi32/
cp /tmp/syslinux-6.04-pre1/efi32/com32/libutil/libutil.c32 /srv/tftp/efi32/
cp /tmp/syslinux-6.04-pre1/efi32/com32/lib/libcom32.c32 /srv/tftp/efi32/
cp /tmp/syslinux-6.04-pre1/efi32/com32/elflink/ldlinux/ldlinux.e32 /srv/tftp/efi32/
mkdir /srv/tftp/efi32/boot-screens/
cp /tmp/syslinux-6.04-pre1/efi32/com32/menu/vesamenu.c32 /srv/tftp/efi32/boot-screens/
cd  /srv/tftp/efi32/ && ln -s ../pxelinux.cfg/ .

UEFI 64 bits

cp /tmp//syslinux-6.04-pre1/efi64/efi/syslinux.efi /srv/tftp/efi64/
cp /tmp/syslinux-6.04-pre1/efi64/com32/libutil/libutil.c32 /srv/tftp/efi64/
cp /tmp/syslinux-6.04-pre1/efi64/com32/lib/libcom32.c32 /srv/tftp/efi64/
cp /tmp/syslinux-6.04-pre1/efi64/com32/elflink/ldlinux/ldlinux.e64 /srv/tftp/efi64/
mkdir /srv/tftp/efi64/boot-screens/
cp /tmp/syslinux-6.04-pre1/efi64/com32/menu/vesamenu.c32 /srv/tftp/efi64/boot-screens/
cd  /srv/tftp/efi64/ && ln -s ../pxelinux.cfg/ .

Création du menu PXE

Comme vous l'avez probablement remarqué, nous pourrions avoir un menu générique par architecture. Nous avons utilisé un lien symbolique à la place afin d'utiliser le même pour tout le monde (et ainsi ne pas avoir à maintenir plusieurs configurations).

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 300
ONTIMEOUT Debian_Stretch
MENU AUTOBOOT Lancement de Debian_Stretch dans # secondes

LABEL Disque_local
MENU LABEL Amorcer le disque local
localboot -1

N'ayant pas poussez plus les expérimentations pour le moment, ce menu ne fait rien de particulié. Mais si vous arrivez ici c'est déjà que ça démarre donc la suite est une formalité. La seule chose importante à ce stade est la ligne default boot-screens/vesamenu.c32. Le chemin DOIT être relatif afin de fonctionner avec toute les architectures.

Provisionnement de l'image de fond du menu

wget https://doc.ycharbi.fr/fichiers/amor%C3%A7age/syslinux/pxe/bg-debian.png -P /srv/tftp/bios/boot-screens/
cp /srv/tftp/bios/boot-screens/bg-debian.png /srv/tftp/efi32/boot-screens/
cp /srv/tftp/bios/boot-screens/bg-debian.png /srv/tftp/efi64/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.

Memtest86+

ATTENTION

Astuce non fonctionnelle en mode UEFI. Pour l'instant, je démarre en mode BIOS via 2 manières et il faut la version 8 pour démarrer en UEFI (elle ne gère pas le BIOS). J'ai suivis, entre autre, cette documentation et toute les autres sont identiques... J'y travail...

Le célèbre testeur de RAM peut être démarré depuis le réseau. En théorie, il suffit de télécharger son binaire et d'ajouter une entrée correspondante dans le menu. En pratique, malgré mes recherches, aucune image à télécharger ne fonctionne en PXE. Il a fallut que j'extraie celle de l'ISO d'Ubuntu serveur 16.04.3 pour que cela fonctionne. J'ignore comment ils sont parvenu à ce resultat sachant que pour le moment, ce programme est incompilable (échec dé le début et aucune piste de résolution). Le mot clé pour obtenir ce que l'on souhaite par comilation semble être memtest.0. À creuser...

Partie brouillonne car en attente d'un état fonctionnel sur l'ensemble des architectures. On imagine que les fichiers son présents (proviennent de l'ISO d'Ubuntu et du site de memtest86+).

# Ne pas prendre en compte ces commandes
mkdir /srv/tftp/systemes/memtest86+/
wget http://www.memtest.org/download/5.01/memtest86+-5.01.bin.gz -P /srv/tftp/systemes/memtest86+/
cd /srv/tftp/systemes/memtest86+/ && gunzip memtest86+-5.01.bin.gz
vim /srv/tftp/pxelinux.cfg/default
# Méthode via le programme lui même (plus direct et rapide)
LABEL Memtest86+
MENU LABEL memtest86+
KERNEL mt86plus
APPEND onepass
# La syntaxe des arguments est visible dans un fichier texte dans l'ISO d'Ubuntu

# Méthode via l'ISO fourni par le site (pas de prise de tête mais on doit passer le menu du début et on ne peu pas lui passer d'arguments)
LABEL memtest86+.iso
MENU LABEL Memtest86+.iso
KERNEL memdisk
INITRD Memtest86-4.3.7.iso
APPEND iso raw

ASTUCE

Memtest86+ accèpte des arguments comme le fait le noyau Linux. Ces derniers sont décrit dans le PDF de l'archive téléchargeable sur le site offiel.

Sources en vrac:

Sources