Installer et configurer PXE

Ce dispositif est un assemblage de deux services : DHCP et TFTP. Ainsi avant que le système démarre sur le disque, il est possible de démarrer sur le réseau grâce à une modification d'une option dans le BIOS (son nom diffère en fonction de sa version et de sa marque). En d'autre terme, l'amorçage PXE (sigle de Pre-boot eXecution Environment) permet à une station de travail de démarrer depuis le réseau en récupérant une image de système d'exploitation qui se trouve sur un serveur. Il permet également d'installer de manière automatique et à distance des serveurs sous divers OS.

Voici un exemple du mode de fonctionnement :

Admettons que le “PXE Server” ait l'IP 192.168.0.211, et les clients 1 et 2 aient une IP entre 192.168.0.10 et 192.168.0.200. Techniquement voici les étapes au cours d'un boot :

  • Sélection du démarrage sur le réseau.
  • le poste client obtient une adresse IP, 192.168.0.10 par exemple.
  • Il télécharge via TFTP les données permettant d'afficher un menu qui servira à sélectionner l'OS que l'on veut installer.

Rien de plus!

Toutes les connexions se feront via UDP : port 67 pour DHCP et 69 pour TFTP.

DHCP

Attention, il faut qu'il n'y ait qu'un seul serveur DHCP! En général, les routeurs en sont équipé du coup, il faudra au préalable le désactiver.

Dans un premier temps, installons le service DHCP qui va permettre de fournir à la machine cliente une IP pour communiquer avec le serveur PXE.

apt-get install isc-dhcp-server

On déclare le réseau logique ainsi que l'hôte qui contiendra toujours à la même adresse IP. Prenez garde à ce que ces lignes soient adapté à vos besoins :

nano /etc/dhcp/dhcpd.conf

Il doit contenir au minimum ces informations :

dhcpd.conf
ddns-update-style none;
option domain-name "mon-domaine.fr";
max-lease-time 7200;
log-facility local7;
allow booting;
 
# On définit la place d'adresse de notre réseau local 192.168.0.0/24 :
subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.100 192.168.0.200;
  option broadcast-address 192.168.0.255;
  option routers 192.168.0.254;
  option domain-name-servers 192.168.0.254;
  filename "pxelinux.0";
}
 
# On définit l'adresse du serveur délivrant les fichiers ISO/images
group {
  next-server 192.168.0.211;
  host srv-pxe {
    filename "pxelinux.0";
  }
}

Enfin on prend en compte ces modifications :

/etc/init.d/isc-dhcp-server restart

On peut suivre les demandes d'IPs via les logs :

tail -f DHCP /var/log/syslog

TFTP

Dans un second temps, on met en place le service TFTP qui va permettre au client de récupérer les données avec simplicité vu que c'est un protocole supporté par le BIOS!

Installons les dépendances :

apt-get install tftpd-hpa

Ainsi il nous reste à placer les images système dans le dossier /srv/tftp/. Téléchargeons l'image de démarrage de Debian Jessie dans le dossier respectif :

cd /srv/tftp/
wget http://cdn-fastly.deb.debian.org/debian/dists/jessie/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar xf netboot.tar.gz

On vérifie que le service est bien lancé :

/etc/init.d/tftpd-hpa restart

Il reste plus qu'a ce que la machine cliente démarre sur le réseau et le tour est joué!

Vérifier son fonctionnement

Il y a un moyen rapide d'approuver qu'il fonctionne bien. Après avoir récupéré une IP via le DHCP que nous venons d'installer, installons le paquet suivant :

apt-get install tftp

Puis on se connecte au serveur TFTP :

tftp 192.168.0.211

Mettons en mode verbeux les échanges et téléchargeons par exemple une ISO :

tftp> verbose
tftp> get lubuntu.iso

A ce moment là on peut voir ce type de message qui indique qu'il a bien télécharger l'ISO :

getting from 192.168.0.211:lubuntu.iso to lubuntu.iso [netascii]

Et dès que l'on quitte l'interface, on peut voir que le fichier est bien présent.

Je ne suis pas allé plus loin mais voici de bonnes documentations pour installer un système depuis un ISO :

Installation automatisé sur CentOS

Avec l'utilitaire Kickstart, il est possible de personnaliser une installation automatisée grâce à la lecture d'un document accessible depuis un serveur web par exemple.

Voici à quoi peux ressembler le fichier :

Cliquez pour afficher ⇲

Cliquez pour masquer ⇱

install_auto.cfg
  #version=DEVEL
  # System authorization information
auth --enableshadow --enablemd5
  # Installation des requis et des mises à jours : 
install
  # Utilise l'installation réseau :
url --url="http://mirror.centos.org/centos/7/os/x86_64/"
repo --name="koji-override-0" --baseurl=http://mirror.centos.org/centos/7/extras/x86_64/
repo --name="koji-override-1" --baseurl=http://mirror.centos.org/centos/7/updates/x86_64/
  # Utiliser l'installation en mode text :
text
  # Configuration du parefeu :
firewall --disabled
firstboot --disable
ignoredisk --only-use=vda
  # configuration de la langue et du clavier :
keyboard --vckeymap=fr --xlayouts='fr-Latin9'
lang fr_FR.UTF-8
  # Information sur le réseau :
network  --hostname=localhost.localdomain
network --bootproto=static --ip=10.0.0.45 --netmask=255.255.255.0 --gateway=10.0.0.254 --nameserver 8.8.8.8 --device=eth0
  # Reboot apres l'installation :
reboot
  # mdp root :
rootpw --plaintext A$rall54
  # Ne pas configurer la fenere X :
skipx
  # timezone du système :
timezone UTC --isUtc Europe/Paris
 
  # Creation de l'utilisateur asrall :
user --name=asrall --password=A$rall54
  # Génération de la paire de clé :
mkdir /home/asrall/.ssh
chown asrall /home/asrall/.ssh
sudo -u asrall /usr/bin/ssh-keygen -q -t rsa -f /home/asrall/.ssh/id_rsa -C '' -N ''
 
  # Configuration du System bootloader
bootloader --append="no_timer_check console=tty0 console=ttyS0,115200 net.ifnames=0 biosdevname=0 crashkernel=auto" --location=mbr --boot-drive=vda
  # Suppression du Master Boot Record
zerombr
  # formatage du disque :
clearpart --all --drives=vda
 
  # Partitionnement du disque :
part swap --fstype swap --size=512
part / --fstype ext3 --size=1024 --asprimary
part lvm --size=20000  --fstype ext3
volgroup VG0 lvm
logvol /var --vgname=VG0  --size=10000     --name=lv_var
logvol /root --vgname=VG0  --size=8000     --name=lv_root
 
%post
 
  # sudo de vagrant :
echo "%vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/vagrant
 
  # Configure grub pour attendre 1 second au boot :
sed -i 's/^GRUB_TIMEOUT=[0-9]\+$/GRUB_TIMEOUT=1/' /etc/default/grub && grub2-mkconfig -o /boot/grub2/grub.cfg
 
  # Blacklist le module du lecteur de disquette : 
echo blacklist floppy > /etc/modprobe.d/nofloppy.conf
chcon -u system_u -r object_r -t modules_conf_t /etc/modprobe.d/nofloppy.conf
  # There's no floppy controller, but probing for it generates timeouts
echo 'omit_drivers+=" floppy "' > nofloppy.conf
popd
 
  # Rerun dracut for the installed kernel (not the running kernel):
KERNEL_VERSION=$(rpm -q kernel --qf '%{version}-%{release}.%{arch}\n')
dracut -f /boot/initramfs-${KERNEL_VERSION}.img ${KERNEL_VERSION}
 
%end
 
  # Selection des paquets de base :
%packages
@core
@base
#screen
java-1.8.0-openjdk
httpd.x86_64
mariadb-server.x86_64
%end
 
%addon com_redhat_kdump --enable --reserve-mb='auto'
 
%end

Admettons qu'il soit accessible depuis l'URL : http://mon-serveur.com/install_auto.cfg

Alors il sera possible de le récupérer lors de l’exécution d'une commande permettant de le récupérer en ligne. En effet, lors du démarrage d'un système, on voit appaire rapidement ce type d'interface GRUB :

Il suffira alors de taper sur <TAB> pour éditer la commande permettant de démarrer le système comme ceci :

vmlinuz ks=http://192.168.0.211/install_auto.cfg initrd=initrd.img

Ensuite il faudra attendre pendant plusieurs minutes pour qu'une fois le système installé, il vous rendra la main.

Alternative