Previous Next Table of Contents

15. NFS-Root : booter une machine par le réseau

NFS-Root permet d'utiliser une partition NFS comme partition root (/). Cette possibilité est particulièrement utile pour une station dépourvue de disque local (diskless), un terminal X, un serveur d'impression ou un ordinateur ne disposant pas de disque dur dédié à Linux.

Le principe est de créer sur un serveur l'arborescence du client. Celui-ci bootera à l'aide d'un noyau sur une disquette ou sur une partition MS-DOS avec LOADLIN, puis utilisera NFS pour récupérer les fichiers nécessaires à la suite de son démarrage.

15.1 Création de l'arborescence du client

Il faut créer sur le serveur toute l'arborescence nécessaire au fonctionnement du client. Une solution consiste à recopier froidement la racine de son serveur puis de modifier les fichiers spécifiques. Cette solution est extrêmement gourmande en place surtout si l'on envisage plusieurs clients utilisant NFS-Root. Je propose donc une solution qui permet de limiter le nombre de fichiers à recopier en utilisant directement ceux disponibles sur le serveur.

Création de la partition root du client

Nous allons essayer de limiter au maximum la taille de ce répertoire en utilisant des liens symboliques et en recopiant uniquement les fichiers indispensables au boot ainsi que ceux spécifiques à chaque station. Les autres répertoires étant soit directement ceux du serveur exportés par NFS, soit un répertoire commun aux différents clients, différent du serveur et également exporté par NFS.

Par défaut NFS-Root monte le répertoire /tftpboot/client-IP.
client-IP étant l'adresse IP du client qui aura soit été passé en paramètre lors du boot, soit découverte par une requête rarp. Ce chemin peut être changé à la compilation du noyau ou passé en paramètre à LILO.

Dans ce répertoire /tftpboot/client-IP, il faut donc créer les répertoires :

bin, dev, etc, home, lib, mnt, proc, sbin, commun, tmp, usr, var
ainsi que les autres répertoires dont vous avez besoin.

Il faut maintenant remplir les différents répertoires :

Pour ces quatre répertoires, des liens "durs" peuvent également être utilisés au lieu de recopier les fichiers, permettant d'économiser autant de place disque, mais avec les soucis que peuvent entraîner les liens durs... A réserver donc aux utilisateurs expérimentés.

Les répertoires var et etc, partagés entre les clients

Le répertoire var doit avoir une partie privée, et une partie commune aux autres clients.
Le répertoire commun à tous les clients, sera placé dans /tftpboot/commun/. Il contiendra une copie des répertoires /var/catman et /var/lib du serveur, qui sont particulièrement volumineux.

Le répertoire /tftpboot/client-IP/var, contiendra donc tous les répertoires restant de var. En recopiant celui-ci à partir du serveur, veillez à bien conserver l'arborescence, mais n'hésitez pas à détruire les fichiers de logs créés et qui augmentent à chaque démarrage. On créera aussi 2 liens symboliques :

ln -s /commun/catman /tftpboot/client-IP/var/catman
ln -s /commun/lib    /tftpboot/client-IP/var/lib

Le même principe sera utilisé pour le fichier termcap de etc, relativement volumineux. Il sera recopié également dans le répertoire /tftpboot/commun/, avant de faire le lien :

ln -s /commun/termcap /tftpboot/client-IP/etc/termcap

Les autres fichiers de etc nécessaires au client seront enfin recopiés dans le répertoire /tftpboot/client-IP/etc

Avec cette méthode, le répertoire root de chaque client fait, chez moi, 1.4 Mo, ce qui reste très résonnable comparé à la taille que peut prendre une copie de l'intégralité d'une arborescence !

Paramétrage du client, avec les fichiers de etc

Il est enfin nécessaire de configurer les différents fichiers de /tftpboot/client-IP/etc/ qui vont permettre à notre client de booter correctement par NFS.

Tout d'abord, le fichier fstab indispensable pour monter les différentes partitions doit contenir au moins :

/dev/root                      /               nfs     defaults        1 1
serveur:/bin                   /bin            nfs     defaults        1 1
serveur:/usr                   /usr            nfs     defaults        1 1
serveur:/sbin                  /sbin           nfs     defaults        1 1
serveur:/home                  /home           nfs     defaults        1 1
serveur:/lib                   /lib            nfs     defaults        1 1
serveur:/users                 /users          nfs     defaults        1 1
serveur:/tftpboot/commun       /commun         nfs     defaults        1 1
none                           /proc           proc    defaults        0 0
serveur étant bien entendu à remplacer par le nom du serveur NFS-Root.

Il faut également modifier le nom de la machine, le fichiers hosts et les différents fichiers de la machine décris dans les sections précédentes.

Dans le fichier rc.d/rc.sysinit, rajouter au début les 2 lignes :

mount -a
echo "NFS-Root" > /fastboot
Cela permet de monter le reste de l'arborescence. Le fichier /fastboot permet d'éviter les fsck inutile pour les partitions NFS. Il est également nécessaire de commenter ou de supprimer toutes les autres lignes faisant un mount ou un umount.

Dans les différents répertoires rcn.d, supprimez les services inutiles. De plus il faut supprimer dans rc.d/rc3.d/ les liens S10network et S15nfsfs qui génèrent des messages d'erreur, et font même planter le système lorsqu'ils tentent de reconfigurer les interfaces réseau alors déjà utilisées.

Enfin je vous conseille de créer des fichiers passwd et group minimaux. Utiliser NYS pour le client parait une solution naturelle et efficace pour conserver ces fichiers à jour, à plus forte raison dans le cas ou plusieurs clients NFS-Root sont envisagés.

15.2 Configuration du serveur

La configuration du serveur est relativement rapide. Tout d'abord, ajouter une entrée pour votre client dans le fichier /etc/hosts, modifier le fichier /etc/hosts.allow également pour que le client puisse accéder aux partitions exportés par NFS.

Enfin, ajouter au fichier /etc/exports :

/tftpboot/192.168.1.120         kashmir(rw,no_root_squash)
/tftpboot/commun                kashmir(ro,no_root_squash)
/usr                            kashmir(ro,no_root_squash)
/sbin                           kashmir(ro,no_root_squash)
/bin                            kashmir(ro,no_root_squash)
/lib                            kashmir(ro,no_root_squash)
/home                           kashmir(rw,no_root_squash)
/users                          kashmir(rw,no_root_squash)
kashmir étant le nom de mon client correspondant à l'entrée de /etc/hosts qui est comme vous l'avez remarqué doté de l'adresse 192.168.1.120

Ne pas oublier ensuite de redémarrer le service NFS.

Le noyau du serveur doit être également configuré avec le support NFS et Reverse ARP. Pour s'en assurer, vérifier l'existence du fichier /proc/net/rarp et de la ligne nodev nfs dans /proc/filesystems

Enfin configurer rarp permet au client de booter de façon automatique. Pour cela, ajouter la ligne :

/sbin/rarp -s 192.168.1.120 00:40:F6:7A:BC:45
le premier paramètre étant l'adresse IP du client, et le second étant l'adresse de la carte Ethernet.

Pour connaître l'adresse de votre carte Ethernet, bootez sur votre client un noyau avec le support de votre carte Ethernet. Les 6 chiffres affichés à ce moment là doivent correspondre à ce que vous cherchez.
Il peut être judicieux d'inclure cette ligne dans /etc/rc.d/rc.sysconfig pour ne pas avoir à taper la commande à chaque boot du serveur.

15.3 Création du noyau et paramétrage du client lors du boot

Le noyau du client doit avoir les options NFS-Root et Rarp configurées. De plus n'oubliez pas la configuration de votre carte Ethernet, et éventuellement des périphériques SCSI ou autres.

Si vous comptez démarrer votre station sans entrer de paramètres, il faut :

Si tout va bien, la station devrait démarrer correctement.

Si toutefois, la configuration de rarp pose des problèmes, ou que le client ne se trouve pas sur le même noeud que le serveur, vous pouvez passer des paramètres au noyau pour contourner ces soucis. Ils peuvent même éventuellement être ajoutés dans la close append du lilo.conf

Ainsi vous pouvez modifier le chemin par défaut /tftpboot/client-IP en passant au noyau le paramètre :

nfsroot=serveur-IP:/chemin/root-dir
serveur-IP étant un paramètre facultatif permettant de donner l'adresse du serveur NFS-Root éventuellement différent du serveur Rarp.
/chemin/root-dir étant le nouveau chemin du répertoire contenant l'arborescence root pour le client. Un token "%s" sera remplacé par la représentation ASCII de l'adresse IP du client.
L'adresse par défaut étant donc noté "/tftpboot/%s"

Un autre paramètre permet de donner au client toutes les informations nécessaires à son démarrage, avec la ligne suivante :

nfsaddrs=(client-IP):(serveur-IP):(gw-IP)::(hostname)::none
En passant ces paramètres au noyau, la configuration de rarp est inutile et ignoré. Cela peut-être pratique si le client NFS-Root est lancé sur différentes machine. En effet il n'y aura alors pas besoin de se soucier de l'adresse de la carte Ethernet.

Il est également possible d'utiliser bootp ou encore dhcpd qui sont plus complets Rarp pour que le client récupère ses paramètres, mais leur configuration est un peu plus délicate et de toute façon, rarp suffit largement à la majorité des utilisations.

15.4 Ajouter un nouveau client

Une fois l'arborescence du premier client créée et fonctionnant, la mise en place de plusieurs autres clients est une partie de plaisir.

Il suffit de recopier le répertoire root /tftpboot/client-IP du premier client dans un nouveau répertoire :

cp -a /tftpboot/client-IP /tftpboot/nouveau-client-IP
nouveau-client-IP étant l'adresse IP du nouveau client.

Ensuite il suffit de modifier les fichiers désignant le nom du nouveau client etc/HOSTNAME, etc/hosts et etc/sysconfig/network, et éventuellement d'autres fichiers de etc si le nouveau client à de nouvelles spécificités.

Sur le serveur, enfin, il faut ajouter l'adresse de notre nouveau client au fichier /etc/hosts. Ajouter une entrée dans /etc/exports pour le répertoire root, et lui donner les droits pour tous les autres répertoires qu'il partage avec les différents clients (/tftpboot/commun /bin /usr /lib /sbin /home /users).
Chaque ligne ressemble pour 2 client (kashmir et firestarter) à :

/lib              kashmir(ro,no_root_squash) firestarter(ro,no_root_squash)
Relancer enfin le service NFS.

Les 2 clients sont maintenant capable de démarrer et de fonctionner ensemble sur le serveur.


Previous Next Table of Contents