Ce guide va vous montrer comment installer des stations diskless (sans disque). Il est basé sur la distribution Gentoo. Nous avons essayé de rendre ce guide aussi accessible que possible en pensant au débutant que nous avons tous été. Bien qu'un utilisateur plus expérimenté puisse réussir à assimiler les différents guides sur les stations sans disque et les réseaux, nous espérons que ce guide vous épargnera bien des écueils.
Qu'est-ce qu'une machine diskless ?
Une machine diskless est un PC dépourvu des périphériques de démarrage habituels, c'est-à-dire sans disque dur ni lecteur de CD-ROM ou de disquette. Un PC diskless démarre sur le réseau et a besoin d'un serveur qui va lui fournir de l'espace disque comme un disque dur local. Nous appellerons le serveur le maître et les machines sans disque des esclaves. Un esclave a besoin d'une carte réseau qui supporte le démarrage via PXE ou Etherboot ; consultez Etherboot.org pour des listes des matériels supportés. La plupart des cartes modernes, ainsi que plusieurs adaptateurs intégrés aux cartes-mères, supportent PXE.
Gentoo devrait être installé sur votre maître et celui-ci devrait disposer de suffisamment d'espace disque pour stocker les systèmes de fichiers des nœuds esclaves. Assurez-vous aussi d'avoir une interface Internet séparée de la connexion au réseau local.
2. Configuration des nœuds maître et esclaves
Le noyau est le logiciel qui sert d'interface entre votre matériel et l'ensemble des logiciels installés sur votre machine. Il est le cœur de tout système construit autour d'un noyau. Quand votre PC démarre, le BIOS exécute les instructions qu'il trouve dans le secteur de démarrage de votre disque dur (« boot sector » en anglais). Ces instructions sont communément appelées le chargeur de démarrage (en anglais « boot loader »). Celui-ci charge le noyau en mémoire et lui passe la main.
Pour plus d'informations relatives au noyau et à sa configuation, vous pouvez consulter le Kernel HOWTO.
Configuration du noyau du nœud maître
Peu importe la taille et le niveau de paramétrage du noyau maître, certaines options sont indispensables. Voici comment configurer votre noyau :
Exemple de code 2.1 : Modifier la configuration du noyau du nœud maître |
# cd /usr/src/linux # make menuconfig |
Une interface devrait apparaître et vous permettre de configurer votre noyau plus facilement qu'en modifiant manuellement le fichier /usr/src/linux/.config. Si votre noyau actuel fonctionne, vous voulez peut-être garder une copie de sa configuration. Quittez l'écran de configuration et tapez :
Exemple de code 2.2 : Sauvegarder une copie de la configuration du noyau maître |
# cp .config .config_working
|
Vérifiez que les options listées ci-dessous sont bien sélectionnées pour être compilées en dur et PAS comme modules. Les options affichées ci-dessous proviennent du noyau 2.6.10. Si vous utilisez une autre version, il se peut que le texte ou l'ordre diffère quelque peu.
Exemple de code 2.3 : Les options du noyau maître |
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
Device Drivers --->
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[ ] Network packet filtering (replaces ipchains)
File systems --->
Network File Systems --->
<*> NFS server support
[*] Provide NFSv3 server support
Si vous voulez accéder à Internet par le nœud maître et/ou utiliser un pare-feu
sécurisé, assurez-vous d'ajouter le support pour iptables.
[*] Network packet filtering (replaces ipchains)
IP: Netfilter Configuration --->
<*> Connection tracking (required for masq/NAT)
<*> IP tables support (required for filtering/masq/NAT)
|
Si vous voulez utiliser le filtrage des paquets, vous pouvez ajouter le reste des modules plus tard. Assurez-vous de lire le chapitre sur les pare-feu du manuel de sécurité Gentoo pour savoir comment configurer le filtrage de manière appropriée.
Note : Ces options de configuration du noyau s'ajoutent aux options spécifiques à votre matériel, elles ne les remplacent pas. |
Après avoir configuré le noyau maître, vous devez le compiler. Tapez ceci :
Exemple de code 2.4 : Recompiler le noyau maître et ses modules |
# make && make modules_install (Vérifiez que /boot est monté avant d'y copier le noyau) # cp arch/i386/boot/bzImage /boot/bzImage-master |
Maintenant que le nouveau fichier bzImage a été copié dans votre répertoire /boot, il ne vous reste plus qu'à vous assurer que votre chargeur de démarrage (« bootloader ») l'utilise. Modifiez lilo.conf ou grub.conf selon le chargeur de démarrage que vous utilisez. Ensuite, vous pouvez redémarrer votre machine pour activer ces nouvelles options.
Il est recommandé de compiler le noyau esclave sans modules, c'est-à-dire avec les options compilées en dur parce qu'il est difficile et inutile de charger des modules lors d'un démarrage via le réseau et parce que ce noyau doit être aussi compact que possible pour démarrer plus rapidement. Nous allons compiler le noyau esclave au même endroit que le noyau maître.
Pour éviter toute confusion et toute perte de temps, il vaut mieux garder une copie de la configuration du noyau maître comme ceci :
Exemple de code 2.5 : Sauvegarder une copie de la configuration du noyau maître |
# cp /usr/src/linux/.config /usr/src/linux/.config_master
|
Nous devons maintenant configurer le noyau des nœuds esclaves de la même façon que pour le noyau maître. Si vous préférez repartir d'une configuration vierge, vous pouvez réinitialiser /usr/src/linux/.config comme ceci :
Exemple de code 2.6 : Obtenir une configuration de noyau vierge |
# cd /usr/src/linux # cp .config_master .config |
Ensuite, utilisez l'interface de configuration :
Exemple de code 2.7 : Modifier la configuration du noyau du nœud esclave |
# cd /usr/src/linux # make menuconfig |
Assurez-vous que les options suivantes sont sélectionnées pour une compilation en dur dans le noyau et PAS comme module :
Exemple de code 2.8 : Options du noyau esclave |
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
Device Drivers --->
[*] Networking support
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support (NEW)
File systems --->
Network File Systems --->
<*> file system support
[*] Provide NFSv3 client support
[*] Root file system on NFS
|
Note : Configurer un serveur BOOTP est une alternative au serveur DHCP. |
Important : Il est important de compiler votre adaptateur réseau dans le noyau des nœuds (plutôt que d'en faire un module). En général, toutefois, l'utilisation de modules pour les nœuds diskless n'est pas un problème. |
Compilons le noyau esclave. Vous devez prendre garde à ne pas écraser les modules que vous avez construits pour le nœud maître. Faites :
Exemple de code 2.9 : Compiler le noyau esclave |
# cd /usr/src/linux # make |
Maintenant, créez le répertoire qui va accueillir le système de fichiers des nœuds esclaves sur le maître et copiez-y le fichier bzImage. Nous utilisons /diskless, mais vous pouvez utiliser un autre nom.
Note : Si vous utilisez plusieurs architectures, vous voudrez peut-être sauvegarder chaque fichier config sous le nom .config_arch. Faites de même avec les images : sauvegardez chacune d'elles dans le répertoire /diskless sous le nom bzImage_arch. |
Exemple de code 2.10 : Copier le noyau esclave |
# mkdir /diskless # cp /usr/src/linux/arch/i386/boot/bzImage /diskless |
Configuration d'un premier système de fichiers pour les nœuds esclaves
Les systèmes de fichiers des nœuds maître et esclaves peuvent subir de nombreuses adaptations. Concentrons-nous d'abord sur les fichiers de configuration et les points de montage. Nous avons besoin d'un répertoire sous /diskless pour le premier nœud esclave. Chaque esclave a besoin de son propre système de fichiers racine (le « root ») parce que certains fichiers ne peuvent pas être communs à plusieurs machines sans causer de graves problèmes. Peu importe les noms des sous-répertoires, vous pouvez, par exemple, les nommer d'après les adresses IP, car elles sont uniques et explicites. Dans cet exemple, l'adresse IP du premier nœud esclave est 192.168.1.21 :
Exemple de code 2.11 : Créer le répertoire / du premier nœud esclave |
# mkdir /diskless/192.168.1.21
|
Certains fichiers de configuration de /etc doivent être modifiés pour les esclaves. Copiez d'abord le répertoire /etc du maître dans le nouveau répertoire destiné au nœud esclave :
Exemple de code 2.12 : Créer /etc pour l'esclave |
# cp -r /etc /diskless/192.168.1.21/etc
|
Le système de fichiers est encore incomplet, il lui manque différents points de montage :
Exemple de code 2.13 : Créer les points de montage pour l'esclave |
# mkdir /diskless/192.168.1.21/home # mkdir /diskless/192.168.1.21/dev # mkdir /diskless/192.168.1.21/proc # mkdir /diskless/192.168.1.21/sys # mkdir /diskless/192.168.1.21/tmp # mkdir /diskless/192.168.1.21/mnt # chmod a+w /diskless/192.168.1.21/tmp # mkdir /diskless/192.168.1.21/mnt/.initd # mkdir /diskless/192.168.1.21/root # mkdir /diskless/192.168.1.21/var # mkdir /diskless/192.168.1.21/var/empty # mkdir /diskless/192.168.1.21/var/lock # mkdir /diskless/192.168.1.21/var/log # mkdir /diskless/192.168.1.21/var/run # mkdir /diskless/192.168.1.21/var/spool # mkdir /diskless/192.168.1.21/usr # mkdir /diskless/192.168.1.21/opt |
La plupart de ces noms devraient vous être familiers. Les points tels que /dev, /sys ou /proc seront utilisés au démarrage de l'esclave, les autres seront montés un peu plus tard. Vous devez également indiquer le nom de machine de l'esclave dans le fichier /diskless/192.168.1.21/etc/conf.d/hostname. Les programmes, bibliothèques et autres fichiers seront copiés au bon endroit plus loin dans ce guide. En fait, ce sera juste avant de démarrer l'esclave.
Bien que les fichiers de périphériques de /dev soient créés par udev plus loin, vous devez créer l'entrée /dev/console. Si vous ne le faites pas, vous verrez l'erreur « unable to open initial console »
Exemple de code 2.14 : Créer console dans /dev |
# mknod /diskless/192.168.1.21/dev/console c 5 1
|
3. Configuration du serveur DHCP
DHCP signifie « Dynamic Host Configuration Protocol ». Le serveur DHCP est le premier ordinateur contacté par les nœuds esclaves quand ils démarrent par le système PXE via le réseau. La principale fonction d'un serveur DHCP est d'attribuer des adresses IP. Un tel serveur peut attribuer des adresses en se basant sur les adresses MAC des cartes réseau (N.D.T. : l'adresse MAC est censée être unique pour chaque carte sur le marché et est attribuée par le constructeur). Une fois l'adresse attribuée, le serveur DHCP indique au nœud esclave où il peut obtenir son noyau et son système de fichiers intial.
Vous devez vérifier plusieurs choses avant de poursuivre. D'abord, vérifions si votre connexion réseau fonctionne :
Exemple de code 3.1 : Vérifier la connexion réseau |
# ifconfig eth0 multicast # ifconfig -a |
Vous devez vérifier que vous avez un périphérique eth0 qui fonctionne. Vous devriez voir quelque chose comme ceci :
Exemple de code 3.2 : Un périphérique eth0 activé |
eth0 Link encap:Ethernet HWaddr 00:E0:83:16:2F:D6
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:26460491 errors:0 dropped:0 overruns:2 frame:0
TX packets:32903198 errors:0 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:100
RX bytes:2483502568 (2368.4 Mb) TX bytes:1411984950 (1346.5 Mb)
Interrupt:18 Base address:0x1800
|
L'option MULTICAST est essentielle. Si vous ne l'avez pas, vous devez recompiler votre noyau avec cette option activée dans sa configuration.
Si votre réseau n'a pas encore de serveur DHCP, vous devez en installer un :
Exemple de code 3.3 : Installer un serveur DHCP |
# emerge dhcp
|
Si un serveur DHCP est déjà installé sur votre réseau, vous devez modifier sa configuration pour permettre un démarrage via PXE.
Le serveur DHCP est configuré grâce au seul fichier /etc/dhcp/dhcpd.conf. Le répertoire /etc/dhcp devrait contenir un exemple que vous pouvez utiliser comme point de départ :
Exemple de code 3.4 : Éditer le fichier de configuration du serveur DHCP |
# cp /etc/dhcp/dhcpd.conf.sample /etc/dhcp/dhcpd.conf # nano -w /etc/dhcp/dhcpd.conf |
Le fichier de configuration est organisé et indenté comme ceci :
Exemple de code 3.5 : Exemple de dhcpd.conf |
# Les options globales vont ici. ddns-update-style none; shared-network LOCAL-NET { # Les options partagées du réseau vont ici. subnet 192.168.1.0 netmask 255.255.255.0 { # Les options de sous-réseau vont ici. host slave{ # Les options spécifiques à l'hôte vont ici. } group { # Les options spécifiques au groupe vont ici. } } } |
La mention shared-network est facultative et est réservée pour des adresses IP que vous voulez attribuer aux nœuds qui font partie de votre réseau. Vous devez avoir au moins une section subnet et la section facultative group permet de définir des options communes aux nœuds spécifiés dans la section subnet. Voici un exemple de dhcpd.conf complet :
Exemple de code 3.6 : Exemple de dhcpd.conf |
#
# Exemple de fichier dhcpd.conf pour les clients diskless
#
# Désactivation du DNS dynamique
ddns-update-style none;
# On part du principe qu'une passerelle par défaut pour le traffic IP suffira
option routers 192.168.1.1;
# On fournit les informations du DNS aux clients
option domain-name-servers 192.168.1.1;
option domain-name "mydomain.com";
# On indique le serveur TFTP à employer
next-server 192.168.1.1;
# On déclare une option de tampon spécifique au vendeur pour les clients PXE
# Code 1: Adresse IP à multidiffusion du serveur de fichiers de démarrage
# Code 2: Port UDP que le client devrait observer pour les réponses MTFTP.
# Code 3: Port UPD que les serveurs utilisent pour écouter les requêtes MTFTP.
# Code 4: Nombre de secondes pendant lesquelles un client doit écouter avant
# d'essayer de débuter un nouveau transfet MTFTP.
# Code 5: Nombre de secondes pendant lesquelles un client doit écouter avant
# de réinitier un transfert MTFTP.
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;
# On déclare le sous-réseau dont les machines diskless font partie
subnet 192.168.1.0 netmask 255.255.255.0 {
# On fournit aux clients PXE les informations appropriées
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
vendor-option-space PXE;
# Au moins une des options PXE spécifiques au vendeur doit être
# paramétrée afin que les ROM du client de démarrage réalisent que
# nous utilisons un serveur adhérant à PXE. L'adresse IP MCAST est réglée à
# 0.0.0.0 afin de dire au ROM de démarrage que la multidiffusion TFTP n'est
# pas supportée.
option PXE.mtftp-ip 0.0.0.0;
# Ceci est le nom du fichier que les ROM de démarrage doivent télécharger.
filename "pxelinux.0";
}
# On fournit aux clients Etherboot les informations appropriées
class "etherboot" {
match if substring(option vendor-class-identifier, 0, 9) = "Etherboot";
filename "vmlinuz_arch";
}
# On ajoute une déclaration d'hôte pour chaque hôte diskless
host slave21 {
hardware ethernet 00:02:A5:04:3B:66;
fixed-address 192.168.1.21;
}
}
|
Note : Rien n'empêche d'utiliser PXE boot et Etherboot ensemble. L'exemple ci-dessus est un exemple ; en cas de problème, veuillez consulter la documentation de DHCPd. |
L'option next-server indique l'adresse IP de la machine à laquelle le nœud esclave doit demander le fichier filename après avoir reçu son adresse IP. Cette adresse est l'adresse du serveur TFTP, généralement la même que celle du nœud maître. Le nom du fichier spécifié dans l'option filename est relatif au répertoire /diskless si votre serveur TFTP est configuré comme indiqué plus loin dans ce guide. La section host contient l'adresse matérielle (la « MAC address ») de votre carte réseau et l'option fixed-address permet d'y associer l'adresse IP spécifiée. L'ensemble des options du fichier dhcpd.conf n'ont pas leur place dans ce guide, mais sont évidemment disponibles dans les pages man.
Exemple de code 3.7 : Consulter la page man de dhcpd.conf |
# man dhcpd.conf
|
Avant de lancer le script d'initialisation de DHCP, vous devez modifier le fichier /etc/conf.d/dhcp pour qu'il ressemble à ceci :
Exemple de code 3.8 : Exemple de /etc/conf.d/dhcp |
IFACE="eth0"
# insert any other options needed
|
La variable IFACE indique le péripherique réseau sur lequel sont connectés les nœuds esclaves. Dans notre cas, c'est eth0. Il peut être intéressant d'ajouter des valeurs à IFACE si le serveur est équipé de plusieurs cartes réseau. Pour démarrer le serveur DHCP, faites :
Exemple de code 3.9 : Démarrage du serveur DHCP sur le nœud maître |
# /etc/init.d/dhcp start
|
Pour faire démarrer le serveur DHCP automatiquement par votre machine, faites :
Exemple de code 3.10 : Ajout du serveur DHCP dans la procédure de démarrage de la machine |
# rc-update add dhcp default
|
Problèmes avec le serveur DHCP
Quand un nœud esclave démarre, vous devriez voir des messages semblables dans le fichier /var/log/messages sur le maître :
Exemple de code 3.11 : Exemple de messages de DHCP |
DHCPDISCOVER from 00:00:00:00:00:00 via eth0 DHCPOFFER on 192.168.1.21 to 00:00:00:00:00:00 via eth0 DHCPREQUEST for 192.168.1.21 from 00:00:00:00:00:00 via eth0 DHCPACK on 192.168.1.21 to 00:00:00:00:00:00 via eth0 |
Note : Ce fichier peut aussi vous aider à trouver les adresses MAC des nœuds esclaves. |
Si vous voyez le message ci-dessous, cela indique que le serveur DHCP émet bien sur le réseau, mais qu'il y a une erreur dans le fichier de configuration.
Exemple de code 3.12 : Exemple d'erreur DHCP |
no free leases on subnet LOCAL-NET |
Chaque fois que vous modifiez le fichier de configuration, vous devez relancer le server DHCP comme ceci :
Exemple de code 3.13 : Relancer le serveur DHCP sur le maître |
# /etc/init.d/dhcpd restart
|
4. Configuration du serveur TFTP et du démarrage via PXE et/ou de Etherboot
TFTP signifie « Trivial File Transfer Protocol ». Le serveur TFTP va fournir un noyau et un système de fichiers aux nœuds esclaves. Tous les noyaux des esclaves et leur système de fichiers seront stockés sur le serveur TFTP. Il est donc recommandé de l'installer sur le nœud maître.
Un serveur TFTP reconnu est celui compris dans le paquet tftp-hpa. Il se trouve qu'il a été écrit par le même auteur que SYSLINUX et ils fonctionnent très bien ensemble. Faites :
Exemple de code 4.1 : Installer le serveur TFTP |
# emerge tftp-hpa
|
Modifiez le fichier /etc/conf.d/in.tftpd. Vous devez y indiquer le répertoire principal servi par le serveur TFTP dans l'option INTFTPD_PATH. Les éventuelles options de la ligne de commande utilisée pour lancer le serveur viennent après INTFTPD_OPTS. Votre fichier devrait ressembler à ceci :
Exemple de code 4.2 : Exemple de /etc/conf.d/in.tftpd |
INTFTPD_PATH="/diskless"
INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"
|
L'option -l indique que le serveur doit écouter lui-même sur le réseau, ce qui vous évite d'utiliser inetd. L'option -v demande au serveur de fournir plus de messages dans son journal. L'option -s spécifie le répertoire racine du serveur.
Pour lancer le serveur TFTP, faites :
Exemple de code 4.3 : Lancer le serveur TFTP sur le maître |
# /etc/init.d/in.tftpd start
|
Ce script va lancer le serveur TFTP avec les options spécifiées dans le fichier /etc/conf.d/in.tftpd. Si voulez que le serveur TFTP soit lancé au démarrage de votre machine, faites :
Exemple de code 4.4 : Lancer le serveur TFTP au démarrage du nœud maître |
# rc-update add in.tftpd default
|
Cette partie ne vous intéresse pas si vous utilisez Etherboot. PXELINUX est l'équivalent réseau de LILO ou de GRUB, il est envoyé par le serveur TFTP. Il s'agit en fait d'un petit bout de code qui indique au client où trouver son noyau et son système de fichiers initial et qui permet de passer quelques options au noyau.
Vous avez besoin du fichier pxelinux.0 fourni avec le paquet SYSLINUX de H. Peter Anvin. Vous pouvez l'installer comme ceci :
Exemple de code 4.5 : Installer syslinux |
# emerge syslinux
|
Note : Ceci n'est pas nécessaire si vous utilisez Etherboot. |
Avant de démarrer votre serveur TFTP, vous devez installer pxelinux. Copiez le binaire de pxelinux dans /diskless comme ceci :
Exemple de code 4.6 : Installer le démarreur à distance |
# cp /usr/share/syslinux/pxelinux.0 /diskless # mkdir /diskless/pxelinux.cfg # touch /diskless/pxelinux.cfg/default |
Cela va créer un fichier de configuration par défaut pour syslinux. Le binaire pxelinux.0 cherche son fichier de configuration dans le répertoire pxelinux.cfg. Il commence par chercher un fichier dont le nom est l'adresse IP attribuée au nœud écrite en hexadécimal. Si un tel fichier n'existe pas, pxelinux.0 enlève successivement le chiffre le plus à droite et regarde si un fichier correspondant existe jusqu'à ce qu'il trouve un fichier ou qu'il n'y ait plus de chiffre. Les version 2.05 et ultérieures de syslinux recherchent d'abord un fichier nommé d'après l'adresse MAC. Si ce fichier n'existe pas, la routine de recherche présentée ci-haut est effectuée. En dernier recours, le fichier default est utilisé.
Exemple de code 4.7 : Recherche du fichier de configuration dans pxelinux.cfg/ |
Le préfixe 01 indique le type ethernet. Les bits suivants correspondent à l'adresse MAC du nœud. 01-00-40-63-c2-ca-c9 (Adresse IP assignée, en hexadécimal) C0A80115 C0A8011 C0A801 C0A80 C0A8 C0A C0 C default |
Note : Tous les fichiers utilisent seulement des lettres minuscules. |
Utilisons simplement un fichier default :
Exemple de code 4.8 : Exemple de pxelinux.cfg/default |
DEFAULT /bzImage APPEND ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/diskless/192.168.1.21 |
L'option DEFAULT indique le chemin vers le noyau. L'option APPEND fournit les paramètres à passer au noyau. Puisque nous avons compilé le noyau avec l'option NFS_ROOT_SUPPORT, nous indiquons ici le chemin vers notre système de fichiers racine (le « root » via NFS). La première adresse IP est l'adresse du nœud maître et la seconde est le nom du répertoire que nous avons créé dans /diskless et qui contient le système de fichiers de l'esclave.
Note : Ceci ne vous intéresse pas si vous utilisez le démarrage via PXE. |
Le système Etherboot permet de démarrer à partir d'images stockées sur un serveur TFTP. Comme PXE, ceci est similaire à LILO ou GRUB. L'utilitaire mknbi permet de créer différentes images avec des options différentes.
Vous devez d'abord installer l'utilitaire mknbi qui permet de marquer des images de noyaux qui seront démarrés via le système Etherboot. Cet outil créera une image de votre noyau original et la configurera comme décrit ci-dessous.
Exemple de code 4.9 : Installer mknbi |
# emerge mknbi
|
Voyons comment configurer une simple image qui permet de démarrer via Etherboot. Comme le serveur DHCP définit la racine utilisée par les clients dans l'option « option root-path » dans le fichier dhcp.conf, il n'est pas nécessaire de la spécifier ici. Veuillez consulter la page man de mknbi pour plus d'informations.
Exemple de code 4.10 : Afficher la page man de mknbi |
# man mknbi
|
Pour créer une image ELF démarrable qui sait passer les paramètres DHCP et la racine à utiliser au noyau tout en forçant le noyau à demander une adresse IP via DHCP, faites :
Exemple de code 4.11 : Créer une image Etherboot |
# mkelf-linux -ip=dhcp /diskless/bzImage > /diskless/vmlinuz
|
Note : Pour une architecture spécifique, utilisez bzImage_arch et vmlinuz_arch. |
Problèmes lors du démarrage via le réseau
Il y a plusieurs façons de résoudre les problèmes de démarrage via le réseau. Un outil fréquemment utilisé est tcpdump. Pour l'installer, faites :
Exemple de code 4.12 : Installer tcpdump |
# emerge tcpdump
|
Maintenant, vous pouvez surveiller le trafic réseau et vous assurer que votre serveur et les clients se parlent. En cas de problèmes, vous devriez d'abord vérifier que vos machines sont physiquement connectées et que les câbles ne sont pas endommagés. Vous devriez aussi vous assurer que le trafic n'est pas bloqué par un pare-feu. Pour visualiser le dialogue entre deux ordinateurs, faites :
Exemple de code 4.13 : Visualiser le dialogue entre deux ordinateurs avec tcpdump |
# tcpdump host ip_client and ip_server |
Vous pouvez aussi surveiller un port particulier, celui du serveur TFTP par exemple :
Exemple de code 4.14 : Surveiller le port du serveur TFTP |
# tcpdump port 69
|
Une erreur fréquente est « PXE-E32: TFTP open time-out ». Elle est généralement causée par un pare-feu. Si vous utilisez TCPwrappers, vous devriez aussi vérifier que les fichiers /etc/hosts.allow et etc/hosts.deny soient correctement configurés. Les nœuds esclaves doivent avoir accès au maître.
5. Configuration du serveur NFS
NFS signifie « Network File System ». Un serveur NFS fournit un système de fichiers via le réseau. Cette partie peut être reconfigurée plus tard, mais nous voulons d'abord un système de base permettant au nœud esclave de démarrer.
Certains services ne sont pas toujours liés au même port, mais utilisent le système d'appel de fonction à distance (les RPC en anglais pour « Remote Procedure Call »). Dans ce cas, lorsqu'un service démarre, il écoute sur un port disponible choisi au hasard et il s'inscrit dans la liste de tels services tenue par le programme portmap. NFS utilise ce mécanisme et a besoin que le programme portmap soit actif avant de démarrer.
Pour pouvoir activer le serveur NFS, vous devez avoir compilé le noyau avec les options adéquates. Pour vérifier que cela a bien été fait, tapez :
Exemple de code 5.1 : Afficher les options NFS dans la configuration du noyau |
# grep NFS /usr/src/linux/.config_master
|
L'affichage devrait ressembler à ceci :
Exemple de code 5.2 : Configuration NFS correcte du noyau maître |
CONFIG_PACKET=y # CONFIG_PACKET_MMAP is not set # CONFIG_NETFILTER is not set CONFIG_NFS_FS=y CONFIG_NFS_V3=y # CONFIG_NFS_V4 is not set # CONFIG_NFS_DIRECTIO is not set CONFIG_NFSD=y CONFIG_NFSD_V3=y # CONFIG_NFSD_V4 is not set # CONFIG_NFSD_TCP is not set |
Le paquet NFS est installé via Portage comme ceci :
Exemple de code 5.3 : Installer nfs-utils |
# emerge nfs-utils
|
Ce paquet comprend le programme portmap, le serveur nfs et les utilitaires pour les clients NFS. Les dépendances lors de l'initialisation sont correctement résolues.
Il y a trois fichiers principaux à modifier :
Exemple de code 5.4 : Les fichiers de configuration relatifs à NFS |
/etc/exports /diskless/192.168.1.21/etc/fstab /etc/conf.d/nfs |
Le fichier /etc/exports indique comment, à qui et quels répertoires sont disponibles pour les clients NFS. Le fichier /etc/fstab des nœuds esclaves sera modifié pour monter les répertoires exportés par le maître.
Le fichier /etc/exports du maître devrait ressembler à ceci :
Exemple de code 5.5 : Exemple de /etc/exports sur le maître |
# Une ligne comme celle-ci par esclave. /diskless/192.168.1.21 192.168.1.21(rw,no_root_squash,no_all_squash) # Valable pour tous les esclaves. /opt 192.168.1.0/24(ro,no_root_squash,no_all_squash) /usr 192.168.1.0/24(ro,no_root_squash,no_all_squash) /home 192.168.1.0/24(rw,no_root_squash,no_all_squash) # Si vous voulez un journal commun à tous les nœuds. /var/log 192.168.1.21(rw,no_root_squash,no_all_squash) |
Le premier champ indique le nom du répertoire à exporter et le suivant spécifie qui peut l'utiliser et comment. Le « qui » indique quel nœud peut monter ce répertoire via le réseau et le « comment » liste ce que le nœud peut faire. L'option ro interdit l'écriture (=read-only) et rw l'autorise. Les options no_root_squash et no_all_squash sont importantes dans le cas de machines sans disque : elles permettent de préserver les identifiants (uid/gid) des clients.
Le fichier fstab /diskless/192.168.1.21/etc/fstab du nœud esclave devrait ressembler à ceci :
Exemple de code 5.6 : Exemple de /etc/fstab du nœud esclave |
# Ces lignes sont essentielles. master:/diskless/192.168.1.21 / nfs sync,hard,intr,rw,nolock,rsize=8192,wsize=8192 0 0 master:/opt /opt nfs sync,hard,intr,ro,nolock,rsize=8192,wsize=8192 0 0 master:/usr /usr nfs sync,hard,intr,ro,nolock,rsize=8192,wsize=8192 0 0 master:/home /home nfs sync,hard,intr,rw,nolock,rsize=8192,wsize=8192 0 0 none /proc proc defaults 0 0 # Utile, mais facultatif. master:/var/log /var/log nfs sync,hard,intr,rw 0 0 |
Dans cet exemple, master est le nom du nœud maître, mais il pourrait être remplacé par son adresse IP. Le premier champ indique l'endroit du répertoire à monter et le deuxième spécifie le point de montage sur le nœud esclave. Le troisième champ indique le type de système de fichiers (NFS dans notre cas). Le quatrième champ donne des indications au processus de montage des répertoires (voir mount(1) pour plus d'infos). Certains ont rencontré des problèmes avec l'option soft et nous avons donc opté pour des points montés avec l'option hard. vous devriez consulter la documentation relative aux options de /etc/fstab.
Le dernier fichier à modifier est /etc/conf.d/nfs. Il décrit les options de démarrage du serveur NFS. Il devrait ressembler à ceci :
Exemple de code 5.7 : Exemple de /etc/init.d/nfs sur le maître |
# Config file for /etc/init.d/nfs # Number of servers to be started up by default RPCNFSDCOUNT=8 # Options to pass to rpc.mountd RPCMOUNTDOPTS="" |
Vous devriez indiquer le nombre de machines sans disque de votre réseau sur l'option RPCNFSDCOUNT.
Vous pouvez lancer le serveur NFS grâce au script situé dans /etc/init.d comme ceci :
Exemple de code 5.8 : Lancer le serveur NFS sur le maître |
# /etc/init.d/nfs start
|
Si vous voulez ajouter ce script au processus de démarrage du maître, faites :
Exemple de code 5.9 : Lancer le serveur NFS au démarrage du nœud maître |
# rc-update add nfs default
|
6. Finaliser le système de fichiers du nœud esclave
Copier les fichiers nécessaires
Vous devez copier des fichiers du nœud maître dans le système de fichiers du nœud esclave. Faites ceci :
Exemple de code 6.1 : Créer le système de fichiers esclave |
# rsync -avz /bin /diskless/192.168.1.21 # rsync -avz /sbin /diskless/192.168.1.21 # rsync -avz /lib /diskless/192.168.1.21 |
Note : L'utilisation de rsync -avz permet de copier les liens symboliques et les permissions de fichiers. |
Configuration du réseau des machines diskless
Afin d'empêcher les scripts d'init du réseau de couper les connexions à votre serveur NFS, vous devez ajouter une option au fichier /etc/conf.d/net sur le système de fichiers de votre client diskless.
Exemple de code 6.2 : Modifier /etc/init.d/net |
(Ajoutez ceci pour les options existantes de l'interface de votre client diskless)
config_eth0=( "noop" )
|
Note : Pour plus d'informations, veuillez vous référer à /etc/conf.d/net.example. |
Vous pouvez avoir autant de scripts liés dans le sous-répertoire /diskless/192.168.1.21/etc/runlevels que de services à lancer sur votre nœud esclave. Cela ne dépend que de ce que vous voulez que vos esclaves fassent.
Attention : N'utilisez pas rc-update pour ajouter ou enlever des scripts d'initialisation sur vos esclaves en étant connecté sur le maître, car cela modifierait les niveaux d'exécution du maître. Vous devez créer les liens symboliques manuellement ou vous connecter au nœud esclave via ssh ou un clavier et un écran attachés à l'esclave. |
Exemple de code 6.3 : Exemple de niveaux d'exécution d'un esclave |
/diskless/192.168.1.21/etc/runlevels/: total 16 drwxr-xr-x 2 root root 4096 2003-11-09 15:27 boot drwxr-xr-x 2 root root 4096 2003-10-01 21:10 default drwxr-xr-x 2 root root 4096 2003-03-13 19:05 nonetwork drwxr-xr-x 2 root root 4096 2003-02-23 12:26 single /diskless/192.168.1.21/etc/runlevels/boot: total 0 lrwxrwxrwx 1 root root 20 2003-10-18 17:28 bootmisc -> /etc/init.d/bootmisc lrwxrwxrwx 1 root root 19 2003-10-18 17:28 checkfs -> /etc/init.d/checkfs lrwxrwxrwx 1 root root 17 2003-10-18 17:28 clock -> /etc/init.d/clock lrwxrwxrwx 1 root root 22 2003-10-18 17:28 domainname -> /etc/init.d/domainname lrwxrwxrwx 1 root root 20 2003-10-18 17:28 hostname -> /etc/init.d/hostname lrwxrwxrwx 1 root root 22 2003-10-18 17:28 localmount -> /etc/init.d/localmount lrwxrwxrwx 1 root root 19 2003-10-18 17:28 modules -> /etc/init.d/modules lrwxrwxrwx 1 root root 18 2003-10-18 17:28 net.lo -> /etc/init.d/net.lo lrwxrwxrwx 1 root root 20 2003-10-18 17:28 netmount -> /etc/init.d/netmount lrwxrwxrwx 1 root root 21 2003-10-18 17:28 rmnologin -> /etc/init.d/rmnologin lrwxrwxrwx 1 root root 19 2003-10-18 17:28 urandom -> /etc/init.d/urandom /diskless/192.168.1.21/etc/runlevels/default: total 0 lrwxrwxrwx 1 root root 23 2003-10-18 17:28 consolefont -> /etc/init.d/consolefont lrwxrwxrwx 1 root root 19 2003-10-18 17:28 distccd -> /etc/init.d/distccd lrwxrwxrwx 1 root root 19 2003-10-18 17:28 keymaps -> /etc/init.d/keymaps lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/init.d/local lrwxrwxrwx 1 root root 16 2003-10-18 17:28 sshd -> /etc/init.d/sshd lrwxrwxrwx 1 root root 21 2003-10-18 17:28 syslog-ng -> /etc/init.d/syslog-ng lrwxrwxrwx 1 root root 17 2003-10-18 17:28 vixie-cron -> /etc/init.d/vixie-cron /diskless/192.168.1.21/etc/runlevels/nonetwork: total 0 lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/init.d/local /diskless/192.168.1.21/etc/runlevels/single: total 0 |
C'est le moment de démarrer votre nœud esclave et de croiser les doigts. Ça marche ? Bravo, vous disposez maintenant d'un PC sans disque fonctionnel.
Ce document est protégé par la licence Creative Commons : Paternité - Partage des Conditions Initiales à l'Identique 2.5.