Webmail Espace privé About
Home   Debian Addict Testing

Créer un serveur d’application (1/2)

Partie 1 - La création d’un diskless
vendredi 17 septembre 2004.
 

Regardez ce vieux PC qui traîne dans le fond du placard. Il ne sert plus à rien et il n’est même pas digne d’être légué à un membre (même mal aimé) de la famille tellement sa puissance laisse à désirer. Et puis, il n’y a que vous qui ne sachiez l’aimer à sa vrai valeur !
Toute une scène à la Zola me direz vous. Bah p’tet bien, car il ne va pas mourir non ! Il va même renaître de ces cendres la ruine !

Préambule

« Bon alors, comment on fait ? »
Avant tout, il faut savoir que votre, ou vos anciens PC ne se sortiront pas du placard tout seul. Il faudra une machine de puissance convenable pour lui filer un coup de main. La répartition des rôles :

- La machine puissante sera le serveur d’application
- Votre vieux PC sera le terminal.

L’idée est assez simple : Il s’agit de faire en sorte que votre vieux PC (le terminal) ne calcule quasiment plus, dispose de plus de mémoire et que l’installation du système d’exploitation soit centralisée sur le serveur.

L’article se présente en deux parties ; avant tout, je vous expliquerais comment créer un diskless (voir ci-après), puis je vous révèlerais comment transformer votre simple terminal en terminal X, qui est l’aboutissement du serveur d’application.

Prérequis

Vous l’aurez compris, il va vous falloir au moins deux ordinateurs dont un avec un minimum de puissance. Mais plus clairement :

- Un switch & du RJ45 ou un RJ45 croisé
- Un PC récent

  • équipé d’une Debian (of course)
  • d’une puissance correcte (comprenez qui vous convienne à l’utilisation)
  • équipé d’une carte réseau

- Une vieille machine (on peut mettre du matériel récent, mais ça ne changera quasiment rien)

  • équipé d’une carte réseau
  • un lecteur de disquette si le bios ne permet pas de booter sur lan (réseau) (Je précise que le vieux PC n’a ni besoin de lecteur de CD ni de HDD)

Vue d’ensemble

Le but sur un diskless (un terminal sans disque de quelques sorte que ce soit) est de charger un système d’exploitation par le réseau. Il sera donc impératif d’expliquer le fonctionnement de quelques serveurs réseaux (TFTP, NFS, DHCPD, inetd...) afin de pouvoir bien maîtriser la sécurité. Le démarrage réseau va demander un noyau monolithique(non modulaire), car il sera chargé d’un seul bloc, et « taggé » pour être pris en charge au boot. Et enfin, sachez que, sauf indication contraire, nous travaillerons toujours sur le serveur.

Etherboot

Afin de permettre le démarrage du terminal, vous avez deux solutions. Soit vous démarrez sur disquette, soit vous disposez d’un boot lan dans le bios du terminal, auquel cas vous l’activez. Dans le premier cas, vous utiliserez Etherboot. Il existe des sites qui vous fourniront directement la rom (ex. :rom-o-matic) ce qui vous évitera la compilation.

Etherboot est un microcode qui peut être utilisé pour flasher la ROM de certaines cartes réseau, soit être utilisé sur disquette pour un boot normal. Etherboot se lance au démarrage, juste après avoir chargé les pilotes de la carte réseau et recherche un DHCPD sur le réseau. Une fois la disquette créée, il ne vous reste plus qu’à démarrer dessus en l’insérant dans le terminal et en le redémarrant (NB : Verifiez bien que le bios démarre sur le lecteur de disquette : 1st Boot : floppy ). Lors du chargement de Etherboot, vous apercevrez une ligne Address : 00:11:22:33:44:55. Elle est à noter : c’est l’adresse Mac de votre carte réseau. Voilà, vous devez maintenant configurer le serveur d’application, et pour commencer le DHCPD.

Le serveur DHCP

Là vous vous dites « C’est parti pour la série des noms barbares... », quoique celui-ci vous l’avez forcément déjà entendu quelque part. Alors c’est quoi un DHCP ? Texto c’est un Protocole de Configuration Dynamiques des Hotes (Dynamic Host Configuration Protocol). Ceux qui ont un routeur ADSL le connaissent peut être car il leurs permet d’obtenir automatiquement les paramètres de configuration réseau de leur machine (passerelle, adresse ip...). Ici il nous servira à un peu plus qu’une simple configuration d’IP. Nous allons utiliser le serveur ISC DHCP dont les fonctionnalités nous permettrons de faire charger un noyau au terminal. La commande pour le mettre en place :

$ apt-get install dhcp

Avant toute chose il faut que vous récupériez l’adresse Mac de votre carte réseau. Vous pourrez par exemple utiliser la commande ifconfig en précisant la carte réseau désirée eth0 :

snorky:~# /sbin/ifconfig eth0 | grep HWaddr
eth0      Lien encap:Ethernet  HWaddr 00:30:11:22:33:44

Si vous n’avez pas la possibilité de la récupérer, vous pouvez booter avec une disquette créée sur rom-o-matic (voir plus haut). ici, mon adresse Mac est 00:30:11:22:33:44, elle sera à indiquer dans le fichier de config du serveur DHCP. Celui-ci se trouve dans /etc/dhcpd.conf. Voici une partie de ce à quoi il devrait ressembler pour permettre le boot réseau :

Nous voyons la configuration de l’hôte portable et dans ses paramètres une zone hardware ethernet où l’on retrouve l’adresse matérielle (adresse Mac). L’avantage de l’adresse matérielle c’est qu’elle est unique au monde pour chaque carte réseau ainsi, ces paramètres ne seront fournis qu’à une et une seule carte réseau. Ici, l’hôte portable sera la configuration qui servira de terminal (pour information c’est un Armada 1700 PII233MHz avec 32Mo de ram ). Notez qu’il lui est attribué une adresse IP fixe avec l’option fixed-address 10.0.0.4; ce qui est obligatoire pour permettre les partages NFS qui lui seront attribués. Dernière chose, filename "/tftpboot/kernel.nbi"; qui spécifie au client le fichier à charger. Une fois votre fichier de configuration modifié, vous pourrez le redémarrer à l’aide de la commande /etc/init.d/dhcp restart. Une fois la configuration des hôtes dans le DHCP réalisée, vous devrez déclarer les hôtes dans le fichier /etc/hosts :

La compilation du noyau

Maintenant que le serveur DHCPD est configuré, il vous reste à préparer le noyau que le terminal va démarrer. Comme je vous l’indiquais plus haut, le noyau est monolithique, d’un seul bloque si vous préférez. Par conséquent, toutes les parties que vous ne sélectionnerez pas ou que vous sélectionnerez en module seront totalement ignorées !

Vu que le boot sera réseau, il sera nécessaire d’avoir un support réseau NFS et une config IP automatique. De même pour l’utilisation du serveur X par la suite, pensez à ajouter en fixe ([*] et non [M] ou encore [ ]) la souris, ce qui vous évitera une recompilation partielle du noyau pour la deuxième partie de l’article.

Pour le noyau, choisissez en un qui, de préférence, est reconnu comme fiable et pas trop lourd. Pour ma part, j’utilise le 2.4.27. Pour plus d’informations concernant la compilation d’un noyau linux, vous pouvez vous référer à l’article Compiler un noyau GNU/Linux.

Avant tout, il nous faut récupérer les sources du noyau, ainsi que les bibliothèques ncurses pour permettre l’utilisation du make menuconfig.(make et gcc devraient déjà être installés sur votre machine, mais au cas où...).

snorky:~# apt-get install make gcc kernel-source-2.4.27 libncurses5-dev

Il est fortement possible que des paquets viennent s’adjoindre à la liste, c’est comme d’habitude l’excellent apt :) qui complète les dépendances requises pour la compilation du noyau . Ensuite, en tant qu’utilisateur, nous allons lancer la compilation du noyau, après avoir copié les sources dans notre répertoire personnel :

brice@snorky:~$ mkdir src && cd src
brice@snorky:~/src$ tar xvjf /usr/src/kernel-source-2.4.27.tar.bz2
brice@snorky:~/src$ cd kernel-source-2.4.27
brice@snorky:~/src/kernel-source-2.4.27$ make menuconfig

Et là vous choisissez :
- Networking options --->

  • [*]   IP: kernel level autoconfiguration
  • [*]     IP: DHCP support (NEW)

- File systems --->

  • Network File Systems  --->
    • <*> NFS file system support
    • [*]   Root file system on NFS

- Network device support --->

  • Ethernet (10 or 100Mbit) (ou toute autre rubrique correspondant à votre matériel réseau)
    • <*>     TI ThunderLAN support (Ce choix me concerne uniquement car ma carte réseau fonctionne avec le pilote TLAN, à vous de sélectionner le bon pilote pour votre carte réseau)

- Character devices  --->

  • Mice  --->
    • <*> Mouse Support (not serial and bus mice)
    • [*]   PS/2 mouse (aka "auxiliary device") support

Puis vous sauvegardez votre fichier de configuration en répondant yes à la sortie du configurateur. Il ne vous reste plus qu’à lancer la compilation du noyau, mais toutefois, avec une légère différence car vous devez absolument utiliser un noyau compressé. Ainsi la ligne de commande sera la suivante :

brice@snorky:~/src/kernel-source-2.4.27$ make dep
brice@snorky:~/src/kernel-source-2.4.27$ make bzImage

Une fois la (longue) compilation du noyau terminée, vous trouverez l’image compressée dans le répertoire arch/i386/boot/bzImage du répertoire source du noyau. Logiquement, vous devriez atteindre un noyau d’environs 1,2 Mo . Une fois tout cela réalisé, vous le laissez de côté, il nous servira (après quelques modifications) aux étapes suivantes.

tftp

Maintenant, il nous faut un programme de communication simple et direct pour transmettre le noyau aux terminaux. Le TFTP (Trivial File Transfer Program) est, à la différence de FTP, un serveur de données sans authentification. De ce fait, il est à manier avec prudence, car il permet à toute personne accessible par le réseau d’avoir un accès en lecture, voir écriture, aux fichiers qu’il partage. Pour installer le serveur TFTP, en root tapez :

snorky:~# apt-get install tftpd

Une fois installé, il ajoutera une ligne dans le /etc/inetd.conf , car c’est le super serveur inet qui s’occupera d’écouter(entre autre) les ports pour tftpd.

Ainsi, votre /etc/inetd.conf devrait ressembler à :

Ici, on s’aperçoit que tftpd n’est pas lancé directement mais est en fait encapsulé par tcpd. L’avantage est que tcpd va, en partie, combler les problèmes de sécurité que tftpd et inet engendrent en sélectionnant les hôtes de confiance et en fermant les ports des autres. Vous aurez, grâce à tcpd la possibilité de limiter les hosts qui auront les autorisations d’écoute grâce au fichier /etc/hosts.allow et /etc/host.deny ( man hosts_access pour plus d’information ). Enfin, le paramètre de tftpd est /boot, ce qui ne me convient pas, pour raison de sécurité. Nous allons donc le modifier pour /tftpboot, un répertoire que nous allons créer avec des droits de lecture uniquement et pour tous : (en root)

snorky:~# mkdir /tftpboot
snorky:~# chmod 755 /tftpboot
snorky:~# ls -l / | grep tftpboot
drwxr-xr-x    2 root root   4096 2004-09-10 16:50 tftpboot

Nous allons y mettre le noyau, moyennant quelques modifications pour permettre le boot réseau.

L’utilitaire mknbi

mknbi (MaKe Network Bootable Image) vous permet de créer des images chargeables par le réseau via des noyaux au format zImage ou bzImage. Pour l’installation tapez :

snorky:~# apt-get install mknbi

Pour créer notre image bootable, nous allons utiliser la commande mkelf-linux avec les paramètres --ip= et --rootdir= qui seront en fait les variables d’initialisation du noyau sur le client. Après vous être placé dans le répertoire arch/i386/boot/ où se trouve le noyau précédemment compilé, tapez (en root toujours) :

# mkelf-linux  --output=/tftpboot/kernel.nbi --ip=dhcp --rootdir=/var/lib/diskless/default/root bzImage

Vérifiez que le fichier kernel.nbi a bien été créé dans le répertoire /tftpboot puis, pour mettre à disposition le noyau sur le réseau, relancez inet par la commande :

snorky:~# /etc/init.d/inetd.real restart

Voilà, le terminal, devrait se charger, jusqu’à bloquer au chargement du système de fichier NFS (avec un kernel panic possible) que nous étudierons et mettrons en place dans un chapitre suivant. NB : Il est possible que vous ayez à relancer le serveur DHCP. Si c’est nécessaire, tapez :

snorky:~# /etc/init.d/dhcp restart

Distribution pour les clients

La machine démarre, le noyau compilé et marqué pour le boot réseau se charge et s’initialise sur le terminal et le serveur DHCP lui indique la bonne marche à suivre. Il ne reste plus grand chose au final, si ce n’est lui fournir un système d’exploitation complet par le réseau. Nous n’allons pas lui fournir le système d’exploitation du serveur, car celui-ci sera sans doute remodelé dans le temps avec d’autre besoin que ceux des terminaux. De plus, il est possible que vous souhaitiez démarrer certains terminaux sur des distributions un peu modifiées sans craindre de détériorer le serveur.

Il va nous falloir quelques ingrédients pour créer la distribution que nous allons utiliser pour les clients (terminaux). Aujourd’hui, Debian ne fourni plus de fichier base.tgz contenant les fichiers de base de la distribution. Par conséquent, nous allons utiliser les utilitaires diskless pour la créer.

snorky:~# apt-get install diskless

Une fois installée, il suffit de créer les répertoires qui vont recueillir la distribution, dont un temporaire pour les fichiers téléchargés-décompressés :

snorky:~# mkdir /tmp/diskless
snorky:~# mkdir /var/lib/diskless
snorky:~# mkdir /var/lib/diskless/default
snorky:~# diskless-createbasetgz /tmp/diskless woody http://ftp.fr.debian.org/debian /var/lib/diskless/default/base.tgz

La dernière ligne de commande télécharge les fichiers de base de la woody et en fait un tarball dans /var/lib/diskless/default/base.tgz. Vous devez maintenant récupérer le paquet diskless-newimage mais ne pas l’installer, ce qui est possible avec l’option -download-only d’apt-get, ce qui va placer le paquet dans le répertoire /var/cache/apt/archives/. Voici la ligne de commande :

snorky:~# apt-get install diskless-image-simple --download-only
snorky:~# cp /var/cache/apt/archives/diskless-image-simple_0.3.18.0.5_all.deb /var/lib/diskless/default/

La deuxième commande copie le fichier dans le répertoire où l’on a créé le tarball de l’installation de base. L’image diskless associée au tarball va nous permettre de créer une installation pour notre terminal. Pour la création de celle-ci nous allons utiliser diskless-createbasetgz, que nous avons installé précédemment avec la commande apt-get install diskless :

snorky:~# cd /var/lib/diskless/default/
snorky:/var/lib/diskless/default# diskless-newimage /var/lib/diskless/default/root

La décompression va commencer et vous poser quelques questions :
- Remplacez master par le nom de votre serveur d’application (ici j’indique snorky car c’est le nom de mon serveur :) ). Attention : une entrée correspondante doit être inscrite dans le DNS !
- Remplacez l’IP indiquée à la fenêtre suivante par celle de votre serveur, car c’est lui qui fournira les données via son serveur NFS.
- Normalement vous ne devriez pas avoir à retoucher à la ligne qui vous demande où se trouve le point de montage des répertoires NFS, le cas échéant, indiquez : /var/lib/diskless/default/root
- A l’identique, cette fenêtre ne devrait pas être modifiée, elle indique où se trouvera les quelques répertoires spécifiques aux terminaux (un par machine/IP), le cas échéant indiquez : /var/lib/diskless/default
- Ici aussi, laissez à /home. Ainsi, vos données seront toujours accessibles, peu importe que vous vous connectiez sur la distribution du serveur ou sur celle des terminaux.
- Indiquez à la suivante où se trouve le serveur DNS. Laissez à 127.0.0.1 si vous n’en disposez pas.
- Indiquez votre nom de domaine à la suivante. ( mon serveur est accessible via snorky.lan donc mon domaine est lan ).
- Indiquez vos renseignements concernant vos serveurs de mail aux deux suivantes.
- Terminez en indiquant si vous souhaitez utiliser le système DEVFS, qui gère les périphériques par le réseau. Pour ma part je l’ai activé.

Voilà, votre distribution est installée et, après quelques retouches, elle sera prête à être initialisée sur les terminaux.

chroot & config de la distristribution des terminaux

Nous venons de mettre en place la distribution de base sur notre serveur, mais celle-ci n’est pas encore accessible par le réseau, et n’est pas non plus très fonctionnelle. Nous allons utiliser chroot pour la configurer. La commande chroot nous permet de nous retrouver dans la distribution de base comme le serait un client. Ainsi, toutes les mises à jour que vous ferez seront appliquées à la distribution des terminaux et non à celle du serveur. Gardez en tête que lors de la navigation en chroot, la commande cd / vous placera à la racine de la distribution des clients donc en réalité dans le répertoire /var/lib/diskless/default/root et que pour quitter le chroot vous taperez exit.

Nous commencerons directement par préparer les sources apt. Libre à vous d’utiliser des paquets non-free et autres, gérez cette distribution comme toute autre distribution Debian. La récupération des locales, permettra de corriger le problème des locales FR absentes sur la distribution de base. Nous enlèverons lilo pour éviter qu’il ne corrompt le secteur de boot du serveur. Enfin, à la dernière ligne nous reconfigurons la locale du système en fr. (NB : il est possible de repasser en fr sur le terminal par la commande loadkeys fr-pc mais le changement ne sera que temporaire )

snorky:~# chroot /var/lib/diskless/default/root
snorky:/# apt-setup
snorky:/# apt-get install locales util-linux-locales anacron
snorky:/# apt-get remove lilo
snorky:/# dpkg-reconfigure console-common

Par la suite, libre à vous d’installer les logiciels que vous désirez, tout en gardant à l’esprit que c’est votre terminal qui, pour le moment, calculera tout. Nous verrons la mise en place de X sur les terminaux dans la deuxième partie de cet article, qui permettra de transférer les travaux sur le serveur.

Le serveur NFS

Le point final de la création des diskless : l’ouverture des partages réseaux. Vous vous apercevrez que celle-ci est assez simple car les partages seront directements induis par la création des comptes des terminaux. Pour chaque terminal nous aurons un répertoire /etc, un /tmp et un /var supplémentaires. Ils seront mis dans le repertoire portant comme nom l’IP du client. Pour créer ces répertoires, ou plus simplement un compte machine, nous utiliserons la commande diskless-newhost. La même ligne de commande pourra être utilisée pour mettre à jour un compte machine. Ainsi, pour créer le compte machine de portable qui a l’adresse IP 10.0.0.4 nous utiliserons la ligne de commande suivante :

snorky:~# diskless-newhost /var/lib/diskless/default/root 10.0.0.4

Si vous avez renseigné le fichier /etc/hosts comme indiqué après la configuration du serveur DHCP alors, vous ne devriez avoir qu’à appuyer sur entrée à chaque question qui vous sera posée :

Configure host 10.0.0.4...

Enter ? for help in following questions

Name of client [portable ] :
Default mail host name [portable ] :

Puis il s’en suivra la création des répertoires et fichiers qui personnalisent chaque hôte. Vous pouvez maintenant renseigner le fichier /etc/exports pour paramétrer vos exports NFS. Voici le mien :

La première ligne n’est à inscrire qu’une fois ; elle partage la racine de la distribution à tout les hôtes de 10.0.0.1 à 10.0.0.254 (interprétation du masque de sous réseau 255.255.255.0, 10.0.0.0 étant le réseau et .255 le broadcast) en lecture seule de manière asynchrone, c’est à dire qu’elle valide la réception réseau des fichiers et non leurs écritures sur le disque dur puis les met dans une pile d’action à exécuter. Cela offre l’avantage d’être plus rapide mais risque, en cas de plantage du serveur, de ne pas enregistrer ce qui avait été demandé. Dans le cas contraire, si vous désirez, au détriment de la rapidité, être sûr de l’écriture de vos données, alors indiquez sync au lieu de async.

La deuxième et la troisième ligne partagent respectivement les répertoires /home (celui du serveur) et /var/lib/diskless/default/10.0.0.4, qui est propre à la machine portable, en mode lecture/écriture.

Rappelez vous qu’à chaque machine que vous rajouterez au réseau diskless, vous devrez rajouter leurs coordonnées à la liste des hôtes (/etc/hosts) et à la liste des partages NFS.

Pour finir, afin de démarrer le serveur NFS tapez :

$ /etc/init.d/nfs-kernel-server reload

Premier démarrage

C’est enfin le premier démarrage du client, il ne vous reste plus qu’à insérer la disquette ou à activer le boot réseau et il chargera tout le système par le réseau. Connectez vous en root (sans mot de passe) et indiquez un nouveau mot de passe (passwd) afin de sécuriser la distribution des terminaux.

Liens

- Etherboot : les créateurs du système de boot utilisé par rom-o-matic.
- Wiki debian sur la création de diskless.
- La radio AftersHoursDJs et Eric serra (Le grand bleu) que j’ai écouté pendant la rédaction de cet article.


Signatures: 0
Date Nom Message

Forum

Vous pouvez participer à la vie de ce site et proposer vos propres articles en vous inscrivant ci-dessous. Vous recevrez immédiatement un email vous indiquant vos codes d'accès à l'espace privé du site.

Identifiants personnels

Indiquez ici votre nom et votre adresse email. Votre identifiant personnel vous parviendra rapidement, par courrier électronique.

Des mêmes auteurs


Parse error: syntax error, unexpected $end, expecting ')' in /home/gwhere/www/debianaddict/stats/var/last.php on line 803