Etape 1 : le serveur DHCP

L'installation est simple sous Debian :

# apt-get install dhcp3-server

Ce serveur contient les composants permettant un boot réseau. Il faut ensuite configurer ce serveur DHCP :

option domain-name "mydomain.com";
option domain-name-servers 10.0.1.1, 10.0.0.1;
default-lease-time 86400;
max-lease-time 604800;
authoritative;
allow bootp;
allow booting;

subnet 10.0.1.0 netmask 255.255.255.0 {
    range 10.0.1.200 10.0.1.220;
    option subnet-mask 255.255.255.0;
    option broadcast-address 10.0.1.255;
    option routers 10.0.1.1;
    next-server 10.0.1.1;                  # le nom du serveur TFTP

    filename "/tftpboot/pxelinux.0";       # le nom du fichier de boot (boot loader en fait)
}
host temphost {
    hardware ethernet xx:xx:xx:xx:xx:xx;   # l'adrese physique de la carte réseau de votre machine à installer
    fixed-address 10.0.1.199;              # l'adresse IP qui sera affecté à votre machine "temphost"
    option routers 10.0.1.1;               # le routeur sur le sous-réseau
    option host-name "temphost";           # le nom d'hôte qui lui sera attribué
    next-server 10.0.1.1;                  # le nom du serveur TFTP
    filename "/tftpboot/pxelinux.0";       # le nom du fichier de boot (boot loader en fait)
}

La première partie subnet permet d'installer des machines sur une plage de 200 à 220. Outre les directives classiques d'une configuration de DHCP (réseau, plage d'adresses dynamiques, les DNS, le routeur, les durées du bail, etc.) la partie la plus importante concerne les directives next-server et filename qui permettent d'indiquer où chercher le boot loader et comment il se nomme.

La deuxième partie pour le temphost (c'est ainsi que sera nommée la machine pour laquelle on veut faire l'installation par réseau) quant à elle est une alternative pour une seule machine et qui impose un boot sur une IP fixe. Par contre il faut ajouter la directive hardware ethernet et y mettre l'adresse MAC de la carte réseau (peu pratique si l'on souhaite installer différentes machines).

Remarques :

  1. Les lignes allow bootp et allow booting sont là pour mémoire mais si elle ne sont pas indiquer elles sont prévues par défaut.
  2. Il serait peut être plus judicieux de choisir une plage d'adresse correspondant à un découpage de sous-reséau (avec seulement une dizaine d'IP adressables) afin de pouvoir définir une autre sous-réseau en DHCP pour les autres machines. A tester s'il y a des amateurs...

Une fois la configuration terminée, recharger le serveur DHCP :
# /etc/init.d/dhcp restart

Etape 2 : le serveur TFTP

Sur Debian on installe Advanced TFTP :
# apt-get install atftpd
ajouter aussi le client pour tester le bon fonctionnement du serveur
# apt-get install atftp

Créer ensuite un repertoire dans lequel seront mise les données du serveur TFTP :
# mkdir -p /var/lib/tftpboot
Pour simplifier les choses et éviter les erreurs, ajouter un lien symbolique :
# ln -s /var/lib/tftpboot /tftpboot

Normalement si l'installation se déroule bien il devrait y avoir ceci dans /etc/inetd.conf
tftp            dgram   udp     wait    nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5     --mcast-port 1758 --mcast-addr 10.0.1.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5  /tftpboot
Il suffit de modifier le répertoire (ici /tftpboot) et l'adresse multicast.
Si vous utilisez xinetd la configuration est similaire mais il faut ajouter ce bloc dans la configuration :
service tftp
{
        socket_type = dgram
        protocol    = udp
        wait        = yes
        user        = nobody
        server      = /usr/sbin/in.tftpd
        server_args = --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 10.0.1.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /tftpboot
}

Recharger inetd :
# /etc/init.d/inetd reload

On vérifie que les 2 serveurs dhcpd et atftpd sont bien en écoute :
# netstat -ulpn
udp        0      0 0.0.0.0:67              0.0.0.0:*                          15449/dhcpd
udp        0      0 0.0.0.0:69              0.0.0.0:*                          6661/inetd

Etape 3 : mettre à jour le contenu du serveur TFTP

La dernière est de remplir le serveur TFTP avec toutes les données nécessaires pour le boot. Tout le matériel nécessaire se trouve sur le site Debian dans la section Debian-installer.
L'idée sera de faire un script qui sera exécuté régulièrement et qui récupérera toutes les données dans notre serveur TFTP : le script ci-dessous utilise rsync pour mettre à jour le contenu de notre répertoire /tftpboot mais on peut aussi utiliser wget en fonction des mirroirs disponibles.
#!/bin/bash
# /srv/script/updateTftpBoot.sh
MIRROR='ftp.nerim.net'
cd /tftpboot
#wget -r -o /tmp/wget.log -nH --cut-dirs=8 http://ftp2.fr.debian.org/debian/dists/stable/main/installer-i386/current/images/netboot/
rsync -avz --progress --delete rsync://$MIRROR/debian/dists/stable/main/installer-i386/current/images/netboot/ .
cd -
exit 0


On ajoute ensuite dans la crontab le lancement de ce script par exemple tous les jours à 4h du matin :

# crontab -e
0 4 * * * /src/script/updateTftpboot.sh

Etape 4 : booter la machine par réseau

Il suffit de redémarrer une machine et d'aller dans son BIOS et modifier l'ordre de boot en mettant la carte réseau en premier pour le boot. Il faut bien sûr que la carte réseau supporte PXE!
Et voilà... y a plus qu'à installer!

Sources :
http://d-i.alioth.debian.org/manual/fr.i386/ch04s06.html
http://wiki.debian.org/NetworkBootingIndy?action=show
http://www.cyrius.com/debian/bcm91250a/installing-debian.html