Ce billet est la suite du billet Mise en place d'un serveur IPXE - partie 1 qui explique le principe du serveur IPXE et l'organisation du système que nous avons mis en place. Je vais maintenant rentrer dans la partie pratique : l'installation et la configuration du serveur.

Attention ! Le serveur IPXE n'a jamais été finalisé. Je laisse ce billet publié. Ca pourra toujours servir à quelqu'un.


Installation des paquets nécessaires :

apt-get install dnsmasq lighttpd samba nfs-kernel-server

Nous utilisons lighttpd comme serveur HTTP car il est léger et simple à mettre en place.


Réglage de l'adresse IP du serveur

Le serveur utilise une adresse IP fixe pour pouvoir être adressé par les machines sur le réseau. Ce réglage peut soit être effectué sur l'interface du routeur, soit directement sur le serveur. Dans ce dernier, bien choisir une adresse IP en dehors de la plage DHCP pour éviter une double attribution.

Pour le réglage sur le serveur, éditer le fichier /etc/networks/interfaces et ajouter les lignes suivantes :

auto eth0
iface eth0 inet static
    address 192.168.0.200
    netmask 255.255.255.0
    gateway 192.168.0.1
    dns-nameservers 9.9.9.9

Le nom de l'interface réseau (ici eth0) est à adapter en fonction de votre machine. De même qu'il vous faudra peut-être adapter l'adresse IP ou celle du routeur (qui est parfois en 192.168.0.254).


Création de l'arborescence :

L'arborescence globale est présentée dans le premier billet. Je ne détaille ici que les commandes pour la créer.

  • Création des répertoires principaux.

mkdir -p /srv/tftp
mkdir -p /srv/samba
mkdir -p /srv/http

  • Création des répertoires accueillant les distributions GNU/Linux et wimboot.

mkdir -p /srv/http/archlinux
mkdir -p /srv/http/debian/9/{32-bit,64-bit}
mkdir -p /srv/http/debian/8/{32-bit,64-bit}
mkdir -p /srv/http/emmabuntus/3/{32-bit,64-bit}
mkdir -p /srv/http/emmabuntus/de2/{32-bit,64-bit}
mkdir -p /srv/http/linux_mint/cinammon/{32-bit,64-bit}
mkdir -p /srv/http/linux_mint/MATE/{32-bit,64-bit}
mkdir -p /srv/http/linux_mint/LXDE/{32-bit,64-bit}
mkdir -p /srv/http/linux_mint/KDE/{32-bit,64-bit}
mkdir -p /srv/http/mageia/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/UNITY/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/GNOME/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/KDE/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/LXDE/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/XFCE/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/MATE/{32-bit,64-bit}
mkdir -p /srv/http/windows


Préparation des fichiers d'amorce :

1ère possibilité

Nous utilisons les fichiers d'amorce IPXE disponibles dans le paquet ipxe lorsqu'ils sont disponibles.

ln -s /usr/lib/ipxe/undionly.kpxe /srv/tftp/
ln -s /usr/lib/ipxe/ipxe.efi /srv/tftp/ipxe_64-bit.efi

Les fichiers d'amorce manquants doivent être compiler depuis les sources. Pour cela, il faut récupérer les sources, en clonant le dépôt git par exemple :

git clone https://github.com/ipxe/ipxe

Puis il faut se rendre dans l'arborescence et lancer la compilation :

cd ipxe/src
make bin-i386-efi/ipxe.efi

On peut ensuite récupérer le fichier généré :

cp bin/ipxe.efi /srv/tftp/ipxe_32-bit.efi

Sur la page de document de ipxe suivante, vous trouverez la liste des plateformes et des drivers qu'il est possible de générer : http://ipxe.org/appnote/buildtargets.


2eme possibilité

Nous n'utilisons pas les fichiers d'amorce PXE fournis dans le package ipxe car il nous faut recompiler chaque fichier pour y intégrer un script IPXE. Ce dernier comporte simplement l'url de notre script IPXE principal.

Pour la compilation, il faut récupérer les sources, en clonant le dépôt git par exemple :

git clone https://github.com/ipxe/ipxe

Puis il faut se rendre dans l'arborescence et créer notre script IPXE qui sera intégré dans le fichier d'amorce :

cd ipxe/src
nano embed.ipxe

Contenu du fichier intégré :

#!ipxe
dhcp
chain http://192.168.0.200/master.ipxe

On peut ensuite lancer la compilation intégrant notre script...

make bin/undionly.kpxe EMBED=embed.ipxe

... et récupérer le fichier généré :

cp bin/ipxe.efi /srv/tftp/ipxe_32-bit.efi

Sur la page de document de ipxe suivante, vous trouverez la liste des plateformes et des drivers qu'il est possible de générer : http://ipxe.org/appnote/buildtargets. Par exemple, pour un fichier UEFI 64-bit, on lancera :

make bin-x86_64-efi/ipxe.efi EMBED=embed.ipxe


Configuration de dnsmasq :

La configuration se fait en modifiant le fichier /etc/dnsmasq.conf (par exemple avec nano)

nano /etc/dnsmasq.conf

Voici la configuration dnsmasq utilisée :

#===============================================================
# Configuration file for dnsmasq
#===============================================================
# Disable DNS Server (DNS already provide by the router)
port=0

# Enable DHCP logging
log-dhcp

# Respond to PXE requests for the specified network;
# run as DHCP proxy
dhcp-range=192.168.0.0,proxy,255.255.255.0
#If not running as a DHCP proxy (first IP, last IP, mask, bail duration)
#dhcp-range=192.168.0.100,192.168.0.150,255.255.255.0,12h

#Detect the client architecture
dhcp-match=set:x86PC, option:client-arch, 0 #BIOS
dhcp-match=set:UEFI32, option:client-arch, 6 #UEFI32
dhcp-match=set:UEFI64, option:client-arch, 7 #UEFI64
dhcp-match=set:UEFI64, option:client-arch, 9 #EBC ->use the same bootloader as UEFI64
#Detect IPXE request
dhcp-match=set:IPXE,175 # iPXE sends a 175 option

# Load different PXE boot image depending on client architecture (when not running as a proxy DHCP)
dhcp-boot=tag:x86PC, undionly.kpxe
dhcp-boot=tag:UEFI32, ipxe_32-bit.efi
dhcp-boot=tag:UEFI64, ipxe_64-bit.efi
#Serve the IPXE config file over HTTP
dhcp-boot=tag:IPXE, http://192.168.0.200/master.ipxe

# Load different PXE boot image depending on client architecture (when running as a proxy DHCP)
pxe-service=tag:x86PC, X86PC, "BIOS Network Boot", undionly.kpxe
pxe-service=tag:UEFI32, BC_EFI, "UEFI32 Network Boot", ipxe_32-bit.efi
pxe-service=tag:UEFI64, X86-64_EFI, "UEFI64 Network Boot", ipxe_64-bit.efi
#Serve the IPXE config file over HTTP
pxe-service=tag:IPXE, X86PC, http://192.168.0.200/master.ipxe

## Activate TFTP and set the root directory
enable-tftp
tftp-root=/srv/tftp


Désactivation du DNS de dnsmasq :

Cette modification permet d'empêcher dnsmasq de se définir comme serveur DNS pour les machines démarrées via PXE. Cela permet d'utiliser le routeur comme serveur DNS, comme d'habitude.

nano /etc/default/dnsmasq

DNSMASQ_EXCEPT=lo


Redémarrage du service dnsmasq :

On termine en redémarrant le service dnsmasq pour prendre en compte les modifications.

systemctl restart dnsmasq


Configuration du serveur NFS :

nano /etc/exports

Il faut ajouter la ligne suivante pour activer le partage sur le répertoire /srv/http/.

/srv/http 192.168.0.0/24(ro,async,no_root_squash,no_subtree_check)

Nous limitons l'accès au réseau local (192.168.0.0/24) et empêchons les modifications (paramètre ro pour read-only).

Application des modifications :

exportfs -rav


Configuration du serveur Samba :

nano /etc/samba/smbd.conf

Il faut ajouter un partage de fichier sur le répertoire que nous avons créé précédemment. Ce partage est configuré en lecture seul pour éviter toutes les modifications par la machine client et permet de se connecter sans se soucier du nom d'utilisateur et du mot de passe.

La configuration déjà présente dans le fichier smbd.conf n'est pas modifiée. Seule la partie suivante a été ajoutée :

\[pxe\]
    path = /srv/samba
    browsable = yes
    guest only = yes
    read only = yes
    public = yes

On applique les modifications en redémarrant le serveur Samba :

systemctl restart smbd


Création du fichier de configuration ipxe :

Nous avons configuré notre serveur pour qu'un client récupère automatiquement le fichier principal ipxe, nommé master.ipxe via le protocole HTTP. Il ne nous reste donc plus qu'à créer ce dernier et le placer dans le dossier /srv/http/.