Installation par le réseau
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 ;
- 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 :
- Recherche d'une adresse IP sur un serveur DHCP ainsi que du fichier à démarrer.
- Téléchargement du fichier à démarrer sur un serveur Trivial FTP (TFTP).
- 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.
- « 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.
- « 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.
- 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.
- 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 ({{{1}}}
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 dhcp3 (je suppose que d'autres, comme udhcpd, fonctionneraient tout aussi bien). Installons-le :
# aptitude install dhcp3-server
Il faut ensuite modifier le fichier de configuration /etc/dhcp3/dhcpd.conf selon nos besoins. Voici un exemple commenté, adapté du fichier de configuration d'exemple (voir /usr/share/doc/dhcp3-server/examples/dhcpd.conf).
# option definitions common to all supported networks... option domain-name "lm7.fr"; # Déclaration des DNS, ici ceux de Free. Pour d'autres : # http://www.commentcamarche.net/faq/sujet-1496-serveurs-dns-des-principaux-fai option domain-name-servers 212.27.54.252, 212.27.53.252; 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 f1:23:45:67:89:0a; # 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 67:89:ab:cd:ef:45; # 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-etch/pxelinux.0"; } # Machine à installer sous NetBSD : host inst-netbsd { # Adresse MAC de la carte réseau de la machine : hardware ethernet BA:FE:A5:00:10:0D; # salon # 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"; # 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/"; }
Redémarrons ensuite le serveur DHCP pour prendre en compte les modifications :
# /etc/init.d/dhcp3-server restart
Serveur TFTP
J'utilise personnellement tftpd-hpa, mais il existe également en paquets dans Debian tftpd tout court, et atftpd (je n'ai essayé ni l'un ni l'autre).
# aptitude install tftpd-hpa
Il n'y a pas grand chose à configurer, mais deux solutions s'offrent à nous pour le lancement du serveur TFTP :
- soit le faire s'exécuter en tant que démon, 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 ;
- soit passer par inetd, ce qui a l'avantage d'être simple et de ne pas laisser trainer un démon 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.
Solution 1 : démon
Pour la solution 1, il faut éditer le fichier /etc/default/tftpd-hpa et mettre « "yes" » en face de « RUN_DAEMON », ce qui fait que le fichier ressemble à ça :
RUN_DAEMON="yes" OPTIONS="-l -s /var/lib/tftpboot"
Il faut ensuite démarrer le démon avec la commande :
# /etc/init.d/tftpd-hpa start
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 dhcp3-server, d'ailleurs).
Solution 2 : inetd
Pour configurer inetd, il suffit d'éditer /etc/inetd.conf et de décommenter (ou ajouter si elle n'existe pas) la ligne suivante :
tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
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, mais bon, c'est par défaut, alors pourquoi pas… et si cela vous dérange vraiment, il est très facile de modifier le comportement du serveur TFTP (cf. la section précédente).
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), avec un chemin relatif à la racine du serveur TFTP.
Les sections suivantes présentent quelques exemples.
Debian
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 au bon endroit (le texte en gras correspond aux commandes tapées) :
naha@ein:~$ cd /tmp naha@ein:/tmp$ wget ftp://ftp.fr.debian.org/debian/dists/lenny/main/installer-i386/current/images/netboot/netboot.tar.gz […] 2008-12-01 00:21:23 (425 KB/s) - « netboot.tar.gz » sauvegardé [7413233] naha@ein:/tmp$ cd /var/lib/tftpboot naha@ein:/var/lib/tftpboot$ su Mot de passe : ein:/var/lib/tftpboot# mkdir debian-lenny ein:/var/lib/tftpboot# cd debian-lenny ein:/var/lib/tftpboot/debian-lenny# tar xzf /tmp/netboot.tar.gz ein:/var/lib/tftpboot/debian-lenny# ls -l total 8 drwxr-xr-x 3 root root 4096 oct 29 14:11 debian-installer/ lrwxrwxrwx 1 root root 32 déc 1 00:23 pxelinux.0 -> debian-installer/i386/pxelinux.0* lrwxrwxrwx 1 root root 34 déc 1 00:23 pxelinux.cfg -> debian-installer/i386/pxelinux.cfg/ -rw-r--r-- 1 root root 55 oct 29 14:11 version.info
On adapte la configuration du serveur DHCP (filename "debian-etch/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/
NetBSD
Inspiré de [1].
Téléchargez l'image ISO du CD de la dernière NetBSD (la 4.0.1 à l'heure où j'écris ces lignes) [2]. Le fichier se nomme, pour l'architecture x86, i386cd-4.0.1.iso. Nous avons besoin de deux fichiers contenus dans cette image.
On commence par monter l'image, par exemple sur /mnt :
# mount -o loop i386cd-4.0.1.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
Le second est le noyau NetBSD de l'installateur. 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, mais le noyau par défaut se nomme netbsd-INSTALL.gz. Nous devons le placer dans un répertoire que nous partagerons par NFS (/home/nfs/netbsd dans notre cas), et le fichier doit se nommer tout simplement « netbsd » :
# mkdir /home/nfs/netbsd # gunzip -c /mnt/i386/binary/kernel/netbsd-INSTALL.gz >/home/nfs/netbsd/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;
).
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
).
Faire : lien vers explication NFS.
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, j'utilise habituellement l'excellent SystemRescueCd ; mais quid des systèmes ne disposant pas de ce type de matériel (fort peu utile au demeurant, à part pour le cas qui nous occupe, à savoir installer ou tenter de récupérer un système) ? 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 (et d'après le dernier changelog, l'auteur ne compte pas sortir de nouvelle version… d'ici quelques temps, quand le matos récent ne sera plus bien supporté va falloir que je trouve autre chose) ; 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 /var/lib/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
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 ?
Serveur NFS
À faire.