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.
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.
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 :
cp -a /dev /tftpboot/client-IP/dev
ne pas oublier que les devices console, mouse, cdrom et modem sont
des liens symboliques, à modifier le cas échéant.
cp -a /lib/libc.so* /lib/libtermcap.so* /lib/ld* /tftpboot/client-IP/lib
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.
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 !
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.
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.
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 :
mknod /dev/nfsroot b 0 255
rdev (kernel-image) /dev/nfsroot
cp (kernel-image) /dev/fd0
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.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
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.
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.