Serveur PXE UEFI

De Wiki doc

Version datée du 12 novembre 2019 à 00:09 par Ycharbi (discussion | contributions) (Correction de balises codes manquantes + ajout de la section "Provisionnement des systèmes distants".)

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 cp /tmp/syslinux-6.04-pre1/efi32/com32/libutil/libutil.c32 cp /tmp/syslinux-6.04-pre1/efi32/com32/lib/libcom32.c32 cp /tmp/syslinux-6.04-pre1/efi32/com32/elflink/ldlinux/ldlinux.e32 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 cp /tmp/syslinux-6.04-pre1/efi64/com32/libutil/libutil.c32 cp /tmp/syslinux-6.04-pre1/efi64/com32/lib/libcom32.c32 cp /tmp/syslinux-6.04-pre1/efi64/com32/elflink/ldlinux/ldlinux.e64 mkdir /srv/tftp/efi64/boot-screens/ cp /tmp/syslinux-6.04-pre1/efi32/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.

<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. Je démarrare sur un écran noir en mode BIOS et il faut la version 8 pour démarrer en UEFI (elle ne gère pas le BIOS). J'ai suivit cette documentation et toute les autres sont identiques...

Le célèbre testeur de RAM peut être démarré depuis le réseau. Il suffit de télécharger son binaire et d'ajouter une entrée correspondante dans le menu.

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

Sources