Un premier test....

Création d'un serveur de «Terminaux X» avec Gentoo

Steeve Maltais

Lévinux, Laboratoire d'Éducation à la Virtualité 

1er Avril 2004

Historique des versions
Version 1.001er Mars 2004
Document réalisé dans le cadre de ma maîtrise en Technologie Éducative, Université Laval.

Résumé

Ce document contient une procédure d'installation possible pour créer un serveur pour «Terminaux X». Les «terminaux X» sont des ordinateurs branchés en réseau, de classe Pentium 1 ou supérieur. Ils ne sont pas autonomes, au sens de leur capacité à fonctionner par eux-mêmes car ils ne contiennent pas de disque rigide. Par contre, ils deviennent autonomes dès qu'ils sont branchés en réseau avec un serveur agissant à titre de «fournisseur de système d'exploitation» pour ces même terminaux. Cela revient donc à dire qu'un laboratoire complet peut fonctionner avec un serveur puissant, de classe Pentium 4, et alimenter un laboratoire d'une douzaine d'appareils sans problèmes et ce, avec tout ce que cela comporte : Interface graphique (KDE ou Gnome), navigateur web, courriel, interpréteur de commandes, édition graphique, traitement de texte, etc. Enfin, tout ce qui existe comme logiciels sous Linux!

Le but de ce document est de vous amener à construire vous même ce serveur de Terminaux X. Prenez note que vous aurez à rééditer à plusieurs reprises les mêmes fichiers et ceci est tout à fait volontaire de notre part : cette procédure vous permettera de tester ce qui fonctionne bien ou moins bien et ce, au fur et à mesure que nous avancerons.

Ce document représente le fruit d'un travail de collaboration étroit entre plusieurs partenaires de Lévinux , laboratoire d'éducation à la virtualité situé au campus de l'UQAR à Lévis.

Ce document sous-entend que vous avous déjà un système Gentoo fonctionnel. Pour plus d'informations à ce sujet consultez les autres documents disponibles sur le site de Lévinux. N'hésitez pas à vous référer au site de Linux Gentoo si nécessaire: Documentation officielle de Gentoo


Liste des illustrations

1.1. Architecture réseau

Chapitre 1. Architecture réseau

Réprésentation visuelle

Voici la représentation visuelle du réseau que vous aurez à construire une fois que votre serveur «rouge» sera fonctionnel. Ce serveur contient 3 cartes réseau (eth0, eth1, eth2) ayant chacune une utilité particulière.

Figure 1.1. Architecture réseau

Description du réseau

Voici à quoi ressemble la configuration des cartes réseau de votre réseau. Ces éléments de configuration seront écrites aux emplacement appropriés plus loin dans ce document. Cette section n'est qu'à titre informatif...

Serveur

hostname = rouge
eth0 : 192.168.0.50 // Relié à Internet
eth1 : 192.168.50.1 // Relié au cluster
eth2 : 192.168.51.1 // Relié aux terminaux X
gateway = 192.168.0.1 // Correspond à votre serveur et votre adresse gateway sur votre réseau (changer au besoin)
dns = 192.168.0.14 // Correspond à votre serveur et votre adresse dns sur votre réseau (changer au besoin)

noeud 1

host name = dix
mac = 00:04:75:F4:E6:BC //Mac adresse de votre carte réseau. Adapter selon votre matériel!
ip = 192.168.50.10

noeud 2

hostname = onze
mac = 00:04:75:F4:EC:07
ip = 192.168.50.11

terminal

hostname = ws100
mac = 00:0A:E6:0D:00:93
ip = 192.168.51.110

Chapitre 2. Noyau OpenMosix

À cette étape nous allons configurer votre serveur pour le rendre capable de supporter ce que nous appellons en informatique le "clustering", soit le "groupage". Pour cela nous utiliserons la fonctionnalité OpenMosix. Cette fonctionnalité ne nécessite aucun logiciel supplémentaire car elle est fait déjà partie intégrante de votre noyau Linux. Il ne s'agit que de bien configurer ce dernier pour qu'il vous offre ces fonctionnalités! Le clustering est une façon de transformer un groupe d'ordinateur ordinaires en réseau en un super-ordinateur pouvant rouler plus efficacement toute la gamme de vos logiciels linux favoris. En anglais c'est ce qu'on appelle aussi du "load balancing", ce qui se traduirait en français par " équilibrage de charge".

Pré-Installation

Commençons par installer GCC, le compilateur C et C++ de Linux (entre autres langages)...

#emerge -k gcc

Note

La version proposée sera la version 3.3.2-r5 ou supérieure. Il serait préférable d'installer la version 2.95. Pour cela il faut ... (Steeve : consigne à ajouter ici!!!)

#emerge -k gcc-config
#gcc-config -l // Pour voir les versions de GCC installées

Cela devrait vous donner quelque chose en sortie comme ceci :

#[1] i686-pc-linux-gnu-3.3.2

[1] représentant la version installée sur votre système.

Emerger les sources

#emerge -k openmosix-sources
#cd /usr/src/
#rm -rf linux
#ln -s linux-2.4.22-openmosixlinux // Le nom du dossier peut changer. 
                                   // Adapter à la version en cours, soit linux-2.x.xx-openmosixlinux
#cd /usr/src/linux
#cp .config .config_working        // Conserver l'ancienne configuration du kernel
#make menuconfig

Configuration du noyau

Nous allons maintenant passer aux choix de modules à compiler (ajouter) dans le noyau.

OpenMosix -->

    [*] openMosix process migration support
    [ ] Support clusters with a complex network topology
    [*] Stricter security on openMosix ports
    (1) Level of process-identity disclosure (0-3)
    [*] openMosix File-System
    [ ] Poll/Select exceptions on pipes
    [ ] Disable OOM Killer
    [ ] Load Limit

Code maturity level options  --->
    [*] Prompt for development and/or incomplete code/drivers

Networking options --->
    <*> Packet socket
    [ ]   Packet socket: mmapped IO
    < > Netlink device emulation
    [ ] Network packet filtering (replaces ipchains)
    [*] Socket Filtering
    <*> Unix domain sockets
    [*] TCP/IP networking
    [*]   IP: multicasting

File systems --->

    [*] /proc file system support
    [*] /dev file system support (EXPERIMENTAL)
    [*]   Automatically mount at boot 
     

Compilation du noyau

Finalement, il faut compiler le noyau. Ceci implique la création des dépendances, création de l'image pour le répertoire boot/, la création des modules, leur installation et finalement copie du fichier bzImage.

# make dep
# make clean bzImage modules modules_install
# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage

Chapitre 3. Outils OpenMosix

Table des matières

Installation

Pour exploiter les fonctionnalités OpenMosix de votre noyau, il faut installer divers outils. Ces petits logiciels vous permetteront de tirer certaines informations de vos noeuds présents sur le réseau. Un noeud est tout simplement un ordinateur présent sur le réseau, recevant des tâches à exécuter du serveur principal.

Installation

Procédonc maintenant à l'installation en tant que telle...

#emerge -k openmosix-user //Installer les outils OpenMosix
#mkdir mfs //Créer le point de montage /mfs dans le répertoire racine, c'est à dire " / "

Modification du fichier /etc/fstab...

#nano /etc/fstab

Ajoutez la ligne suivante :

none          /mfs          mfs         noauto,dfsa=1        0 0

Quittez nano en enregistrant les changements et ...

  1. Démarrez OpenMosix et

  2. Écrivez la commande pour qu'il démarre automatiquement à l'ouverture du système

    en utilisant le code suivant :

    #/etc/init.d/openmosix start
    #rc-update add openmosix default

Important

Le paquetage OpenMosix-user contient quelques outils bien pratiques. Pour n'en nommer que quelques uns (à exécuter en ligne de commande) :

mosmon : moniteur OpenMosix. Affiche l'état de vos noeuds OpenMosix.
mtop : version améliorée de top qui affiche sur quel noeud les processus tournent.
mps : version améliorée de ps qui affiche les numéros de noeuds.
mosctl whois : considérant que mosmon n'affiche que les numéros de noeuds, cette commande est très utile car elle affiche aussi l'adresse ip et le nom d'hôte du noeud.
omdiscd eth1 : OpenMosix sur l'interface eth1

Il y a aussi l'application openmosixview qui permet d'afficher un aperçu de votre cluster et des processus migrés d'un noeud à l'autre. Vous pouvez l'installer comme ceci...

#emerge -k openmosixview

Chapitre 4. Diskless

Comme pour OpenMosix au chapitre 2, il faut configurer le noyau (et le recompiler) en vue de pouvoir monter une partition racine sur le réseau. Contrairement à un poste de travail autonome où la partition racine serait montée sur le disque rigide de l'ordinateur en question.

Qu'est-ce qu'une machine diskless? (Source : Site de Gentoo)

«Une machine diskless est un PC dépourvu des périphériques de démarrage habituels, c-à-d. sans disque dur ni lecteur de CDROM ou de disquette. Un PC diskless démarre sur le réseau et a besoin d'un serveur qui va lui fournir de l'espace disque comme un disque dur local. Nous appellerons le serveur le maître et les machines sans disques des esclaves. Un esclave a besoin d'une carte réseau qui supporte le démarrage via PXE. La plupart des cartes modernes les font, les adaptateurs réseau intétégrés sur les cartes-mères aussi.»

Paramètres du noyau

#cd /usr/src
#cp .config .config_working   //sauvergarder une copie de la configuration du noyau maître
#make menuconfig              //C'est ici qu'on modifie la configuration du noyau maître

Assurez-vous que votre noyau possède ces options :

Code maturity level options  --->
  [*] Prompt for development and/or incomplete code/drivers


Networking options --->
  <*> Packet socket
  [ ] Packet socket: mmapped IO
  < > Netlink device emulation
  [ ] Network packet filtering (replaces ipchains)
  [*] Socket Filtering
  <*> Unix domain sockets
  [*] TCP/IP networking
  [*]   IP: multicasting

  
File systems --->

  [*] /proc file system support
  [*] /dev file system support (EXPERIMENTAL)
  [*] Automatically mount at boot    
  Network File Systems  --->
    <*> NFS server support
    [*] Provide NFSv3 server support

Compilation du noyau : diskless

Finalement, il faut compiler le noyau. Ceci implique la création des dépendances, création de l'image pour le répertoire boot/, la création des modules, leur installation et finalement copie du fichier bzImage pour remplacer l'ancien.

# make dep
# make clean bzImage modules modules_install
# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage
# cp /usr/src/linux/.config /usr/src/linux/.config_master //Sauvegarder d'une copie de la configuration 
du noyau maître)

Nous allons maintenant procéder à la compilation d'un nouveau noyau, noyau qui sera nécessaire à vos terminaux X...

Compilation du noyau : terminaux

Vous aurez besoin de nouveaux noyaux pour vos terminaux X. En fait, lorsque ceux-ci démarreront, ils utiliseront ce noyau spécialement conçu pour eux.

Avertissement

Assurez-vous que vous sélectionnez les options en tant que composantes internes au noyau et non en tant que modules.

Code maturity level options  --->

  [*] Prompt for development and/or incomplete code/drivers

Networking options --->
  <*> Packet socket
  [ ] Packet socket: mmapped IO
  < > Netlink device emulation
  [ ] Network packet filtering (replaces ipchains)
  [ ] Socket Filtering
  <*> Unix domain sockets
  [*] TCP/IP networking
  [*] IP: multicasting
  [*] IP: kernel level autoconfiguration
  [*] IP: DHCP support (NEW)

File systems --->
  [*] /proc file system support
  [*] /dev file system support (EXPERIMENTAL)
  [*] Automatically mount at boot
  Network File Systems  --->

  Ajouter toutes les options requises pour les cartes ethernet de vos noeuds esclaves

Procédons maintenant à la compilation :

#cd /usr/linux
#make clean dep bzImage //Compilation du noyau esclave
#mkdir /diskless
#cp /usr/src/linux/arch/i386/boot/bzImage /diskless //Copie du noyau esclave

Édition des fichiers nécessaires

Les systèmes de fichiers des noeuds maître et esclaves oeuvent subir de nombreuses adaptations. Concentrons-nous d'abord sur les fichiers de configuration et les points de montage. Nous avons besoin d'un répertoire sous /diskless pour le premier noeud esclave . Chaque esclave a besoin de son propre système de fichiers racine (le "root") parce que certains fichiers ne peuvent pas être communs à plusieurs machines sans causer de graves problèmes. Peu importe les noms des sous-répertoires vous pouvez, par exemple, les nommer d'après les adresses IP car elles sont uniques et explicites. Dans cet exemple, l'adresse IP du premier noeud esclave est 192.168.50.10 : vous devez faire cette opération pour chaque noeud esclave. Voir le code ci-bas.

Qu'est-ce qu'un noeud esclave?

C'est un ordinateur qui reçoit des tâches à effectuer par «l'ordinateur maître» !

# mkdir /diskless/192.168.50.10
# cp -r /etc /diskless/192.168.50.10/etc
# mkdir /diskless/192.168.50.10/home
# mkdir /diskless/192.168.50.10/dev
# mkdir /diskless/192.168.50.10/proc
# mkdir /diskless/192.168.50.10/tmp
# mkdir /diskless/192.168.50.10/mnt
# mkdir /diskless/192.168.50.10/mnt/.initd
# mkdir /diskless/192.168.50.10/root
# mkdir /diskless/192.168.50.10/var
# mkdir /diskless/192.168.50.10/var/empty
# mkdir /diskless/192.168.50.10/var/lock
# mkdir /diskless/192.168.50.10/var/log
# mkdir /diskless/192.168.50.10/var/run
# mkdir /diskless/192.168.50.10/mfs

Important

Vous devez recommencer cette procédure pour chaque station (noeud esclave) que vous possédez. Vous pouvez incrémenter de 1 pour chaque nouvelle station, comme par exemple : 192.168.50.10 pour la première, 192.168.50.11 pour la deuxième, 192.168.50.12 pour la troisième et ainsi de suite...

Vous devez ensuite modifier le fichier «net» situé dans le répertoire /etc/net pour forcer la carte réseau des postes esclaves à obtenir une adresse ip par dhcp. Encore une fois, cette procédure est nécessaire pour CHAQUE noeud esclave.

#nano /diskless/192.168.50.1/etc/net

Gardez seulement les lignes suivantes :

iface_eth0="dhcp"
gateway="eth0/192.168.50.1" //Changez le ip pour celui de votre passerelle

Quittez le fichier et enregistrez les modifications. Nous allons maintenant procéder à l'installation du serveur DHCP. Le serveur DHCP procure une adresse IP de façon automatique à tous les ordinateurs qui se brancheront sur votre réseau.

#emerge -k dhcp

Modifions maintenant le fichier de configuration du serveur DHCP :

#cp /etc/dhcp/dhcp.conf.sample /etc/dhcp/dhcp.conf
#nano /etc/dhcp/dhcp.conf

Votre fichier dhcp.conf, version finale, devrait ressembler à ceci :

ddns-update-style none;

option space PXE;
option PXE.mtftp-ip             code 1 = ip-address;
option PXE.mtftp-cport          code 2 = unsigned integer 16;
option PXE.mtftp-sport          code 3 = unsigned integer 16;
option PXE.mtftp-tmout          code 4 = unsigned integer 8;
option PXE.mtftp-delay          code 5 = unsigned integer 8;
option PXE.discovery-control    code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;

subnet 192.168.0.0 netmask 255.255.255.0
{
 option broadcast-address 192.168.0.255;
}

subnet 192.168.50.0 netmask 255.255.255.0
{
 class "pxeclients"
 {
       match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
       option vendor-class-identifier "PXEClient";
       vendor-option-space PXE;
       option PXE.mtftp-ip 0.0.0.0;
       filename "pxelinux.0";
       next-server 192.168.50.1;                       //adresse du serveur
 }

 pool
 {
       max-lease-time 86400;
       default-lease-time 86400;
       deny unknown clients;
 }

 host dix
 {
      hardware ethernet            00:04:75:F4:E6:BC;  //adresse mac du client
      fixed-address                192.168.50.10;
      server-name                  "rouge";            //nom du serveur
      option routers               192.168.50.1;       //adresse du serveur
      option domain-name-servers   192.168.0.14;       //adresse du dns
      option host-name             "dix";              //nom du client
 }

 host onze
 {
      hardware ethernet            00:04:75:F4:EC:07;
      fixed-address                192.168.50.11;
      server-name                  "rouge";
      option routers               192.168.50.1;
      option domain-name-servers   192.168.0.14;
      option host-name             "onze";
 }
}

subnet 192.168.51.0 netmask 255.255.255.0
{
      option broadcast-address     192.168.51.255;
}

}

Activation du DHCP

Il faut maintenant spécifier sur quel interface réseau le serveur DHCP devra s'exécuter.

#nano /etc/conf.d/dhcp //Exemple de /etc/conf.d/dhcp

IFACE="eth1 eth2"
DHCPD_OPTS=""

Quittez nano en sauvegardant les changements.

Démarrez le serveur DHCP et ajoutez-le à la procédure de démarrage pour qu'il s'exécute automatiquement.

#/etc/init.d/dhcp start

#rc-update add dhcp default

Important

N'oubliez pas de redémarrer le serveur dhcp à chaque modification du fichier dhcpd.conf

#/etc/init.d/dhcpd restart

tFTP et démarrage via PXE : Configuration

Le serveur tFTP (Trivial FTP) est utilisé pour envoyer le noyau et le initrd au terminal, via le réseau.

Commençons par installer les services nécessaires :

#emerge -k syslinux //Installer syslinux

#emerge tftp-hpa  //Installer le serveur tFTP

#cp /usr/lib/syslinux/pxelinux.0 /diskless //installer le démarreur à distance

#mkdir /diskless/pxelinux.cfg

Création de l'environnement pour PXE

Pour chaque appareil de votre réseau (terminal X) vous devez prendre son adresse ip, la convertir en hexadécimal et créer un fichier portant cette adresse convertie comme nom. Comme ceci :

#nano /diskless/pxelinux.cfg/C0A8320A //C0A8320A en hexadécimal = 192.168.50.10 en décimal)

Attention, il faut modifier l'adresse IP pour une adresse en format hexadécimal. Lorsque vous la réécrivez, n'incluez pas les " . " tel que vous êtes habitués de la faire comme en écrivant, par exemple, l'adresse 192.168.0.1

Voici un fichier contenant un exemple de contenu pour pxelinux.cfg/C0A8320A

DEFAULT /diskless/bzImage
APPEND ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/diskless/192.168.1.10

Il faut maintenant configurer votre serveur tFTPd pour qu'il démarre avec les bons paramètres. Modifiez pour cela le fichier dans /etc/conf.d/in.tftpd :

INTFTPD_PATH="/diskless"
INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"

En dernier lieu, il faut démarrer le service et l'ajouter au démarrage du noeud maître (votre serveur) :

#/etc/init.d/in.tftpd start
# rc-update add in.tftpd default

Serveur NFS : Configuration

NFS (Network File System) permet de rendre disponible le système de fichiers aux terminaux. Un "Network File System" (Système de fichiers réseau) est un protocole réseau qui supporte le partage de fichiers, comme par exemple le protocole SMB pour Windows.

Commençons par installer le packetage requis :

#emerge nfs-utils

Configurez maintenant le fichier de démarrage du serveur NFS

#nano /etc/init.d/nfs

Modifiez-le fichier pour qu'il prenne les valeurs suivantes :

# Number of servers to be started up by default
RPCNFSDCOUNT=20

#Options to pass to rpc.mountd
RPCMOUNTDOPTS=""

Sortez de nano et enregistrez les changements. Démarrez le serveur NFS et ajoutez-le au processus de démarrage du noeud maître (votre serveur) :

#/etc/init.d/nfs start

#rc-update add nfs default

Par la suite, il faut modifier le fichier "exports", fichier contenant tous les principes partagés par NFS.

#nano /etc/exports

Important

Dans ce fichier, il faut ajouter une ligne pour chacun des noeuds esclave présents sur votre réseau! Les quatres lignes à ajouter pour chaque terminaux sont celles commençant par /diskless et /var/log

# /etc/exports: NFS file systems being exported.  See exports(5).
/diskless/192.168.50.10               192.168.50.10(rw,no_root_squash,no_all_squash,sync)
/diskless/192.168.50.11               192.168.50.11(rw,no_root_squash,no_all_squash,sync)
/opt      192.168.50.0/24(ro,no_root_squash,no_all_squash,sync)
/usr      192.168.50.0/24(ro,no_root_squash,no_all_squash,sync)
/home     192.168.50.0/24(rw,no_root_squash,no_all_squash,sync)
/var/log  192.168.50.10(rw,no_root_squash,no_all_squash,sync)
/var/log  192.168.50.11(rw,no_root_squash,no_all_squash,sync)

Par la suite, il faut modifier le fichier "fstab" spécifique à chaque noeud, comme ceci :

#nano /diskless/192.168.50.10/etc/fstab

Le fichier fstab contenu dans /diskless/192.168.50.10/etc/fstab du noeud esclave que vous configurez devrait ressembler à ceci :

192.168.50.1:/diskless/192.168.50.10  /     nfs    hard,intr,rw,nolock,rsize=8192,wsize=8192   0 0
192.168.50.1:/opt                     /opt  nfs    hard,intr,ro,nolock,rsize=8192,wsize=8192   0 0
192.168.50.1:/usr                     /usr  nfs    hard,intr,ro,nolock,rsize=8192,wsize=8192   0 0
192.168.50.1:/home                    /home nfs    hard,intr,rw,nolock,rsize=8192,wsize=8192   0 0
192.168.50.1:/var/log              var/log  nfs    hard,intr,rw                                0 0

# NOTE: The next line is critical for boot!
none       /proc        proc      defaults        0 0
none       /mfs         mfs       noauto,dfsa=1   0 0
none       /dev/shm     tmpfs     defaults        0 0

Passons maintenant à la création de certains dossiers nécessaires nécessaires à chaque noeud esclave. Encore une fois, vous devez créer ces dossiers pour chaque noeud esclave de votre réseau et ce, autant que vous en avez. N'oubliez pas de modifier l'adresse ip du noeud esclave en question à chaque fois que vous créerez ses dossiers...

# cp -r /bin /diskless/192.168.50.10/bin
# cp -r /sbin /diskless/192.168.50.10/sbin 
# cp -r /lib /diskless/192.168.50.10/lib

Ensuite, pour chaque noeud esclave (selon l'adresse ip correspondante) faites :

diskless/192.168.50.10/fastboot
# echo "touch /fastboot" >> /diskless/192.168.50.10/etc/conf.d/local.start

Chapitre 5. LTSP 4

LTSP est une application qui permet de brancher plusieurs ordinateurs de type "Terminaux" (Aussi appellés "Terminaux X") à un serveur Linux (le noeud maître). Les applications s'exécutent normalement sur le serveur. Ce dernier reçoit les requêtes des terminaux et retourne les réponses via leur interface graphique. C'est pourquoi un terminal peut être un simple Pentium 1 et se comporter comme si c'était un Pentium 4, dans le cas où votre serveur en serait un...

Passons à 'installation de ltsp en commençant par installer GDM (Gnome Display Manager) et XFS (X Font System) :

emerge -k gdm    //installer gdm
emerge -k xfs    //installer xfs

Une fois la compilation et l'installation terminée, ajoutons ces deux services pour qu'il s'exécutent automatiquement au démarrage du serveur :

#rc-update add gdm default
#rc-update add xfs default

Important

Concernant l'installation du packetage LTSP, il faut le télécharger directement du site de LTSP. Vous devez télécharger le fichier ltsp-4.iso (ou la version courante au moment où vous lirez ces lignes). Voir pour cela le site suivant : www.ltsp.org

Vous devez sauvergarder le fichier .iso en question dans le répertoire /root

Monter et configurer LTSP

#mkdir /mnt/ltsp

#mount -o loop /root/ltsp-4.iso /mnt/ltsp

#cd /mnt/ltsp

#./ltsp_installer

C'est ici que l'installation de LTSP s'effectue...

Make selection : 2

Make selection : 1

Make selection : A

Are you sure yout want to install ALL components ? Yes

In which directory would you like to place LTSP ? [/opt/ltsp]

Installation de ltsp .................

Et c'est ici que la configuration de LTSP s'effectue...

#./ltspcfg

press enter to continue ...

Make selection : C

Make selection : 1

Select run level : 5

Make selection : 2

choisir eth2


Make selection : 8 

Do you want to add entries to /etc/hosts ? Yes

Make selection : R

À présent, copions le noyau de ltsp dans le dossier diskless

#cp /tftpboot/bzImageltsp /diskless/bzImageltsp

Modification finale au fichier exports

Éditons maintenant le fichier "exports" :

#nano /etc/exports

en ajoutant les lignes suivantes :

opt/ltsp/i386              192.168.0.0/255.255.255.0(ro,no_root_squash,async)
/var/opt/ltsp/swapfiles    192.168.0.0/255.255.255.0(rw,no_root_squash,async)

Voici la version finale du fichier exports, ou du moins, ce à quoi il devrait ressembler :

# /etc/exports: NFS file systems being exported.  See exports(5).

#diskless
/diskless/192.168.50.10   192.168.50.10(rw,no_root_squash,no_all_squash,sync)
/diskless/192.168.50.11   192.168.50.11(rw,no_root_squash,no_all_squash,sync)
/opt                      192.168.50.0/24(ro,no_root_squash,no_all_squash,sync)
/usr                      192.168.50.0/24(ro,no_root_squash,no_all_squash,sync)
/home                     192.168.50.0/24(rw,no_root_squash,no_all_squash,sync)
/var/log                  192.168.50.10(rw,no_root_squash,no_all_squash,sync)
/var/log                  192.168.50.11(rw,no_root_squash,no_all_squash,sync)

#ltsp    
/opt/ltsp/i386            192.168.51.0/255.255.255.0(ro,no_root_squash,async)
/var/opt/ltsp/swapfiles   192.168.51.0/255.255.255.0(rw,no_root_squash,async)

Configuration du DHCP

DHCP signifie Dynamic Host Configuration Protocol. Le DHCP (service système) est un outil permettant à un ordinateur de se connecteur sur un réseau et recevoir automatiquement une adresse IP de la part du serveur. Dans notre cas, les adresses sont ordinairement des adresses locales (192.168.x.x ou encore 10.0.x.x) et serviront strictement aux ordinateurs situés sur le réseau pour communiquer entre eux. L'adresse IP servant à la navigation sur Internet ne devrait être connue que par le serveur (interface eth0).

Éditons maintenant le fichier "dhcpd.conf" :

#nano /etc/dhcp/dhcpd.conf

Voici la version finale du fichier exports, ou du moins, ce à quoi il devrait ressembler :

ddns-update-style none;

option space PXE;
option PXE.mtftp-ip              code 1 = ip-address;
option PXE.mtftp-cport           code 2 = unsigned integer 16;
option PXE.mtftp-sport           code 3 = unsigned integer 16;
option PXE.mtftp-tmout           code 4 = unsigned integer 8;
option PXE.mtftp-delay           code 5 = unsigned integer 8;
option PXE.discovery-control     code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr  code 7 = ip-address;

subnet 192.168.0.0 netmask 255.255.255.0
{
              option broadcast-address  192.168.0.255;
}

subnet 192.168.50.0 netmask 255.255.255.0
{
#diskless
       class "pxeclients"
       {
             match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
             option vendor-class-identifier "PXEClient";
             vendor-option-space PXE;

             option PXE.mtftp-ip 0.0.0.0;
             filename "pxelinux.0";
             next-server 192.168.50.1;
        }

        pool
        {
             max-lease-time 86400;
             default-lease-time 86400;
             deny unknown clients;
        }

       host dix
       {
             hardware ethernet           00:04:75:F4:E6:BC; //ici vous devez écrire l'adresse MAC de votre propre carte réseau!
             fixed-address               192.168.50.10;
             server-name                 "rouge";
             option routers              192.168.50.1;
             option domain-name-servers  192.168.0.14;
             option host-name            "dix";
       }

       host onze
       {
             hardware ethernet            00:04:75:F4:EC:07; //ici vous devez écrire l'adresse MAC de votre propre carte réseau!
             fixed-address                192.168.50.11;
             server-name                  "rouge";
             option routers               192.168.50.1;
             option domain-name-servers   192.168.0.14;
             option host-name             "onze";
       }
}


#ltsp

subnet 192.168.51.0 netmask 255.255.255.0
{
             option broadcast-address     192.168.51.255;
}

group {
      option domain-name       "nomdedomaine";
      filename                 "bzImageltsp";
      option root-path         "192.168.51.1:/opt/ltsp/i386";
      use-host-decl-names      on;

      host ws110 //Nous n'avons listé qu'un seul terminal pour l'exemple mais vous devriez lister tous les vôtres présents sur le réseau...
      {
           hardware ethernet        00:0A:E6:0D:00:93; //ici vous devez écrire l'adresse MAC de votre propre carte réseau!
           fixed-address            192.168.51.110;
      }
}

Après avoir quitté nano est enregistrant les modifications, démarrez le serveur DHCP :

#/etc/init.d/dhcp restart

Édition en vrac de quelques fichiers

  • Fichier Xaccess : décommentez une ligne en enlevant le # au tout début :

#nano /etc/X11/xdm/Xaccess
# *                 #any host can get a login window
  • Fichier xdm-config : commentez la ligne DisplayManager.requestPort:0 (en ajoutant un # au tout début)

    #nano /etc/X11/xdm/xdm-config
  • Fichier kdmrc : cherchez la section [Xdmcp] et remplacez Enable = false par Enable = True

    #nano /usr/kde/3.1/share/config/kdm/kdmrc
  • Fichier gdm.conf : cherchez la section [xdmcp] et remplacez Enable = false par Enable = True

    #nano /etc/X11/gdm/gdm.conf
  • Fichier lts.conf : Pour y faire ?????????

    #nano /opt/ltsp/i386/etc/lts.conf

    Sortez de nano en enregistrant les changement et entrez le lignes suivantes en console :

    #rc-update add xdm default
    
    #/etc/init.d/xdm start

    Vous avez maintenant terminé l'installation de votre système! N'oubliez pas d'activer le démarrage sur la carte réseau dans le BIOS de vos terminaux X!

    Vous devriez maintenant avoir un serveur, des postes diskless et des terminaux X prêts à fonctionner (quelle est la différence? :-)

Un second test

Vserver & ltsp

Un article de Refaire.

Sommaire

Bricolage

Ajouter un localhost

  • Réduire le netmask de lo sur la machine physique 127.0.0.1/8 à 127.0.0.1/16
  • Créer un fichier (distributions de la famille debian... pour les familles redhat et quelques autres, le fichier existe déjà) /etc/modprobe.conf et y ajouter l'instruction suivante options dummy numdummies=5 (on met le chiffre qu'on veut... ici, on en crée 5)
  • On lance le module dummy
modprobe dummy
  • On déclare une interface dummy0 dans /etc/vservers/<vserver>interface/<id> puis on met dummy0 dans dev et 127.1.0.1/24 dans ip
  • On relance le vserver
  • On modifie le fichier /etc/hosts du vserver localhost 127.1.0.1
  • Référence: mirabellug (http://mirabellug.org/wikini/wakka.php?wiki=VServers)

Débloquer le ssh -CX sur le vserver

  • Ajouter dans /etc/ssh/sshd_config du vserver l'instruction suivante X11UseLocalHost no
  • Lancer xhost + sur le terminal qui appelle le vserver
  • On s'assure que /etc/hosts contient une ligne définissant notre vserver (son adresse ip et son nom!)
  • Référence: LinuxÉdu-Québec (http://linuxeduquebec.org/wikini/wakka.php?wiki=GuiGuiVservers)

Permettre d'accéder à chacun des vservers et à la machine physique via ssh

  • On ajoute dans le fichier /etc/ssh/sshd_config de chacune des machines (la machine physique et chacun des vservers) l'adresse IP sur laquelle le daemon sshd va écouter ListenAddress n.n.n.n
  • On relance les sshd
  • Référence deb.riseup.net (http://deb.riseup.net/vserver/preparing/)

Serveurs DHCP et NFS

  • Pour DHCP, il faut ajouter les options CAP_NET_RAW et CAP_NET_BROADCAST dans /etc/vservers/<vserver>bcapabilities
  • Pour nfs, il y a seulement nfs-user-server qui fonctionne; on oublie nfs-kernel-server... Mais nfs-user offre de bonnes performances pour LTSP
  • Référence: on consultera la FAQ de J. Gélinas (http://www.solucorp.qc.ca/howto.hc?projet=vserver) et celle de Sladen (http://www.paul.sladen.org/vserver/faq/#nfs)

Activer localdev pour ltsp (disquette, cdrom et usb) dans un vserver

  • Il faut ajouter l'option suivante dans /etc/vservers/<vserver>bcapabilities CAP_SYS_ADMIN afin de permettre au vserver de monter (smbmount) les fichiers partagés sur les terminaux.

ldap

  • La recette à suivre pour ldap sur breezy ou debian est ici (http://enterprise.linux.com/article.pl?sid=05/09/15/1930256&tid=129). Il faut cependant ajouter un certain nombre de choses.
    • Il manque une commande dans le tutoriel: après avoir créé le fichier Myuser.ldif, il faut ajouter
ldapadd -x -D "cn=admin,dc=example,dc=org" -W -f Myuser.ldif
    • Tout fonctionne à merveille quand les répertoires /home sont existants et qu'on ne passe pas par gdm (ou kdm ou xdm), en particulier sur LTSP; autrement, il faut quelques ajouts:
      • Le syslog indique que gdm se plaint de deux répertoires manquant: on les créee
mkdir /var/run/nscd -p
mkdir /var/db && mkdir /var/db/nscd
      • Il faut également ajouter au fichier /etc/pam.d/common-session les deux lignes suivantes
session optional                pam_ldap.so
session required        pam_mkhomedir.so skel=/etc/skel/ umask=0
    • Enfin, si l'on souhaite offir un service de courrier, on doit ajouter dans /etc/skel le répertoire Maildir, contenant les répertoires cur new tmp

Copier un vserver

  • On oublie cp ou scp. On me dit que tar --preserve fonctionne.... je n'ai pas eu cette veine. Voici trois solutions qui fonctionnent
    • vservser-copy [vserver] {hote:}[vservercopie]
      • Cette commande ne fonctionne que si l'on crée un lien symbolique dans /etc/vservers/[vserver] vers [vserver].conf
      • On ajuste ensuite dans /etc/vservers le répertoire [vsevercopie]; on copie (ici on peut utiliser cp, scp ou tar) /etc/vservers/[vserver] dans /etc/vservers/[vservercopie] et on ajuste les variables (interfaces/n n n... , name, uts/nodename et vdir)
    • dump 0zf {path}[nomdufichier] [vserver] est également très bien. On récupère avec restore -fr {path}[nomdufichier] en se mettant à la racine / de la machine de récupération.
    • On peut également copier à distance avec la commande suivante
rsync [vserver] -aPxvze ssh --delete --stats --numeric-ids {host:}/vservers/[vserver]
      • Référence : on consultera encore l'excellente FAQ de Sladen (http://www.paul.sladen.org/vserver/faq/#rsync) pour dump et rsync

Récupérer un vserver de terminaux

  • On veut récupérer un vserver de terminaux; quels sont les fichiers à adapter au nouvel environnement ? (tous les chemins sont donnés à partir d'une distribution de type debian)
    • pour la config du vserver (si la configuration du réseau est différente...)
      • /etc/vserver/[vserver]/interfaces/[n]/ip (et peut-être dev)
    • voir plus haut #Ajouter un localhost pour une interface "dummy", s'il y a lieu
    • pour ldap
      • /etc/ldap/ldap.conf
      • /etc/ldap.secret
      • /etc/pam_ldap.conf
      • /etc/libnss-ldap.conf
    • pour ssh
      • On ajuste le "listen" dans /etc/ssh/sshd_config, à la fois sur le vserver et sur la machine host
    • pour le dhcp (cela va de soi si le nouvel environnement propose un jeu d'adresses ip différent. Et ce, qu'il soit dans le vserver de terminaux ou à l'extérieur)
      • /etc/dhcpd3/dhcpd.conf sur la machine (virtuelle ou physique) qui héberge le dhcp
        • On adapte le jeu d'adresses ip à distribuer à son environnement et on s'assure que "option root-path" pointe vers l'adresse du serveur ltsp.
    • pour ltsp (même remarque que pour le dhcp)
      • /opt/ltsp/i386/lts.conf
        • On donne les bonnes adresses pour le serveur ltsp et le xdm
    • pour cups
      • /etc/cups/cupsd.conf, si on est serveur
      • /etc/client.conf, si on est client
        • REMARQUE : on ne peut lancer cups à la fois sur la machine hôte et sur un vserver... à moins de trouver un "wrapper" qui fonctionne... je n'ai pas encore eu cette chance...
    • pour gdm
      • On s'assure que le nombre de connexions simultanées est adapté à son nouvel environnement
    • pour /tmp
    • Si on change de nom...
      • Les fichiers /etc/vservers/[nouveaunom] ../name, ../uts/nodenane, le lien symbolique ../vdir à ajuster avec le nouveau nom dans [path_des_vservers]/vservers/[nouveaunom]

Utiliser les périphériques de la machine hôte (le serveur physique) dans un vserver

  • On aimerait pouvoir gérer l'impression directement dans un vserver et on aimerait également graver des cd depuis le vserver.
    • On doit pourvoir définir les dev manquant:
      • Ajouter CAP_MKNOD dans le fichier /etc/vservers/<vserver>bcapabilities
      • Créer les dev nécessaires (cdrom, graveur CD et imprimante parallèle, par exemples)
mknod /dev/hdc b 22 0
mknod /dev/hdd b 22 64
mknod /dev/lp0 c 6 0
      • Changer les groupes
chwon root:cdrom /dev/hdc
chwon root:cdrom /dev/hdd
chown root:lp /dev/lp0
      • S'assurer que les utilisateurs à qui l'on donne des privilèges sur l'utilisation des périphériques (user1, user2, etc. et cupsys) aient accès aux ressources dans le fichier /etc/group. Par exemple, l'entrée cdrom devrait ressembler à cela
cdrom:x:24:user1,user2,userN
  • On pourrait également ajouter scanner et autres périphériques....

Configuration de cups dans un vserver

  • Il m'a fallu pas mal de temps avant de comprendre qu'il ne FAUT PAS utiliser les options listen dans le fichier de config. Voici une configuration de base (très minimale) qui fonctionne parfaitement
LogLevel info
TempDir /var/spool/cups/tmp
# No 'Listen' directive !
Port 631
BrowseAddress @LOCAL
BrowseDeny All
BrowseAllow @LOCAL
BrowseOrder deny,allow
<Location />

 Order Deny,Allow
 Deny From All
 Allow From @LOCAL
 Allow From 192.168.0.0/16
</Location>
<Location /admin>
 AuthType Basic
 AuthClass System
 Order Deny,Allow
 Deny From All
 Allow From 192.168.0.0/24
# Or
#  Allow From @LOCAL
</Location>
  • Cette configuration permet également à des clients externes au vserver (dans le même sous-reseau) d'utiliser les ressources d'impression. On configure le script client.conf en conséquence
  • Référence : j'ai trouvé la solution ici (http://nayco.free.fr/wiki/doku.php?id=vservers-cups)

Monter nfs dans un vserver et modifier le /tmp

  • Ouf! Cette opération-là m'a donné beaucoup de sueurs froides... Voici le scénario
    • Une machine host (anaconda) sur laquelle roule un vserver de terminaux (vs01) et une machine de type nas (marmotte) sur laquelle se trouve les home de même qu'un serveur nfs (pas de vservers).
    • On monte facilement marmotte/home sur anaconda/home; on peut également faire un "mount --bind" anaconda/home ...vs01/home
    • Si vs01 n'était pas contraint d'utiliser à son tour le portmap et nfs, ça roulerait sans problemes (c'est d'ailleurs le cas avec /equinux/vs02 qui roule apache, mysql, postfix, imap, etc. Mais voilà : vs01 doit lancer portmap et nfs-user-server pour faire fonctionner les terminaux; il ne peut y avoir à la fois un portmap sur anaconda et sur anaconda/vs01. Que faire ?
    • La réponse paraît simple : ne pas monter marmotte/home sur anaconda/home, mais directement dans ..vs01/home (et faire un mount --bind depuis ..vs01/home vers anaconda/home, si nécessaire).
    • Ça ne monte pas sans options... (ou plutôt, ça monte, mais c'est hyper-hyper lent et pas utilisable avec les terminaux.!)
    • Après avoir fouillé le web, j'ai enfin trouvé une solution: on monte avec les options hard,intr,nolock. On peut même mettre le montage dans /etc/vservers/vs01/fstab. Voici ce que ça donne.
none    /proc           proc    defaults                0 0
none    /tmp            tmpfs   size=100m,mode=1777     0 0
none    /dev/pts        devpts  gid=5,mode=620          0 0
marmotte:/mnt/storage/home   /home   nfs     hard,intr,nolock        0 0
    • Référence: j'ai trouvé la solution ici (http://list.linux-vserver.org/archive/vserver/msg11032.html)
  • On remarquera que le /tmp est maintenant à 100 megs... Par défaut, il était seulement à 16... pas suffisant pour 25 terminaux. J'ai présumé (ça reste à vérifier) qu'il fallait compter de 3 à 4 megs par terminal, quand on utilise kde et openoffice.


Rafinement

tightvnc

J'avais un Xvnc fonctionnel dans Hoary... Pour le faire fonctionner avec Breezy (la distro de mon vserver LTSP), il faut aujouter l'option suivante à la fin de chaque ligne vnc dans inetd.conf

-fp /usr/share/X11/fonts/misc/

La sotution se trouve [ici (http://ubuntuforums.org/showthread.php?p=475213#post475213)]

gdm ne part pas

Pour des raisons que j'ignore le gdm part avec le vserver mais pas le gdmgreeter ("ps aux" montre gdm avec root comme propriétaire mais pas gdmgreeter -- qui doi avoir gdm comme propriétaire)... il faut absolument relancer le gdm... Allez savoir pourquoi!

J'ai contourné le problème en changeant l'ordre de priorité du démarrage de gdm. Au lieu d'une priorité 13, je lui ai donné la dernière, 99. On ne fait que changer dans chaque rcN.d pertinent, S13gdm pour S99gdm

--Jacques 18 déc 2005 à 00:08 (EST)