Installation par le réseau

De La Mouche VII
Révision de 10 mars 2012 à 18:57 par Xiloynaha (discussion | contributions) (kFreeBSD + corrections)

(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

Cette page explique comment démarrer une machine par le réseau. Ceci peut avoir plusieurs buts :

  • démarrer un système de secours sans disposer d'un CD autonome ;
  • installer un système d'exploitation sur une machine ne disposant pas d'un lecteur optique ou ne pouvant démarrer sur USB ;
  • démarrer une machine ne disposant pas d'un disque dur…

Le minimum vital de la théorie

D'après Wikipédia, le démarrage par PXE s'effectue en plusieurs étapes :

  1. Recherche d'une adresse IP sur un serveur DHCP ainsi que du fichier à démarrer.
  2. Téléchargement du fichier à démarrer sur un serveur Trivial FTP (TFTP).
  3. Exécution du fichier à démarrer.

Je vous renvoie aux liens ci-dessus pour plus de détails.

Matériel et logiciels nécessaires

Outre la machine à démarrer (machine cliente), vous devez disposer d'un ordinateur qui fera office de serveur, mettant à disposition les services nécessaires au client pour démarrer. Au minimum, ce serveur disposera des composants logiciels suivants :

  • serveur DHCP pour fournir une adresse IP ;
  • serveur TFTP pour fournir les fichiers nécessaires au démarrage.

Dans certains cas, un serveur NFS sera également requis.

Comme d'habitude, j'utilise une distribution GNU/Linux Debian, mais la même chose peut être faite sous d'autres distributions GNU/Linux, ou BSD.

Préliminaire : que faire si ma machine ne peut pas démarrer sur le réseau ?

Si le BIOS de votre machine ne supporte pas le boot réseau, mais que vous disposez d'un autre support de démarrage, alors tout n'est pas perdu. Visitez donc le merveilleux site ROM-o-matic (maintenu par le projet EtherBoot), qui propose de générer une image qui, une fois installée sur un support que votre machine est capable de démarrer, permettra d'initialiser un démarrage réseau.

Typiquement, ce support alternatif de démarrage peut être :

  • un lecteur de disquettes (simple, rapide, efficace) ;
  • un lecteur optique (CD de préférence, utiliser un DVD pour ça ne serait que perte d'espace) ;
  • une clef USB ou assimilé (je n'ai pas essayé, mais c'est proposé) ;
  • un GRUB (ou un LILO, ou un SYSLINUX) opérationnel (pas essayé non plus) ;

Sur la page d'accueil de ROM-o-matic, choisissez la version la plus récente du générateur gPXE sous « Production Releases » (évitez la version de développement, j'ai déjà eu des soucis avec). Une fois la page chargée, il faut répondre aux questions dans l'ordre.

  1. « Choose NIC/ROM type » : il s'agit de choisir le modèle de votre carte réseau dans la liste. Pour cela, il est nécessaire de connaître le nom du pilote (nom du module Linux) et/ou la famille de la carte ; on peut avoir un premier aperçu grâce à la commande lspci, par exemple :
    lspci | grep -i ethernet
    Un deuxième indice est la liste des modules noyaux chargés automatiquement par votre système (commande lsmod). Évidemment, ces deux choses nécessitent de disposer d'un système lancé sur la machine cible.
    Vous pouvez aussi vous aider de la liste dont le lien est donné juste en dessous (dans le « here » de « PCI IDs for available NICs are documented here »).
    Si vous ne trouvez pas votre carte dans la liste, vous pouvez essayer le générateur d'images Etherboot (accessible de la même manière que gPXE, depuis la page d'accueil), mais gPXE semble supporter beaucoup plus de cartes.
  2. « Choose ROM output format » : il s'agit ici de sélectionner le format du fichier qui sera généré. Pour une image de disquette par exemple, il faut conserver le choix par défaut, Floppy bootable ROM Image (.dsk). Les différents formats sont expliqués (en anglais) sur la page Etherboot image types du wiki du projet.
  3. Personnalisation (optionnel) : le bouton « Configure » permet d'accéder à une page de paramétrage de l'image ; on peut ainsi modifier les protocoles supportés pour le téléchargement du fichier de démarrage, entre autres. Le choix par défaut sera cependant suffisant à notre niveau.
  4. Cliquez sur « Get ROM » pour générer et télécharger l'image.

Une fois l'image sauvegardée sur le disque dur, il faut la placer sur le support voulu. Pour une ISO de CD, une gravure standard devrait faire l'affaire. Pour une disquette, il faut écrire l'image (qui est en fait un secteur de boot) sur le périphérique correspondant au lecteur de disquettes, grâce à la commande dd (dd if=image.dsk of=/dev/fd0 si votre lecteur de disquette est sur fd0). Dans mon cas, j'ai téléchargé la dernière image gPXE pour ma carte D-Link FIXME, dont le module est sundance (j'ai sélectionné « sundance:sundance » dans la liste, car la famille sundance comporte plusieurs cartes) ; l'écriture sur la disquette se présente comme suit :

naha@ein:/tmp$ dd if=gpxe-0.9.6-sundance.dsk of=/dev/fd0
99+1 enregistrements lus
99+1 enregistrements écrits
51082 bytes (51 kB) copied, 3,96725 s, 12,9 kB/s

Il n'y a plus qu'à insérer la disquette dans le lecteur de la machine à démarrer, et à vérifier si PXE se lance correctement.

Serveur DHCP

J'utilise le serveur DHCP de l'Internet Software Consortium (je suppose que d'autres, comme udhcpd, fonctionneraient tout aussi bien). Installons-le :

# aptitude install isc-dhcp-server

À noter que le paquet Debian se nommait auparavent dhcp3-server.

Il faut ensuite modifier le fichier de configuration /etc/dhcp/dhcpd.conf selon nos besoins. Voici un exemple commenté, adapté du fichier de configuration d'exemple (voir /usr/share/doc/isc-dhcp-server/examples/dhcpd.conf).

# option definitions common to all supported networks...
option domain-name "lm7.fr";
# Déclaration des DNS, ici deux serveurs allemands d'OpenNIC [http://www.opennicproject.org/].
# Pour d'autres :
# http://www.commentcamarche.net/faq/sujet-1496-serveurs-dns-des-principaux-fai
option domain-name-servers 178.63.26.173, 217.79.186.148;

default-lease-time 600;
max-lease-time 7200;

# Use this to enble / disable dynamic dns updates globally.
#ddns-update-style none;

# [Non nécessaire, même si un autre serveur DHCP est présent sur le réseau :]
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# Déclaration de notre réseau local (192.168.0.0/24) :
subnet 192.168.0.0 netmask 255.255.255.0 {
        # Les attributions d'adresses ne se font que dans la plage [151-160] :
        range 192.168.0.151 192.168.0.160;

        # Adresse de la passerelle vers Internet :
        option routers 192.168.0.254;

        # Adresse de diffusion du réseau (optionnel) :
        option broadcast-address 192.168.0.255;

        # Fichier par défaut vers lequel on oriente les clients (optionnel) :
        filename "/riplinux/pxelinux.0";

        # Adresse IP du serveur TFTP (dans mon cas la même machine que le
        # serveur DHCP) :
        next-server 192.168.0.1;

        # [Optionnel, présent dans la configuration par défaut :]
        ping-check = 1;
}


### Configurations d'hôtes spécifiques ###

# Mon système de sauvegarde (nommé "glen") :
host glen {
        # Adresse MAC de la carte réseau de la machine :
        hardware ethernet aa:aa:aa:aa:aa:aa;

        # J'accède à la machine en SSH, je veux donc une adresse fixe :
        fixed-address 192.168.0.70;

        # Fichier de démarrage :
        filename "/lenny32/pxelinux.0";
}

# Machine à installer sous Debian :
host inst-debian {
        # Adresse MAC de la carte réseau de la machine :
        hardware ethernet bb:bb:bb:bb:bb:bb;

        # L'adresse fixée est normalement facultative, mais je préfère
        # en mettre une dans tous les cas, ça évite les trucs bizarres
        # quand il change d'adresse IP au milieu de l'installation :
        fixed-address 192.168.0.80;

        # Fichier de démarrage :
        filename "/debian/pxelinux.0";
}

# Machine à installer sous NetBSD ou DragonFly BSD :
host inst-bsd {
        # Adresse MAC de la carte réseau de la machine :
        hardware ethernet cc:cc:cc:cc:cc:cc;

        # Je dois spécifier à qui je partage les fichiers par NFS,
        # je suis donc (presque) obligé de fixer une adresse :
        fixed-address 192.168.0.81;

        # Fichier de démarrage :
        filename "/netbsd/pxeboot_ia32.bin";
  # Ou pour DragonFly :
        #filename "/dragonfly/boot/pxeboot";

        # Adresse du serveur NFS (si différent du 'next-server' par
        # défaut spécifié plus haut) :
        #next-server 192.168.0.20;

        # Chemin du montage NFS sur le serveur :
        option root-path "/home/nfs/netbsd";
  # Ou pour DragonFly :
        #option root-path "/var/lib/tftpboot/dragonfly";
}

Redémarrons ensuite le serveur DHCP pour prendre en compte les modifications :

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

Serveur TFTP

J'utilise personnellement tftpd-hpa, mais il existe également en paquets dans Debian atftpd (qui marche très bien), et tftpd tout court (que je n'ai pas essayé).

# aptitude install tftpd-hpa

Deux solutions s'offrent à nous pour le lancement du serveur TFTP :

  1. soit le faire s'exécuter en tant que daemon, ce qui est plus rapide en cas de clients nombreux (ce qui n'est pas mon cas), mais qui prend un (tout petit) peu plus de mémoire vive ; ça a l'avantage de permettre de ne démarrer le service que quand on veut l'utiliser ;
  2. soit passer par inetd, ce qui a l'avantage d'être simple et de ne pas laisser trainer un service en mémoire.

Dans les deux cas, il faudra ensuite déployer les fichiers nécessaires au démarrage du ou des systèmes voulus.

Sous Debian, tftpd-hpa est maintenant configuré par défaut pour s'exécuter en mode daemon, ce qui me convient bien. On pourra désactiver le lancement du démon à chaque démarrage en utilisant un utilitaire du type rcconf (dans le paquet du même nom), ou en trifouillant à la main dans /etc/rc?.d ; on devra ainsi lancer à la main le démon lorsque l'on voudra faire démarrer une machine par le réseau (même remarque pour isc-dhcp-server, d'ailleurs).

Configuration du daemon TFTP

Il n'y a pas grand chose à configurer, si ce n'est qu'il est préférable que le serveur TFTP présente sa racine aux clients. Avec tftp-hpa, cela se fait en passant l'option --secure au lancement du serveur. Vous pouvez ajouter cette option dans le fichier /etc/default/tftpd-hpa :

TFTP_OPTIONS="--secure"

Il faut ensuite redémarrer le daemon avec la commande :

# /etc/init.d/tftpd-hpa restart

Nous supposons ici que vous suivez ce conseil ; si ce n'est pas le cas il vous faudra spécifier le répertoire complet sur les lignes filename du fichier de configuration DHCP, par exemple :

filename "/var/lib/tftpboot/debian/pxelinux.0";

Serveur NFS

Pour certaines installation, vous pourrez avoir besoin de partager des fichiers par NFS, dont auraient besoin le chargeur de démarrage ou l'installateur.

Le paquet du serveur NFS se nomme nfs-kernel-server :

# aptitude install nfs-kernel-server

La configuration se fait ensuite dans /etc/exports. Pour comprendre comment partager un répertoire, je vous renvoie aux exemples commentés dans ce fichier, à la page de manuel exports(5), et aux exemples que je donne ici.

Pour appliquer les changements :

# /etc/init.d/nfs-kernel-server restart

Déploiement des fichiers de démarrage

Comme vous l'avez peut-être déduit des extraits de fichiers de configuration qui précèdent, la racine du serveur TFTP est par défaut (sous Debian en tout cas : cela varie selon les distributions) dans /var/lib/tftpboot. Je n'aime pas utiliser /var/lib (je préfère /srv), mais je laisse cette valeur par défaut dans le cadre de ce tutoriel. Si comme moi vous voulez utiliser un autre répertoire, il est très facile de modifier le comportement du serveur TFTP (cf. la section précédente) ; n'oubliez pas d'adapter également la configuration du serveur DHCP pour qu'il fournisse les bons chemins de fichiers.

La procédure classique est de récupérer une archive contenant les fichiers nécessaires au démarrage, de la décompresser dans un sous-répertoire de /var/lib/tftpboot, et d'adapter la configuration du serveur DHCP en fonction : le « filename » doit pointer vers le fichier correspondant à l'image PXE du système à démarrer (habituellement pxelinux.0 pour les systèmes Linux et pxeboot pour les BSD), avec un chemin relatif à la racine du serveur TFTP.

Les sections suivantes présentent quelques exemples.

Debian GNU/Linux

Dans un dépôt Debian, les images de l'installateur réseau se trouvent dans dists/DISTRIBUTION/main/installer-ARCHITECTURE/current/images/netboot/. Par exemple, pour lenny en version i386, on pourra utiliser : ftp://ftp.fr.debian.org/debian/dists/lenny/main/installer-i386/current/images/netboot/

Le fichier à télécharger est netboot.tar.gz. Voici un exemple de téléchargement et déploiement pour wheezy :

# wget ftp://ftp.fr.debian.org/debian/dists/wheezy/main/installer-i386/current/images/netboot/netboot.tar.gz
# mkdir /var/lib/tftpboot/debian
# tar -C /var/lib/tftpboot/debian -xzf netboot.tar.gz

On adapte la configuration du serveur DHCP (filename "/debian/pxelinux.0";), on redémarre ce dernier grâce au script init qui va bien (cf. supra), et le tour est joué.

Ubuntu & ses petites sœurs

Ubuntu est un dérivé de Debian, la procédure est donc exactement la même, en adaptant l'adresse du fichier à télécharger. Pour la distribution intrepid en version i386, on pourra par exemple utiliser l'adresse : ftp://ftp.ubuntu.com/ubuntu/dists/intrepid/main/installer-i386/current/images/netboot/

Debian GNU/kFreeBSD

Contrairement aux variantes Linux de Debian qui utilisent pxelinux pour démarrer, kFreeBSD utilise Grub. Ce dernier est configuré pour aller chercher ses fichiers de configuration dans le répertoire /debian-installer à la racine du serveur TFTP. Le plus simple est donc de configurer le serveur TFTP pour chrooter, puis de faire en sorte que le répertoire debian-installer soit trouvé.

Ici, j'installe de la manière habituelle le contenu de l'archive netboot.tar.gz, puis je crée un lien symbolique /var/lib/tftpboot/debian-installer qui pointe vers /var/lib/tftpboot/debian-installer/debian-kfreebsd-i386/debian-installer :

# mkdir /var/lib/tftpboot/debian-kfreebsd-i386
# tar -C /var/lib/tftpboot/debian-kfreebsd-i386 -xzf netboot.tar.gz
# ln -s debian-kfreebsd-i386/debian-installer /var/lib/tftpboot

Il suffit ensuite d'indiquer dans la configuration du serveur DHCP le fichier de démarrage de Grub (filename "/debian-kfreebsd-i386/grub2pxe";).

Si votre serveur TFTP ne chroote pas ou que le répertoire debian-installer n'est pas trouvé à sa racine, grub lancera son invite de commande et vous devrez taper les commandes présentes dans grub.cfg à la main, après avoir redéfini la variable prefix :

prefix=(pxe)/var/lib/tftpboot/debian-kfreebsd-i386/debian-installer/kfreebsd-i386

Arch Linux

L'installation d'Arch par le réseau est documentée sur le wiki officiel (en anglais), mais le serveur utilisé est une Arch. Là où le bât blesse, c'est qu'il faut télécharger Archboot, une image de 600 Mo (privilégiez le téléchargement par torrent), pour en extraire une poignée de fichiers (bon d'accord, 150 Mo tout de même).

Si vous avez suivi les instructions d'installation de DHCP et TFTP indiquées plus haut sur votre machine Debian, la procédure se résume, une fois l'image Archboot téléchargée, aux commandes suivantes :

# mount -o loop archlinux-2010.02-1-archboot.iso /mnt
# cp -a /mnt/isolinux /var/lib/tftpboot/archlinux
# mkdir /var/lib/tftpboot/archlinux/pxelinux.cfg
# mv /var/lib/tftpboot/archlinux/{isolinux.cfg,pxelinux.cfg/default}

Pour le fichier pxelinux.0, vous pouvez utiliser celui que fournit le paquet syslinux-common (installez-le le cas échéant) en créant un lien symbolique :

# ln -s /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot/archlinux

Il n'y a plus qu'à ajouter la cible qui va bien dans la configuration du serveur DHCP (filename "/archlinux/pxelinux.0";), à relancer ce dernier, et à allumer la machine à installer.

Montage NFS pour les paquets

Optionnellement, puisque nous avons téléchargé cette grosse image d'Archboot, autant rentabiliser et l'utiliser aussi pour l'installation des paquets. Pour ce faire, on peut partager les fichiers qu'elle contient par NFS depuis le serveur, et effectuer un montage sur la machine que l'on installe plutôt que de télécharger les paquets depuis internet.

Sur le serveur, on ajoute donc une ligne à /etc/exports, et on redémarre le serveur NFS (le paquet nfs-kernel-server doit être installé) :

# cat >>/etc/exports <<EOF
/mnt    192.168.0.81/24(rw,sync,no_root_squash,no_subtree_check)
EOF
# /etc/init.d/nfs-kernel-server restart

Je rappelle que /mnt est le point de montage de l'image d'Archboot, que nous avons montée en loop tout à l'heure. Ajustez l'adresse IP du client selon ce que vous avez mis dans la configuration du serveur DHCP.

Sur la machine en cours d'installation, aller dans le menu n°3 « Select source », choisir 1 « CD-ROM, USBSTICK or OTHER », basculer sur une autre console (par exemple avec Alt+F2), monter le répertoire sous /src :

# mount -t nfs 192.168.0.1:/mnt /src

Puis valider. L'installateur retourne au menu principal et l'étape n°4 est sélectionnée, il n'y a plus qu'à continuer.

Une fois l'installation terminée, n'oubliez pas de supprimer ou de commenter la ligne que nous avons ajoutée à /etc/exports, d'arrêter ou redémarrer le serveur NFS, puis de démonter l'image d'Archboot :

# umount /mnt

Sur la machine fraîchement installée, faites une mise à jour, car les paquets d'Archboot peuvent être plus anciens que ceux des dépôts :

# pacman -Syu

NetBSD

Inspiré de [1]. Procédure mise à jour pour pour NetBSD 5.1.

Je pars du principe que l'architecture du système cible est i386. Si ce n'est pas le cas, vous devrez bien sûr adaptez les commandes indiquées ici.

Alternatives

Pour démarrer l'installateur par le réseau, nous avons seulement besoin de deux fichiers : le fichier de démarrage PXE, et un noyau. Une fois l'installateur démarré, nous aurons également besoin de lui fournir les archives du système (sets). Nous pouvons donc procéder de deux manières :

  • télécharger l'image ISO du CD d'installation de la dernière NetBSD, sur lequel tout cela est présent et qui pourra resservir pour de futures installations (par le réseau ou par CD-ROM) ;
  • ou récupérer les deux fichiers nécessaires au démarrage directement sur un miroir NetBSD, puis laisser l'installateur se débrouiller pour télécharger les sets.

Je procède généralement en téléchargeant l'image ISO.

Fichiers de démarrage

Si vous avez choisi de télécharger l'image ISO complète, vous devez commencer par monter l'image (ou le CD-ROM, si vous avez gravé et supprimé l'image), par exemple sur /mnt (remplacez X.Y.Z par la version que vous avez téléchargée) :

# mount -o loop i386cd-X.Y.Z.iso /mnt

Le premier fichier à récupérer est le fichier de démarrage PXE, que nous allons placer dans /var/lib/tftpboot/netbsd :

# mkdir /var/lib/tftpboot/netbsd
# cp /mnt/i386/installation/misc/pxeboot_ia32.bin /var/lib/tftpboot/netbsd

Ou, si vous optez pour la solution « tout réseau » (remplacez X.Y.Z par la version de NetBSD) :

# mkdir /var/lib/tftpboot/netbsd
# cd /var/lib/tftpboot/netbsd
# wget ftp://ftp.fr.netbsd.org/pub/NetBSD/NetBSD-X.Y.Z/i386/installation/misc/pxeboot_ia32.bin

Le second fichier est le noyau de NetBSD. Plusieurs noyaux sont disponibles sur le CD, dans /i386/binary/kernel, vous pouvez choisir l'alternative qui vous convient parmi les fichiers netbsd-INSTALL*.gz. J'utilise ici netbsd-INSTALL_FLOPPY.gz. Nous devons le placer dans un répertoire que nous partagerons par NFS (/home/nfs/netbsd dans notre cas). Le fichier doit se nommer tout simplement « netbsd ». Avec la solution « image ISO », tapez simplement :

# mkdir /home/nfs/netbsd
# cd /home/nfs/netbsd
# cp /mnt/i386/binary/kernel/netbsd-INSTALL_FLOPPY.gz .
# ln -s netbsd-INSTALL_FLOPPY.gz netbsd

Et avec la solution « tout réseau » :

# mkdir /home/nfs/netbsd
# cd /home/nfs/netbsd
# wget ftp://ftp.fr.netbsd.org/pub/NetBSD/NetBSD-X.Y.Z/i386/binary/kernel/netbsd-INSTALL_FLOPPY.gz
# ln -s netbsd-INSTALL_FLOPPY.gz netbsd

Pour adapter la configuration du serveur DHCP, référez-vous à l'exemple supra. Grosso-modo il suffit de spécifier le fichier de démarrage PXE (comme d'habitude : filename "/netbsd/pxeboot_ia32.bin";), le chemin du partage NFS sur le serveur (option root-path "/home/nfs/netbsd/";), et éventuellement l'adresse du serveur NFS si aucun serveur par défaut n'est déclaré (next-server 192.168.0.20;).

Pour pouvoir démarrer l'installateur, il ne reste plus qu'à partager le répertoire /home/nfs/netbsd, soit au réseau entier, soit au seul client à installer si vous avez fixé son adresse IP (directive fixed-address).

N.B. : Si cela vous convient mieux, vous pouvez bien sûr placer le noyau à côté du fichier de démarrage PXE dans l'arborescence de TFTP et partager ce répertoire.

Montage NFS

Si vous avez télécharger l'image ISO complète, il est conseillé de rentabiliser en utilisant les fichiers d'installation qui y sont présents (l'alternative étant que l'installateur télécharge les archives sur un serveur FTP). Pour cela il suffit de partager par NFS le point de montage de l'image du CD (/mnt dans mon exemple) :

# cat >>/etc/exports <<EOF
/mnt    192.168.0.81/24(rw,sync,no_root_squash,no_subtree_check)
EOF
# /etc/init.d/nfs-kernel-server restart

Dans l'installateur, au moment du choix de la source d'installation, il faudra sélectionner NFS, puis spécifier l'adresse IP du serveur (192.168.0.1 chez moi) et le répertoire de base (/mnt dans cet exemple). Laissez le choix par défaut pour répertoire où se trouvent les archives.

DragonFly BSD

Procédure testée pour DragonFly BSD 2.10.1.

La procédure est très simple : tout le matériel est disponible dans l'image ISO disponible sur les miroirs de DragonFly. En deux mots, nous allons monter l'image dans l'arborescence du serveur TFTP, et nous allons également la partager par NFS.

Je pars une fois de plus du principe que l'architecture de la machine cible est i386 ; si vous préférez une installation 64 bits, remplacez i386 par x86_64 dans les commandes d'exemple.

Commençons par télécharger l'image ISO du CD d'installation sur le miroir français (choisissez-en un autre au besoin, et remplacez X.Y.Z par la version que vous souhaitez installer) :

# wget http://dfly.nfrance.com/iso-images/dfly-i386-X.Y.Z_REL.iso.bz2

Après décompression de l'image, nous la montons dans l'arborescence TFTP :

# bunzip2 dfly-i386-X.Y.Z_REL.iso.bz2
# mkdir /var/lib/tftpboot/dragonfly
# mount -o loop dfly-i386-X.Y.Z_REL.iso /var/lib/tftpboot/dragonfly

Puis nous ajoutons le point de montage à la liste des partages NFS et nous rechargeons la configuration du serveur NFS :

# cat >>/etc/exports <<EOF
/var/lib/tftpboot/dragonfly  192.168.0.81/24(rw,sync,no_root_squash,no_subtree_check)
EOF
# /etc/init.d/nfs-kernel-server restart

Il faudra ensuite indiquer dans la configuration du serveur DHCP que le fichier de démarrage est /dragonfly/boot/pxeboot et que le répertoire NFS à monter est /var/lib/tftpboot/dragonfly. Référez-vous à la configuration d'exemple.

Au démarrage, le magnifique menu avec une libellule en ASCII art devrait apparaître et vous permettre de choisir entre plusieurs options, tout comme si vous démarriez sur le CD.

OpenBSD

Procédure testée pour OpenBSD 4.9.

De bonnes explications sont données dans la FAQ OpenBSD.

Pour résumer, il vous faudra récupérer le fichier de démarrage PXE (pxeboot) par FTP, ainsi que le noyau d'installation présent sur le CD d'installation et sur les miroirs FTP.

Préparation

Le fichier de démarrage PXE est disponible sur les miroirs FTP d'OpenBSD (remplacez X.Y par le numéro de version d'OpenBSD, par exemple 4.9, et architecture par l'architecture de la machine cible, par exemple i386) :

# mkdir /var/lib/tftpboot/openbsd
# cd /var/lib/tftpboot/openbsd
# wget ftp://ftp.fr.openbsd.org/pub/OpenBSD/X.Y/architecture/pxeboot

Adaptez ensuite la configuration de votre serveur DHCP (filename "/openbsd/pxeboot";).

Pour le noyau et les sets, vous avez le choix entre télécharger l'image ISO du CD d'installation (ce qui vous permettra de conserver les fichiers pour de futures installations et de graver un CD si besoin) ou passer entièrement par le réseau. Dans ce dernier cas, il vous suffit de télécharger le noyau d'installation et de le placer dans l'arborescence TFTP :

# cd /var/lib/tftpboot/openbsd
# wget ftp://ftp.fr.openbsd.org/pub/OpenBSD/X.Y/architecture/bsd.rd

Si vous préférez télécharger l'image du CD :

# wget ftp://ftp.fr.openbsd.org/pub/OpenBSD/X.Y/architecture/installXY.iso
# mount -o loop installXY.iso /mnt
# cp /mnt/X.Y/architecture/bsd.rd /var/lib/tftpboot/openbsd

Démarrage

Si vous utilisez un serveur TFTP qui chroot, vous pouvez définir le répertoire où vous avez placé le noyau comme racine (ou placer le noyau à la racine du serveur TFTP, ce qui revient au même) ; le bootloader trouvera alors le noyau tout seul si vous l'avez appelé bsd. Si, comme dans les commandes d'exemple ci-dessus, vous avez gardé le nom d'origine bsd.rd, il vous suffira normalement de taper boot tftp:/bsd.rd à l'invite du bootloader.

Si au contraire votre serveur TFTP ne chroot pas, ou que vous n'avez pas placé le noyau à la racine, il vous faudra taper le chemin complet. Dans ma configuration d'exemple, cela donne :

boot tftp:/openbsd/bsd.rd

Ou si votre serveur TFTP ne chroot pas :

boot tftp:/var/lib/tftpboot/openbsd/bsd.rd

Les sets

Comme pour les autres *BSD, l'installateur a besoin des sets (archives du système de base), et vous posera donc la question fatidique : « où dois-je me procurer les sets ? ». Si vous n'avez pas téléchargé l'image du CD d'installation, il vous suffit d'indiquer un miroir FTP, et tout devrait bien se passer.

Si vous avez téléchargé l'image du CD, les sets sont d'ores et déjà en votre possession. La mauvaise nouvelle, c'est que l'installateur d'OpenBSD ne parle pas NFS, vous n'avez que trois possibilités pour fournir les archives à votre machine :

  • HTTP, ce qui implique de disposer d'un serveur HTTP sur votre réseau local ;
  • FTP, idem avec un serveur FTP ;
  • disque local.

N'ayant ni serveur HTTP, ni serveur FTP sous le coude, j'ai opté pour la solution « disque local », à savoir copier les fichiers sur une clef USB (/mnt est le point le montage de l'image du CD, que nous avons montée tout à l'heure, et sdAn le périphérique correspondant à votre clef USB) :

# mount /dev/sdAn /media/clef_usb
# cp -r /mnt/X.Y /media/clef_usb
# umount /media/clef_usb

Il suffit ensuite de brancher la clef USB dans la machine à installer et de repérer dans les lignes qui défilent le périphérique à laquelle elle est associée (quelque chose comme sd1). Tapez ensuite « disk » à l'invite de l'installateur, indiquez le périphérique, et tapez sur Entrée pour dire que le chemin des fichiers est correct. Dites ensuite d'utiliser les sets trouvés dans le répertoire, et voilà.

RIPLinuX

RIPLinuX, est une distribution de secours, dont le nom à la casse assez kikoololesque signifie « Recovery Is Possible ». Sur les systèmes dotés d'un lecteur optique, ou capables de démarrer à partir d'un support USB, j'utilise habituellement l'excellent SystemRescueCd ; mais quid des systèmes ne disposant pas de ce type de matériel ? Eh bien RIPLinuX, qui existe par ailleurs en version CD, dispose d'une archive toute prête pour une utilisation par le réseau ! C'est-y pas beau ça ?

On va donc télécharger la dernière version de l'archive, la version « non-X » (c'est-à-dire sans serveur graphique) étant suffisante dans le cas d'un système de secours. À l'heure où j'écris ces lignes, la dernière version de RIPLinuX est la 7.2 ; le fichier à télécharger se nomme donc « RIPLinux-7.2.PXE-non-X.zip ».

Il suffit de décompresser l'archive dans notre arborescence TFTP :

# unzip RIPLinux-7.2.PXE-non-X.zip -d /var/lib/tftpboot

Les fichiers sont fort stupidement décompressés dans un répertoire nommé tftpboot, RIP se trouve donc dans /var/lib/tftpboot/tftpboot. Résolvons cela :

# mv /var/lib/tftpboot/{tftpboot,riplinux}

Il ne reste plus qu'à adapter la configuration du serveur DHCP pour que les machines voulues démarrent sur RIPLinuX ((filename "/riplinux/pxelinux.0";)), et à le redémarrer.

Faire : vérifier que ça marche avec les ressources minimales indiquées sur le site, parce qu'avec 64 Mo de RAM, ça plante

Plop Linux

Plop Linux est une distribution de secours capable de démarrer par PXE. À l'époque où je l'avais essayée, elle m'avait moins convaincue que RIP, je ne sais plus trop pourquoi. Des instructions détaillées pour mettre en place le serveur PXE sont donnée sur le site.

Système maison avec racine NFS

Je me suis monté un petit système Debian personnalisé, pour optimiser l'espace disque sur mon serveur de sauvegarde : la totalité des disques est dans un gros LVM, je ne voulais pas m'encombrer avec des partitions système, ça aurait gâché de la place et rendu le tout moins souple. À vrai dire, quand j'aurai récupéré une disquette ZIP de 250 Mo le système sera dessus et je me passerai du boot réseau, mais en attendant, ça fonctionne très bien. Note : oui, j'utilise du matériel obsolète (disques ZIP, Pentium II avec 64 Mo de SDRAM), et non je n'ai pas de RAID de la mort pour sauvegarder mes données, juste un LVM qui plantera quand l'un des disques lâchera, mais ça suffit amplement à mon besoin.

Bref, voici un résumé des étapes nécessaires à la création de ce système :

  • installation du système de base grâce à debootstrap ;
  • installation des autres composants logiciels nécessaires (serveur NFS, etc.) ;
  • compilation d'un noyau personnalisé permettant de démarrer avec un montage NFS en tant que racine.

Faire : compléter, peut-être en faire un article à part ?

Dépistage d'erreurs

Merci à Err404 pour son témoignage (cf. page de discussion).

Lors d'un démarrage par PXE, il peut y avoir des problèmes même si vos fichiers de configuration sont bons.

Si l'ordinateur reçoit une adresse IP, cela signifie que le DHCP fonctionne (profitez-en pour vérifier qu'il s'agit du bon serveur DHCP, et que l'adresse correspond au bon réseau).

Le fichier journal /var/log/syslog fait apparaître les offres DHCP fournies par votre serveur DHCP aux clients. Vous pouvez suivre en temps réel les entrées du journal avec la commande suivante :

# tail -f /var/log/syslog

Un renifleur réseau exécuté sur le serveur peut également s'avérer très utile. Par exemple avec tcpdump (où eth0 est l'interface réseau du serveur et 01:12:23:34:45:56 l'adresse MAC du client) :

# tcpdump -i eth0 ether host 01:12:23:34:45:56

Vous verrez apparaître les requêtes et réponses DHCP/BOOTP, les requêtes et les transferts TFTP, ainsi que les éventuels transferts NFS.

En ce qui concerne NFS, si la machine cliente démarre sous GNU/Linux et qu'un message « waiting for root filesystem » apparaît, c'est que le serveur NFS n'est pas joignable (mal configuré ou protégé derrière un pare-feu, par exemple).

Enfin, deux possibilité si vous n'arrivez pas à résoudre votre problème :

  • essayer avec une autre machine ;
  • changer de version du fichier de démarrage PXE (généralement pxelinux.0 si la machine cliente démarre sous GNU/Linux).

Carte réseau boguée

Sur certaines cartes réseau, le boot-pxe (dans certaines versions inferieures à 2.0) est bogué et nécessite de modifier la façon dont est lancé le serveur TFTP dans inetd.conf (dans le cas de l'utilisation d'inetd). Pour ce faire, remplacer la ligne :

tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot

Par les deux lignes suivantes :

tftp dgram udp4 wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /var/lib/tftpboot
tftp stream tcp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /var/lib/tftpboot

Mais d'après Err404, cette modification ne semble néanmoins plus nécessaire depuis quelques temps.

Version de pxelinux.0

Il semblerait que certaines versions du fichier de démarrage pxelinux.0 présentent une anomalie compromettant le déroulement du démarrage sur certaines configurations (certaines carte à la ROM PXE boguée ?).

Il convient donc d'essayer avec une version différente de ce fichier (plus récente ou plus ancienne) si vous rencontrez soudainement un dysfonctionnement sur une configuration connue pour fonctionner.