Gentoo sur des machines sans disque
1.
Introduction
À propos de ce guide
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.
Avant de commencer
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
À propos du noyau
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
[*] 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
# 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.
À propos du noyau esclave
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
À propos 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.
Avant de commencer
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.
Installation du serveur DHCP
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.
Configuration du serveur DHCP
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 |
ddns-update-style none;
shared-network LOCAL-NET {
subnet 192.168.1.0 netmask 255.255.255.0 {
host slave{
}
group {
}
}
}
|
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
|
Activer le serveur DHCP
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"
|
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
À propos du serveur TFTP
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.
Installation du serveur TFTP
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
|
Configuration du serveur TFTP
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.
Activer le serveur TFTP
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
|
À propos de PXELINUX
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.
Avant de commencer
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
|
Configuration de PXELINUX
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/ |
01-00-40-63-c2-ca-c9
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.
À propos de Etherboot
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.
Avant de commencer
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
|
Configurer Etherboot
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 and
|
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
À propos 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.
À propos de portmap
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.
Avant de commencer
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
|
Installation du serveur NFS
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.
Configuration du serveur NFS
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 |
/diskless/192.168.1.21 192.168.1.21(rw,no_root_squash,no_all_squash)
/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)
/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 |
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
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.
Activer le serveur NFS
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 |
config_eth0=( "noop" )
|
Note :
Pour plus d'informations, veuillez vous référer à
/etc/conf.d/net.example.
|
Scripts d'initialisation
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.
|