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.
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.
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