Création d'un serveur PXE

Cette documentation est basée sur un sujet de travaux pratiques rédigé par Jean-Philippe Zimmer (IUT Dijon-Auxerre -- Département Réseaux et Télécommunications -- Université de Bourgogne) en 2011.

Procédure validée sur Debian 8.

Présentation du projet

Nous souhaitons démarrer un système Debian par le réseau. Pour cela, nous utilisons la technologie PXE (Pre-boot eXecution Environment) qui permet à un ordinateur de démarrer depuis le réseau en récupérant un système d’exploitation se trouvant sur sur un serveur.

Nous installerons deux systèmes Debian : le serveur et le client démarré depuis le réseau.

Installation et configuration du client

Sur le client, installer une Debian à votre convenance.

Pour une connexion automatique du système, modifier le fichier /etc/systemd/system/getty.target.wants/getty@tty1.service et ajouter l'option -a <USER> à la ligne ExecStart.

Sur le serveur, créer un dossier accueillant tous les fichiers du système client (prévoir au moins 3 Go). Nous utiliserons ici le dossier /var/netsystem.

mkdir /var/netsystem

Copiez dans ce dossier l'intégralité de l'arborescence du système client sauf les fichiers initrd.img et vmlinuz et les dossiers lost+found, mnt, proc, run, sys et tmp dans le dossier /var/netsystem. Pour cela, arrêtez le système client puis déconnectez le disque dur et connectez le au serveur. Lancez et montez la partition système et copiez en utilisant Midnight Commander par exemple.

Sur le serveur, créez les dossiers mnt, proc, run, sys et tmp et ajoutez les droits en lecture pour tous sur /var/netsystem :

cd /var/netsystem
mkdir mnt proc run sys tmp
chmod -R a+r /var/netsystem

Installation et configuration du serveur

Installez les paquets suivants :

apt-get install isc-dhcp-server tftpd-hpa nfs-kernel-server syslinux pxelinux

Configurez l'adresse IP du serveur (ici : 192.168.0.100) en éditant le fichier /etc/network/interfaces :

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 192.168.0.100
        netmask 255.255.255.0
        gateway 192.168.0.1

Configuration du serveur DHCP

Dans notre cas, nous travaillerons sur un réseau 192.168.0.0/24. Éditez le fichier /etc/dhcp/dhcpd.conf :

#
# Sample configuration file for ISC dhcpd for Debian
#
#

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

default-lease-time 43200;
max-lease-time 86400;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option domain-name-servers 192.168.0.1;

allow bootp;
allow booting;
next-server 192.168.0.100;
filename "pxelinux.0";

subnet 192.168.0.0 netmask 255.255.255.0 {
   option routers 192.168.0.1;
   option subnet-mask 255.255.255.0;
   option broadcast-address 192.168.0.255;
   range 192.168.0.10 192.168.0.90;
}

Redémarrez le service :

service isc-dhcp-server restart

Configuration TFTP

Éditez le fichier /etc/default/tftpd-hpa :

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

RUN_DAEMON="yes"

Création du menu au démarrage

Copiez le fichier /usr/lib/PXELINUX/pxelinux.0 sous /srv/tftp/ et créez le dossier /srv/tftp/pxelinux.cfg :

cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/
mkdir /srv/tftp/pxelinux.cfg

Copiez le fichier /usr/lib/syslinux/modules/bios/vesamenu.c32 vers /srv/tftp/ :

cp /usr/lib/syslinux/modules/bios/vesamenu.c32 /srv/tftp/

Éditez le fichier /srv/tftp/pxelinux.cfg/default :

DEFAULT vesamenu.c32
TIMEOUT 100
MENU TITLE Menu de demarrage
ALLOWOPTIONS 0
MENU AUTOBOOT Demarrage automatique dans # seconde{,s}. 

LABEL NETSYSTEM
	KERNEL netsystem/vmlinuz
	APPEND root=/dev/nfs nfsroot=192.168.0.100:/var/netsystem ip=dhcp initrd=netsystem/initrd.img rw --
	TEXT HELP
	Amorcer le systeme en reseau. 
	ENDTEXT

Personnaliser le menu

Le menu par défaut n'est pas très flatteur à l'œil. Nous allons le personnaliser et pour cela nous allons agir sur les paramètres suivants :

MENU TITLE
Change le titre du menu.
MENU TITLE Mon menu de demarrage PXE
MENU BACKGROUND
Change le fond d'écran du menu. Cette image doit avoir la résolution égale à celle de l'écran (recommandé : 640 × 480). L'image doit avoir 65536 couleurs. Pour convertir une image, utilisez la commande :
convert -depth 16 -colors 65536 /tmp/background.jpg /srv/tftp/background.jpg
MENU BACKGROUND background.jpg
MENU COLOR
Change la couleur des éléments du menu. Pour plus de détails, se reporter ici : Documentation MENU COLOR Syslinux.
MENU COLOR TITLE 0 #FFD64937 #00000000 std
MENU SEPARATOR
Ajouter un séparateur au menu.
MENU LABEL
Change l'étiquette sur une entrée du menu.
MENU LABEL Debian 8 Jessie - Installeur 64 bits
MENU LABEL
Change l'étiquette sur une entrée du menu.
MENU LABEL Debian 8 Jessie - Installeur 64 bits
TEXT HELP
Ajoute une description sur une entrée du menu.
TEXT HELP
        Installation de Debian 8 Jessie a partir du reseau. 
        ENDTEXT
TIMEOUT
Definit la durée en dixième de secondes d'affichage du menu avant le démarrage de l'option par défaut.
TIMEOUT 100

La documentation complète est disponible ici : http://www.syslinux.org/wiki/index.php?title=Menu

Ajouter un option de démarrage sur le disque local

Copiez le fichier /usr/lib/syslinux/modules/bios/chain.c32 vers /srv/tftp/ :

cp /usr/lib/syslinux/modules/bios/chain.c32 /srv/tftp/

Ajoutez les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL LOCALDISK
        MENU LABEL Demarrer le disque local
        KERNEL chain.c32
        APPEND hd0

Ajouter un option de redémarrage

Copiez le fichier /usr/lib/syslinux/modules/bios/reboot.c32 vers /srv/tftp/ :

cp /usr/lib/syslinux/modules/bios/reboot.c32 /srv/tftp/

Ajoutez les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL REBOOT
        MENU LABEL Redemarrer le systeme
        KERNEL reboot.c32

Ajouter un option de démarrage sur Memtest86+

Memtest86+ est un logiciel conçu pour réaliser des tests exhaustifs de la mémoire vive d'un ordinateur PC, afin de détecter d'éventuelles erreurs ou défectuosités.

Source : Wikipedia

Téléchargez Memtest86+ :

wget -O /srv/tftp/memtest http://www.memtest.org/download/5.01/memtest86+-5.01.bin

Ajoutez les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL MEMTEST
        MENU LABEL Memtest86+
        KERNEL memtest
        APPEND -e

Ajouter un option de démarrage sur l'installeur Debian 8

Téléchargez l'image netboot Debian :

wget -O /tmp/netboot-debian.tar.gz http://ftp.nl.debian.org/debian/dists/jessie/main/installer-amd64/current/images/netboot/netboot.tar.gz

Décompressez l'archive téléchargée :

tar -C /tmp -zxvf /tmp/netboot-debian.tar.gz
Créez le dossier /srv/tftp/debian-8 et copiez-y les fichiers initrd.gz et linux de l'archive décompressée.
mkdir /srv/tftp/debian-8
cp /tmp/debian-installer/amd64/initrd.gz /tmp/debian-installer/amd64/linux /srv/tftp/debian-8/

Ajoutez les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL DEBIAN
        MENU LABEL Debian 8 Jessie - Installeur 64 bits
        KERNEL debian-8/linux
        APPEND VGA=788 initrd=debian-8/initrd.gz --- quiet

Ajouter un option de démarrage sur l'installeur Ubuntu

Nous allons utiliser ici le mini ISO qui permet d'installer Ubuntu et ses variantes à partir de la même image disque et du réseau. Pour cela, nous allons la télécharger :

wget -O /tmp/netboot-ubuntu.tar.gz http://archive.ubuntu.com/ubuntu/dists/wily/main/installer-amd64/current/images/netboot/netboot.tar.gz

Décompressez l'archive téléchargée :

tar -C /tmp -zxvf /tmp/netboot-ubuntu.tar.gz

Créez le dossier /srv/tftp/ubuntu-1510 et copiez-y les fichiers initrd.gz et linux de l'archive décompressée.

mkdir /srv/tftp/ubuntu-1510
cp /tmp/ubuntu-installer/amd64/initrd.gz /tmp/debian-installer/amd64/linux /srv/tftp/ubuntu-1510/

Ajoutez les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL UBUNTU
        MENU LABEL Ubuntu 15.10 Wily - Installeur 64 bits
        KERNEL ubuntu-1510/linux
        APPEND VGA=788 initrd=ubuntu-1510/initrd.gz --- quiet

Ajouter un option de démarrage sur un autre serveur PXE

Copiez le fichier /usr/lib/syslinux/modules/bios/pxechn.c32 vers /srv/tftp/ :

cp /usr/lib/syslinux/modules/bios/pxechn.c32 /srv/tftp/

Ajoutez les lignes suivantes au fichier /srv/tftp/pxelinux.cfg/default :

LABEL NEPTUNE
        MENU LABEL Basculer sur le menu PXE serveur Neptune
        KERNEL pxechn.c32
        APPEND 192.168.0.101::pxelinux.0

Exemple de configuration complète

Voici un exemple de configuration complète :

Screenshot PXE

Voici le fichier de configuration /srv/tftp/pxelinux.cfg/default associé :

DEFAULT vesamenu.c32
TIMEOUT 100
ONTIMEOUT LOCALDISK
MENU TITLE Menu de demarrage PXE
MENU BACKGROUND splash-pxe.jpg
MENU COLOR TITLE 0 #FFD64937 #00000000 std
MENU COLOR SEL 0 #E0000000 #FFD64937 all
MENU COLOR BORDER 0 #00000000 #00000000 none
MENU VSHIFT 2
ALLOWOPTIONS 0
MENU AUTOBOOT Demarrage automatique du disque local dans # seconde{,s}. 

LABEL LOCALDISK
        MENU LABEL Demarrer le disque local
        KERNEL chain.c32
        APPEND hd0
        TEXT HELP
        Amorcer le disque dur local. 
        ENDTEXT

LABEL REBOOT
        MENU LABEL Redemarrer le systeme
        KERNEL reboot.c32
        TEXT HELP
        Redemarrer l'ordinateur. 
        ENDTEXT

LABEL MEMTEST
        MENU LABEL Memtest86+
        KERNEL memtest
        APPEND -e
        TEXT HELP
        Effectuer un test de memoire. 
        ENDTEXT

MENU SEPARATOR

LABEL NETSYSTEM
        MENU LABEL Demarrer le systeme en reseau
        KERNEL netsystem/vmlinuz
        APPEND root=/dev/nfs nfsroot=192.168.0.100:/var/netsystem ip=dhcp initrd=netsystem/initrd.img rw --
        TEXT HELP
        Amorcer le systeme de maintenance et les outils d'administration. 
        ENDTEXT

LABEL DEBIAN
        MENU LABEL Debian 8 Jessie - Installeur 64 bits
        KERNEL debian-8/linux
        APPEND VGA=788 initrd=debian-8/initrd.gz --- quiet
        TEXT HELP
        Installation de Debian 8 Jessie a partir du reseau. 
        ENDTEXT


LABEL UBUNTU
        MENU LABEL Ubuntu 15.10 Wily - Installeur 64 bits
        KERNEL ubuntu-1510/linux
        APPEND VGA=788 initrd=ubuntu-1510/initrd.gz --- quiet
        TEXT HELP
        Installation d'Ubuntu 15.10 a partir du reseau. 
        ENDTEXT

MENU SEPARATOR

LABEL NEPTUNE
        MENU LABEL Basculer sur le menu PXE serveur Neptune
        KERNEL pxechn.c32
        APPEND 192.168.0.101::pxelinux.0
        TEXT HELP
        Demarrer sur le serveur Neptune
        ENDTEXT

Le fond d'écran est téléchargeable ici : https://antoinepernot.fr/data/splash-pxe.jpg

Création du noyau amorçable

Copiez le noyau présent sous /boot et créer le lien symbolique vmlinuz adéquat :

cp /boot/vmlinuz-`uname -r` /srv/tftp/
ln -s /srv/tftp/vmlinuz-`uname -r` /srv/tftp/vmlinuz

Copiez le dossier /etc/initramfs-tools/ en /etc/initramfs-pxe :

cp -Rp /etc/initramfs-tools /etc/initramfs-pxe

Dans le fichier /etc/initramfs-pxe/initramfs.conf, modifiez les lignes suivantes :

BOOT=local
DEVICE=

en

BOOT=nfs
DEVICE=eth0

Sous le dossier /srv/tftp, exécuter :

cd /srv/tftp
mkinitramfs -d /etc/initramfs-pxe -o /srv/tftp/initrd.img-`uname -r` `uname -r`
ln -s /srv/tftp/initrd.img-`uname -r` /srv/tftp/initrd.img

Configuration du serveur NFS

Ajoutez la ligne suivante dans le fichier /etc/exports :

/var/netsystem	*(rw,sync,all_squash,anonuid=0,anongid=0)

Lancez le serveur NFS :

service nfs-kernel-server start

Configuration du système réseau

Dans le dossier /var/netsystem, modifiez le fichier etc/fstab comme suit :

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
# / was on /dev/sda1 during installation
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/nfs        /       nfs     defaults        1       1
none    /tmp    tmpfs   defaults        0       0
none    /var/tmp        tmpfs   defaults        0       0
none    /var/log        tmpfs   defaults        0       0

Dans le fichier etc/network/interfaces, commentez toutes les interfaces à part l'interface lo.

Lancez le client PXE et testez.