La Cellule Informatique de l'IMB -> Présentation du réseau -> Les ressources du réseau de l'IMB -> Postes de travail "clients légers" et "terminaux X"

Installation rapide d'un serveur de PCs diskless depuis LTSP

 

L'objet de ce travail est de présenter synthétiquement comment déployer rapidement des machines individuelles sans administration (sans disque dur) en partant du projet LTSP, et en dérivant assez rapidement.

Pour mettre en oeuvre ce mécanisme, je me suis largement appuyé sur la mandrake-10.1 Community mais surtout sur le support de udev et hotplug pour la détection automatique des périphériques. L'utilisation de ces mécanismes est fortement conseillée pour continuer ce document, donc essayez de vous baser sur une distribution supportant le noyau 2.6, udev et hotplug.

Principes de Boot

Le PC diskless s'appuie sur un mécanisme de boot réseau PXE. Pour déployer ce système il faut un serveur DHCP dans lequel on renseigne pour chaque machine le champ
filename=pxelinux.0 (boot-loader provenant du projet syslinux)
next-server=serveur_diskless (IP du serveur diskless)

Sur le serveur Diskless doit être présent le service tftpboot bien configuré. Ce service permet de récupérer et le boot-loader et le noyau par la suite.

Imaginons que tftpboot mette à disposition le dossier /tftpboot, dans ce dossier, nous déposons le fichier pxelinux.0 ainsi qu'un répertoire pxelinux.cfg contenant le fichier default

Contenu du fichier /tftpboot/pxelinux.cfg/default :


timeout 20

prompt 1

default linux

label linux

kernel vmlinuz

append nfsroot=IP_du_serveur :/tftpboot/root ip=dhcp ramdisk_size=132000


(La taille du ramdisk permettra d'y loger le dossier /tmp du PC diskless).

Ensuite, il faut reprendre le source du noyau linux provenant de votre distribution (avec son fichier .config... dans notre cas un noyau 2.6.8-1) et modifier la configuration de cette façon :

Dans Device Drivers->Networking support->TCP/IP networking->IP : kernel level autoconfiguration->IP : DHCP support=Y
Dans Block Devices->RAM disk support=Y et Initial RAM disk (initrd) support=Y
-  Dans File systems->Network File Systems->Provide NFSv3 client support=Y et Root file system on NFS=Y
-  Configurer la carte réseau du PC client dans le noyau et non pas en module
-  compiler avec make bzImage
-  copier ensuite bzImage :cp arch/i386/boot/bzImage /tftpboot/vmlinuz
-  compiler ensuite les modules : make modules ; make modules_install

A ce niveau, un PC peut démarrer sur sa carte réseau en PXE, récupérer les bonnes informations du serveur DHCP, charger le boot-loader et ensuite le noyau. Le noyau va tenter de monter par NFS la racine du système de fichiers.

Maintenant, il faut configurer l'arborescence qui va héberger le système de fichier minimal pour chaque client.

Racine pour le client diskless

Il faut configurer le serveur afin qu'il exporte par NFS à l'ensemble des clients diskless les arborescences nécessaires en lecture seule, par exemple :

/tftpboot/root *.mon_domaine(ro)
/tftpboot/lib *.mon_domaine(ro)
/tftpboot/bin *.mon_domaine(ro)
/tftpboot/usr *.mon_domaine(ro)
/tftpboot/sbin *.mon_domaine(ro)

Ensuite, il faut copier et créer dans /tftpboot/root les dossiers nécessaires :

cp -a /bin /tftpboot/root
cp -a /lib /tftpboot/root
cp -a /sbin /tftpboot/root
cp -a /etc /tftpboot/root

(Pour un gain de place, on peut retirer le dossier modules du répertoire /tftpboot/root/lib)

Ensuite, il faut récupérer deux petits utilitaires du projet LTSP : la commande getltscfg qui est dispobible dans l'archive ltsp-getltscfg-1.2-0-i386.tgz sur le site LTSP et le petit fichier etc/ltsp_functions :

function get_cfg()
#
# Usage : get_cfg PARM [DEFAULT]
#
VALUE=`/ltsbin/getltscfg $1`
if [ "$#" -gt 1 -a -z "$VALUE" ] ; then
echo $2
else
echo $VALUE
fi

A ce niveau, il reste maintenant à adapter le dossier /tftpboot/root/etc et autres pour un boot normal du client diskless

renommer fstab en fstab.orig
-  créer un lien fstab->/tmp/.etc/fstab
-  remplacer resolv.conf par resolv.conf->/tmp/.etc/resolv.conf
-  remplacer syslog.conf->/tmp/.etc/syslog.conf
-  remplacer hosts->/tmp/.etc/hosts
-  remplacer mtab->/proc/mount
-  remplacer X11/XF86Config->/tmp/.etc/XF86Config

modifier inittab par :
--------------------------------------------
id:5:initdefault:

si::sysinit:/bin/sh /etc/rc.local
0:2:once:/etc/set_runlevel

l0:0:wait:/etc/rc.d/rc 0
l6:6:wait:/etc/rc.d/rc 6
x:5:respawn:/etc/X11/prefdm -nodaemon
--------------------------------------------

Ensuite tout se fait dans etc/rc.local (voir le fichier proposé enfin de document)

Ensuite, pour la gestion de hotplug, il faut créer le lien suivant : mnt->/tmp/.etc/mnt

et le dossier dev/ doit contenir les fichiers spéciaux et dossiers suivants :
crw-r--r-- 1 root root 4, 0 nov 22 2001 console
drwxr-xr-x 2 root root 4096 déc 7 2001 inet/
drwxr-xr-x 2 root root 4096 sep 2 17:50 input/
crw-r--r-- 1 root root 1, 1 nov 22 2001 mem
lrwxrwxrwx 1 root root 14 oct 12 10:56 null -> /tmp/.dev/null
drwxr-xr-x 2 root root 4096 oct 12 11:08 pts/
brw-r--r-- 1 root root 1, 1 nov 22 2001 ram
brw-r--r-- 1 root root 1, 2 jun 17 2002 ram2
drwxr-xr-x 2 root root 4096 oct 12 11:08 shm/
lrwxrwxrwx 1 root root 14 oct 12 11:04 tty0 -> /tmp/.dev/tty0
crw-rw-rw- 1 root root 1, 5 jun 17 2002 zero

Le principe de boot est géré par l'exécution du script rc.local qui suit les étapes suivantes :

lit le fichier etc/lts.conf dans lequel on peut préciser des valeurs à des variables utilisées par rc.local (on peut ainsi configurer différement les machines en fonctionde leur IP) (voir la doc de LTSP pour configurer lts.conf ou le fichier en fin de document)
crée un ramdisk suffisant pour accueillir /tmp et aussi un petit fichier swapfile pour permettre au noyau de swaper
-  monte au plus tôt l'arborescence du serveur (/lib, /bin, /usr et /sbin)
-  fabrique les répertoires temporaires dans le ramdisk
-  exécute rc.sysinit standard (à épurer des remontages de / en read-write et autres petites erreurs dû au diskless)
-  copie un fichier XF86Config correct (en fonction de l'IP de la machine cliente)
-  exécute les services nécessaires dans /etc/init.d/
-  et se termine pour laisser la place au niveau 5 (lancement de X11)

Et voila, à vous de tester..

Philippe Depouilly

rc.localrc.local - fichier de boot pour le client diskless
lts.conf - fichier de configuration par IP de chaque client diskless