Table of Contents

Un serveur PXE pour une installation automatisée par le réseau

PXE est une option d'amorçage permettant à un ordinateur de charger son système d'exploitation à partir du réseau (Les autres options d'amorçage sont le disque dur ou un média CD/DVD ou USB).

Le système d'exploitation est délivré par un serveur PXE.

Cette technique peut être utilisée pour amorcer l'installation simultanée d'un grand nombre de stations à partir d'un média unique (Le serveur PXE).

Elle peut également être utilisée pour amorcer des clients légers (des ordinateurs sans disque dur)

Cette page documente la mise en place d'un serveur PXE dans le but d'une installation de système d'exploitation par le réseau.

La gestion de clients léger fera l'objet d'un autre document.

Préparation de l'environnement

Le serveur PXE sera installé sur une machine virtuelle. La procédure de création d'une machine virtuelle est détaillée sur Virtualiser un système.

Sur l'hôte

La machine virtuelle sera nommée ici pxe-server et hébergera un serveur DHCP et TFTP.

Sur l'hôte on crée un bridge réseau pxe-br0 sur lequel vont se brancher les machines virtuelles concernées par cette procédure créant ainsi un réseau virtuel.

La création du bridge réseau se fait avec la commande :

sudo brctl addbr pxe-br0

On attribute une addresse IP au bridge avec :

sudo ip a add 192.168.111.1/24 dev pxe-br0

On édite la définition de la machine pxe-server pour ajouter une nouvelle interface réseau connectée au bridge qu'on vient de créer :

(La modification de la définition d'une machine virtuelle est documentée ici: Virtualiser un système)

<interface type='bridge'>
  <source bridge='pxe-br0'/>
  <model type='virtio'/>
</interface>

Les machines connectées à ce birdge ne peuvent accéder à internet que si le système hôte permet la redirection du traffic. On peut s'en assurer avec la commande suivante sur le système hôte :

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Le système hôte doit également pouvoir effectuer une traduction (NAT) des paquets émanants du réseau virtuel. La commande suivante exécutée sur l'hôte active cette fonctionnalité.

sudo iptables -t nat -A POSTROUTING -s 192.168.111.0/24 ! -d 192.168.111.0/24 -j MASQUERADE

Sur la VM

La VM pxe-server sera maintenant dotée d'une nouvelle interface réseau qu'il faudra paramétrer en IP static dans le réseau 192.168.111.0/24.

On donnera au serveur une adresse 192.168.111.2 grâce à la configuration suivante dans /etc/network/interface.

auto ens10
iface ens10 inet static
   address 192.168.111.2
   netmask 255.255.255.0
   gateway 192.168.111.1

Paramétrage du serveur 'DHCP'

Le serveur DHCP s'installe avec la commande suivante :

sudo apt-get install isc-dhcp-server

Le serveur DHCP échouera probablement lors de son premier lancement. Nous devons l'informer de l'interface réseau sur laquelle il écoutera les requêtes DHCP.

Cette configuration se fait dans le fichier /etc/default/isc-dhcp-server en indiquant le nom de l'interface à INTERFACESv4.

INTERFACESv4="ens10"

Vient ensuite la configuration du réseau que le serveur DHCP gérera.

La configuration de isc-dhcp-server se fait dans le fichier /etc/dhcp/dhcpd.conf.

Le bloc de configuration suivant déclare un sous réseau et fournit aux clients dhcp des informations de paramétrages supplémentaires.

subnet 192.168.111.0 netmask 255.255.255.0 {             // le subnet
  range dynamic-bootp 192.168.111.5 192.168.111.100;     // portée des adresses distribuées
  authoritative;
  allow unknown-clients;
  option domain-name-servers 8.8.8.8, 8.8.4.4;
  option routers 192.168.111.1;                          // adresse du routeur ici la machine hôte
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.111.255;
  next-server 192.168.111.2;                             // L'adresse du serveur TFTP (cette même machine)
  filename "pxelinux.0";                                 // le chemin au fichier d'amorçage de l'installation
                                                         // réseau
  default-lease-time 21600;
  max-lease-time 43200 ;
}

Si la configuration est correcte la commande suivante ne devrait pas retourner d'erreurs.

sudo systemctl restart isc-dhcp-server

Le serveur DHCP sert à connecter les clients au réseau en leur attribuant une adresse IP.

Le serveur DHCP sert également à fournir aux clients qui souhaitent faire un démarrage par le réseau des informations sur l'emplacement du fichier d'amorçage.

Le fichier d'amorçage doit être servi par un serveur tftp

Paramétrage du serveur 'TFTP'

Sur la même machine pxe-server on installe le serveur tftp avec la commande suivante :

sudo apt-get install tftp tftpd-hpa

La configuration du serveur tftp se fait dans le fichier /etc/default/tftpd-hpa.

La directive TFTP_DIRECTORY indique où doit se trouver le contenu que tftpd servira.

TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create --listen --verbose"

Le dossier /srv/tftp doit être accessible sans droits d'utilisations spécifiques.

sudo chmod -R 777 /srv/tftp
sudo chown -R nobody:nogroup /srv/tftp

Le démarrage du serveur tftp ne doit pas générer d'erreurs.

sudo systemctl restart tftpd-hpa

Récupération et mise en place de l'image d'amorçage

Une image d'amorçage est disponible au téléchargement sur les serveurs de la distribution debian.

wget "http://ftp.debian.org/debian/dists/buster/main/installer-amd64/current/images/netboot/netboot.tar.gz"

L'archive sera décompressée dans le dossier servi par le serveur tftp avec la commande suivante :

tar xzf netboot.tar.gz -C /srv/tftp

Le contenu du dossier devrait ressemblera à ça :

$ ll /srv/tftp
total 8,0K
drwxrwxr-x 3 nobody nogroup 4,0K nov.   7 12:10 debian-installer
lrwxrwxrwx 1 nobody nogroup   47 nov.   7 12:10 ldlinux.c32 -> debian-installer/amd64/boot-screens/ldlinux.c32
lrwxrwxrwx 1 nobody nogroup   33 nov.   7 12:10 pxelinux.0 -> debian-installer/amd64/pxelinux.0
lrwxrwxrwx 1 nobody nogroup   35 nov.   7 12:10 pxelinux.cfg -> debian-installer/amd64/pxelinux.cfg
-rw-rw-r-- 1 nobody nogroup   62 nov.   7 12:10 version.info

Installation par le réseau

L'installation par réseau peut être testée avec une machine virtuelle avec la commande suivante :

sudo virt-install \
       --pxe \
       --disk size=8,device=disk,bus=virtio \
       --virt-type kvm \
       --os-type linux \
       --name=guest \
       --ram=512 \
       --vcpus=1  \
       --os-variant generic   \
       --graphics=vnc   \
       --network=bridge:pxe-br0

Automatiser l'installation avec un 'preseed.cfg'

Un fichier preseed.cfg est une fichier de préconfiguration qui permet une installation automatisée du système d'exploitation. (voir ici)

On peut modifier le comportement de l'installateur en lui fournissant le chemin du fichier de préconfiguration à charger.

Un fichier preseed.cfg est placé dans le dossier du serveur tftp

On modifie le fichier /srv/tftp/debian-installer/amd64/boot-screens/txt.cfg en passant les paramètres supplémentaires suivants au kernel :

auto=true priority=critical url=tftp://192.168.111.2/preseed.cfg

Ce qui donnera un fichier txt.cfg qui ressemblera à ça :

default install
 
label install
    menu label ^Install
    kernel debian-installer/amd64/linux
    append auto=true priority=critical url=tftp://192.168.111.2/preseed.cfg \
              vga=788 initrd=debian-installer/amd64/initrd.gz --- quiet

La confirmation du début de l'installation peut également être rendue automatique en modifiant le temps d'attente au premier écran avec la commande suivante :

sed -i 's/^timeout.*$/timeout 1/' \
    /srv/tftp/debian-installer/amd64/boot-screens/{syslinux.cfg,prompt.cfg}

Un exemple de fichier preseed.cfg orienté installation réseau ressemblerait à ce qui suit :

# do we need to use mirror
d-i	apt-setup/use_mirror	boolean	true
apt-mirror-setup	apt-setup/no_mirror	boolean	false
 
d-i partman/early_command string debconf-set grub-installer/bootdev "$(list-devices disk | head -n1)"
 
# if we need mirror
d-i mirror/protocol string http
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
d-i mirror/suite string stretch
d-i mirror/udeb/suite string stretch
 
# localization
d-i debian-installer/locale string fr_FR
d-i keyboard-configuration/xkb-keymap select fr(latin9)
 
# hostname/domain, network interface
d-i netcfg/choose_interface select auto
d-i netcfg/link_wait_timeout string 5
 
d-i netcfg/get_hostname string dinopc
d-i netcfg/hostname string dinopc
 
d-i netcfg/get_domain string
d-i netcfg/get_nameservers string
 
d-i netcfg/wireless_wep string
d-i hw-detect/load_firmware boolean true
 
# accounts
d-i passwd/root-login boolean false
d-i passwd/user-fullname string dino
d-i passwd/username string dino
d-i passwd/user-password password dingo
d-i passwd/user-password-again password dingo
 
# time
d-i clock-setup/utc boolean true
d-i time/zone string Africa/Algiers
d-i clock-setup/ntp boolean true
 
# partitioning
d-i partman-auto/init_automatically_partition select biggest_free
d-i partman-auto/method string regular
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/mount_style select uuid
 
#apt settings
d-i base-installer/install-recommends boolean true
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true
d-i apt-setup/services-select multiselect security, updates
d-i apt-setup/security_host string security.debian.org
d-i debian-installer/allow_unauthenticated boolean true
apt-cdrom-setup	apt-setup/cdrom/set-double	boolean	false
apt-cdrom-setup	apt-setup/cdrom/set-first	boolean	false
apt-cdrom-setup	apt-setup/cdrom/set-next	boolean	false
 
# packages to install
tasksel tasksel/first multiselect standard
d-i pkgsel/include string
d-i pkgsel/upgrade select none
 
popularity-contest popularity-contest/participate boolean false
 
# boot loader
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
 
# late install commands
d-i preseed/late_command string \
    in-target adduser sysadm --disabled-password --shell /bin/bash --home /var/sysadm --gecos ""; \
    true;
 
# reboot
d-i finish-install/reboot_in_progress note