====== 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_avec_kvm|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_avec_kvm#configurer_les_guests|Virtualiser un système]])
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 [[preseed_debian_install|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