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

<source lang="bash">

  1. Désactivation du dynDNS

ddns-update-style none;

  1. Limitation du DDoS

deny declines;

  1. Permet l'envoi de requette DHCPNAK

authoritative;

  1. ------ autorisation du PXE ------

allow bootp; allow booting;

  1. ------ POUR LE PXE ------
  1. adresse du serveur tftpd

next-server 192.168.182.1;

  1. Active la gestion des architectures de micrologiciels

option arch code 93 = unsigned integer 16;

  1. 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"; }

  1. ------ 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; } </source>

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

<source lang="bash">

  1. Spécifiez vos interfaces en les séparant par des espaces

INTERFACESv4="eth0" INTERFACESv6="" </source>

Redémarrer le service

systemctl restart isc-dhcp-server.service

Service TFTP

vim /etc/default/tftpd-hpa

<source lang="bash"> TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure -v" RUN_DAEMON="yes" </source>

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

<source lang="bash"> 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/ . </source>

UEFI 32 bits

<source lang="bash"> 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/ . </source>

UEFI 64 bits

<source lang="bash"> 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/ . </source>

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

<source lang="bash">

  1. 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

  1. Rend l'écran blanc transparent (n'affecte pas le menu)
  2. menu color screen 37;40 #80ffffff #ccffffff std
  1. 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

  1. Couleur du font du menu (ne comprend pas le fond du titre). En noir

menu color unsel 37;44 #90ffffff #cc000000 std

  1. 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

  1. Entrée des systèmes de démarrage
  1. 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 </source>

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 <source lang="bash" inline>default boot-screens/vesamenu.c32</source>. Le chemin DOIT être relatif afin de fonctionner avec toute les architectures.

Provisionnement de l'image de fond du menu <source lang="bash"> wget 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/ </source>

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+).

<source lang="bash">

  1. 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 </source>

vim /srv/tftp/pxelinux.cfg/default

<source lang="bash">

  1. Méthode via le programme lui même (plus direct et rapide)

LABEL Memtest86+ MENU LABEL memtest86+ KERNEL mt86plus APPEND onepass

  1. La syntaxe des arguments est visible dans un fichier texte dans l'ISO d'Ubuntu
  1. 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 </source>

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