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