Clients légers avec Debian et LTSP 5

Ce guide détaille les étapes d'intégration d'un serveur Debian avec LTSP au sein d'un domaine Microsoft Windows. Le but est de recycler de vieilles machines en clients légers pour résoudre un problème de budget. En effet, plutôt que d'investir dans du matériel neuf (25 PC * 900 € HT = 22500 € HT) seul l'achat d'un serveur (Xeon Quad Core 8Go RAM à 1300 € HT) sera nécessaire.

Ce guide a été réalisé au fur et à mesure de la mise en place de la solution dans un lycée. J'y traite donc de l'installation, des bugs découverts lors des premiers tests et des astuces qui facilitent la maintenance en production.

Pourquoi Debian et LTSP ?

Avec ÉclairNG, l'Éducation Nationale met à disposition une solution de clients légers intégrés à la suite du projet Eole (initié par l'Académie de Dijon). Basée sur Ubuntu, la suite est stable et dispose de mises à jour régulières par les ingénieurs du projet.

Cependant, si son installation et son administration sont simples, devant le nombre de modifications trop peu documentées, l'intégration d'un serveur ÉclairNG dans un environnement Windows (avec ou sans IACA) est plus que problématique. Le nombre de modèles EOLE à modifier et le risque de perdre la configuration après une mise à jour ou une instanciation du fichier de configuration ÉclairNG est trop grand.

C'est ainsi que Debian s'impose d'elle même : distribution linux stable avec une base qui n'est modifiée que tous les 3 ans et qui dispose d'une bonne intégration du projet LTSP dans sa version 5.

Objectifs

Intégrer le serveur LTSP dans un domaine Microsoft Windows. Pour les collèges ou lycées qui utilisent IACA pour la gestion des comptes, celui-ci agissant comme une couche au dessus d'Active Directory, l'intégration d'un serveur LTSP sera entièrement tranparente.

Principaux
  1. Authentification : Lorsqu'un utilisateur se connecte à partir d'un client léger, le serveur LTSP va l'authentifier grâce à Active Directory. Les informations des comptes sont donc toujours centralisées sur le contrôleur de domaine.
  2. Répertoire partagé : Une fois connecté sur sa session, l'utilisateur retrouve son répertoire personnel (montage automatique) et les répertoires de groupes (ex: avec IACA, les répertoires « Classes »). Les données utilisateurs sont donc toujours centralisées sur le contrôleur de domaine.
  3. Profils : gestion des profils linux et windows. Après plusieurs pistes étudiées (avantages/inconvients), la méthode utilisée dans ce guide sera la suivante :
    • fichier de configuration linux : reste sur le serveur linux. Le profil est nettoyé à chaque connexion. Ce qui veut dire que l'utilisateur aura à chaque fois le profil de base tel que présent dans /etc/skel. Cependant un certains nombres de paramètres restent modifiables par l'utilisateur pendant sa session.
    • fichier de configuration windows : ils sont toujours sur le serveur windows, mais au montage du répertoire personnel, le dossier System sera visible par les utilisateurs. Il faut donc le cacher.
Secondaires
  • Prise en charge des imprimantes/scanners/clés USB.
  • Outil de supervision graphique (iTalc).
  • Personnalisation : écran d'accueil, activation du pavé numérique et profil utilisateur.
  • Rendre le serveur LTSP le plus autonome possible : l'administration de se serveur doit être « quasi inexistante », pour cela :
    • la gestion des comptes est déportée (notamment grâce à l'annuaire Active Directory, les comptes sont gérés à partir du contrôleur de domaine Windows).
    • les tâches habituelles de l'administrateur linux sont automatisées : nettoyage des répertoires temporaires, quota, kill des applications non-utilisées...

Pré-requis

Pour la suite du guide la configuration sera ainsi (à vous d'adapter suivant votre domaine)

Contrôleur de domaine Windows (PDC)Debian
Domaineclaudel.privclaudel.priv
Nom d'hôteserveur.claudel.privltsp.claudel.priv
IP192.168.224.1192.168.224.4
Compte administrateuradministrateurroot
Remarques
  • Le PDC doit être pleinement fonctionnel avec des clients windows et les DNS correctement configurés.
  • La version de Debian utilisée est la 5.0 «Lenny». A noter que contrairement à l'habitude, il faut absolument installer un environnement graphique (ex: Gnome ou KDE) nécessaire à LTSP.
  • Le nom d'hôte du serveur Debian doit absolument se trouver dans /etc/hosts et /etc/hostname

Patch + Compilation kernel du serveur Debian

A cause d'une mauvaise interprétation de l'ATTR_READONLY bit sur le module cifs dans les kernel 2.6.26 (avec cifs 1.52), il faut patcher le module cifs et recompiler le kernel.

J'ai découvert ce bug après plusieurs jours de galère. Suite à une discussion avec le mainteneur officiel du module cifs, celui-ci a sorti un patch pour la version 2.6.31... Debian étant toujours au 2.6.26, je l'ai adapté et vous pouvez le télécharger :
cifs-when-ATTR_READONLY-only-clear-write-bit-on-non-dir.patch

Installation des outils nécessaires à la compilation

apt-get install fakeroot build-essential devscripts libncurses5-dev dpkg-dev

Création d'un répertoire dédié à la compilation

mkdir REBUILD
cd REBUILD

Installation des dépendances du noyau

apt-get build-dep linux-2.6

Récupération des sources du noyau

apt-get source linux-2.6

Par la suite, les commandes sont à faire en simple utilisateur. On change donc le répertoire de propriétaire (« user » est à remplacer par un simple utilisateur) :

chown -R user.user linux-2.6-*
cd linux-2.6-*

Création d'une nouvelle entrée dans le debian/changelog. Ceci créera un nouveau kernel de version 2.6.26-15lenny3.cifs.1 (après un « . » les scripts debian incrémentent automatiquement la version).

dch --local +cifs.

Modification du fichier debian/config/defines pour avoir un nom de kernel de la forme « linux-image-2.6.xx-y+cifs.1 ». Attention ce numéro de version est important par la suite. On rajoute donc ce qui a été mis plus haut sans oublier la version ici 1. Donc « +cifs.1 ».

abiname: 2+cifs.1

Copie du patch dans le répertoire debian/patches/bugfix/

cp cifs-when-ATTR_READONLY-only-clear-write-bit-on-non-dir.patch debian/patches/bugfix/

Ajout du patch dans le fichier gérant les séries de patch à appliquer debian/patches/series. Au moment de la rédaction de ce guide, le kernel 2.6.26-2+15lenny3 était celui du serveur debian utilisé. Donc le dernier patch de la série était le 15lenny3.

echo "+ bugfix/cifs-when-ATTR_READONLY-only-clear-write-bit-on-non-dir.patch" >> debian/patches/series/15lenny3+cifs.1

Nettoyage des règles debian si ce n'est pas la première tentative de compilation

make -f debian/rules clean

Création des règles debian (si un nettoyage n'a pas été fait avant, la première tentative est un échec forcé pour bien faire comprendre à l'utilisateur ce qu'il fait)

make -f debian/rules source-all

Mise en place des sources du noyau après application des règles debian. Le kernel pour un processeur 686 (« setup_i386_none_686-bigmem »). Ici « bigmem » permet la prise en charge de plus de 4Go de RAM pour la version 32bit de debian.

fakeroot make -f debian/rules.gen setup_i386_none_686-bigmem

Ceci va créer une arborescence dans le répertoire debian/build/build_i386_none_686-bigmem. Tous les patchs sont ainsi appliqués dans le bon ordre. Il ne reste donc plus qu'à compiler (en conservant le config file par défaut livrée par debian lors de la récupération des sources du noyau) :

fakeroot make -f debian/rules.gen binary-arch_i386_none_686-bigmem binary-indep DEBIAN_KERNEL_JOBS=1

Remarque : Compilation du kernel (DEBIAN_KERNEL_JOBS contient le nombre de CPU). Peut durer jusqu'à 1h30 sur un 2Ghz. Une fois terminé, les paquets debian (linux-image...) ont été créés dans le répertoire parent. Il ne reste plus qu'à les installer. En root :

dpkg -i linux-image-2.6.26-2+cifs.1-686-bigmem_2.6.26-15lenny3+cifs.1_i386.deb

On termine par la mise à jour de grub /boot/grub/menu.lst pour booter automatiquement sur le nouveau kernel qui vient d'être compilé. Dans le mon cas :

default 2

Remarque :

  • Après redémarrage du serveur, celui-ci démarre sur un kernel maison patché pour cifs. Attention : en attendant que Debian intègre le patch cifs, à chaque mise à jour du kernel qui vous est proposé par la distribution, il faut refaire toute l'étape de patch/compilation.
  • A chaque changement de kernel, il faut mettre à jour l'image des clients légers :
    ltsp-update-kernels
    ltsp-update-image

Installation de LTSP (Linux Terminal Server Project)

Théorie

Les clients légers sont en fait des terminaux X : rien n'est réellement exécuté sur le client (pas besoin de disque dur). Le matériel dont celui-ci est équipé (processeur, RAM, clavier, souris) n'agira que comme périphérique ! Autrement dit les échanges réseaux qu'il va y avoir entre le serveur et ses clients seront des échanges graphiques uniquement.

Étapes de connexion :

  1. le client léger boot sur le réseau (PXE) et un serveur DHCP lui envoie une IP avec des attributs supplémentaires (ip, masque, passerelle, dns, ip du serveur PXE).
  2. le client léger télécharge un noyau sur le serveur TFPD.
  3. le noyau est exécuté et une image du système (190Mo) à exécuter est récupérée via NFS. Ce système va seulement servir a établir une connexion graphique vers le serveur LTSP (voir explication ci-dessus). Les clients légers pouvant être de marque, configuration et matériel complètement différents.
  4. l'utilisateur se connecte ensuite sur le client léger et peut travailler dans sa session. Tout est exécuté sur le serveur !
Installation de LTSP

On installe LTSP sur le serveur debian. Les développeurs Debian ont mis en place un méta-paquet qui va prendre en charge l'installation du LTSP et des services nécessaires (PXE, TFPD, NFS, DHCPD...)

apt-get install ltsp-server-standalone

Une fois terminé, il faut construire l'environnement lstp

ltsp-build-client

Ceci installera l'environnement de chroot dans « /opt/ltsp/i386 » et les fichiers de démarrage PXE dans « /var/lib/tftpboot ». Modifier « /etc/exports » :

/opt/ltsp *(ro,no_root_squash,async,no_subtree_check)

On restart le serveur nfs

invoke-rc.d nfs-kernel-server restart

On start le serveur tftp par défaut

invoke-rc.d openbsd-inetd restart

On autorise le lancement du serveur tftp, édition du fichier « /etc/default/tftpd-hpa »

RUN_DAEMON="yes"

On désactive l'entrée dans le « /etc/inetd.conf »

#tftp dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot

On redémarre inet

invoke-rc.d openbsd-inetd restart

et on redémarre tftpd-hpa

invoke-rc.d tftpd-hpa restart

Tout est maintenant ok. Plus que le DHCP à mettre en place.

Mise en place du DHCP

Pour que les clients bootent directement sur le réseau, ils doivent recevoir dès l'attribution de leur IP, le nom du serveur PXE et le chemin du fichier de démarrage. Ces informations sont envoyées par un serveur DHCP, qui peut être :

  • le serveur Debian lui-même : lors de l'installation du meta-paquet « lts-server » un service DHCP (dhcp3-server) a aussi été installé. Il ne reste plus alors qu'à le configurer.
  • un autre serveur DHCP (windows, linux...).

Le réseau actuel (celui du guide) disposant déjà d'un serveur DHCP (service DHCP du contrôleur de domaine Windows), celui-ci sera utilisé. Quelques légères modificiations sont nécessaires.

Modification de la configuration DHCP du serveur Windows 2003

Si vous avez déjà un sous-réseau pour les clients légers utiliser le sinon il faut en créer un. Les options indispensables à ajouter sont :

  • Option 017 Chemin d'accès racine : « /opt/ltsp/i386 »
  • Option 066 Nom d'hôte du serveur de démarrage : « ltsp.claudel.priv »
  • Option 067 Nom du fichier de démarrage : « /ltsp/i386/pxelinux.0 »

Si vous voulez utiliser le serveur Debian en tant que serveur DHCP, référez-vous à la documentation correspondante.

Test

A présent, le service LTSP est configuré et il est possible de se connecter sur les clients légers avec un compte local. Création d'un nouvel utilisateur, exemple :

adduser leger

Ajouter un PC sur votre réseau, vérifier que le boot pxe soit activé dans le BIOS. Si tout est correctement configuré, une session graphique apparaît et il est possible de s'y connecté ave l'utilisateur «leger».

Remarque : il est conseillé de garder au moins un compte local pour réaliser quelques tests par la suite. Ce compte pourra d'ailleurs être celui de l'administrateur du serveur Debian (pour des tâches courantes non-root).

Authentification du serveur Debian sur le domaine Windows

Puisque le client léger fonctionne avec un compte local, l'objectif est maintenant de se connecter avec un compte du domaine Windows. Pour cela, le serveur Debian doit être serveur membre du domaine.

Kerberos, Winbind et Samba vont être installés et configurés pour joindre le serveur Debian au domaine et accéder à l'annuaire Active Directory (indispensable à l'authentification des utilisateurs).

Synchronisation de l'heure

Une différence de plus de 5min rendrait impossible la connexion du serveur Debian vers le PDC (requis par Kerberos). Il faut donc synchroniser le serveur sur l'heure du PDC.

Installation du client ntpdate

apt-get install ntpdate

Modification du fichier /etc/default/ntpdate

# serveur source à vérifier
NTPSERVERS="serveur.claudel.priv"
# options supplémentaires pour ntpdate
NTPOPTIONS="-u"

Pour synchroniser l'heure :

/usr/sbin/ntpdate-debian

Comme toute horloge, il y aura des dérives au fil du temps : il faut donc synchroniser l'heure régulièrement ! Il suffit de mettre la commande précédente dans une tâche cron qui s'exécutera tous les jours à minuit. Édition de la crontab de l'utilisateur root :

crontab -e

Insertion de :

# SYNCHRO NTP
00 00 * * * /usr/sbin/ntpdate-debian

Kerberos

Kerberos est un protocole d'authentification réseau qui va servir à sécuriser l'intégration du serveur Debian dans le domaine Microsoft Windows. Installation du paquet :

apt-get install krb5-user

Le fichier de configuration est /etc/krb5.conf, il doit contenir :

            [logging]
                    default = FILE:/var/log/kerberos/krb5.log 
                    kdc = FILE:/var/log/kerberos/krb5kdc.log 
                    admin_server = FILE:/var/log/kerberos/kadmind.log
            
            [libdefaults] 
                    default_realm = CLAUDEL.PRIV 
                    dns_lookup_realm = false 
                    dns_lookup_kdc = false #peut etre a false pour eviter un nslookup 
                    ## default_tkt_enctypes = des3-hmac-sha1 des-cbc-crc 
                    ## default_tgs_enctypes = des3-hmac-sha1 des-cbc-crc 
                    ## permitted_enctypes = des3-hmac-sha1 des-cbc-crc
            [realms]
                    CLAUDEL.PRIV = { 
                            kdc = serveur.claudel.priv 
                            admin_server = serveur.claudel.priv 
                            default_domain = CLAUDEL.PRIV 
                    } 
            
            [domain_realm] 
                    .claudel.priv = CLAUDEL.PRIV 
                    claudel.priv = CLAUDEL.PRIV

Remarque : la casse est importante, le nom d'un royaume kerberos doit être en lettres CAPITALES.

Test

Demande d'un ticket (le mot de passe administrateur est demandé) :

kinit administrateur@CLAUDEL.PRIV

Liste des tickets en mémoire :

            klist
            Ticket cache: FILE:/tmp/krb5cc_0 
            Default principal: administrateur@CLAUDEL.PRIV 
            Valid starting     Expires            Service principal 
            05/28/09 12:50:39  05/28/09 22:50:42  krbtgt/CLAUDEL.PRIV@CLAUDEL.PRIV 
                    renew until 05/29/09 12:50:39 
            Kerberos 4 ticket cache: /tmp/tkt0 
            klist: You have no tickets cached

A ce stade, la connexion et l'échange de données sont sécurisées entre le serveur Debian et le PDC. Il reste à installer les paquets nécessaires à l'authentification des utilisateurs avec Active Directory.

Winbind et Samba

Winbind et Samba vont assurer la liaison avec l'annuaire Active Directory. Installation des paquets :

apt-get install winbind samba

Configuration de /etc/samba/smb.conf

                [global]
                    security = ADS 
                    realm = CLAUDEL.PRIV 
                    netbios name = ltsp 
                    password server = serveur.claudel.priv 
                    workgroup = CLAUDEL 
                    wins server = 192.168.224.1, 192.168.224.10 
                    encrypt passwords = yes
                    unix extensions = no
                    #nt acl support = yes 
                    #acl inherit = yes
            
                    #winbind
                    winbind use default domain = yes 
                    winbind separator = +
                    #winbind refresh tickets = yes 
                    #winbind offline logon = yes 
                    winbind normalize names = yes 
                    idmap uid = 10000-20000 
                    idmap gid = 10000-20000 
                    winbind enum users = yes 
                    winbind enum groups = yes 
                    template homedir = /home/%D/%U 
                    template shell = /bin/bash 
                    client use spnego = yes 
                    use kerberos keytab = yes 
                    
                    # empêche le client de devenir maitre explorateur 
                    domain master = no 
                    local master = no 
                    preferred master = no 
                    os level = 0 
                    
                    # PERFORMANCES 
                    socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 
                    log file = /var/log/samba/smb.log
            

Remarques :

  • winbind separator = + : séparateur utilisé entre le nom de domaine et le compte utilisateur. On trouve généralement "+" (Ainsi pour se connecter on pourrait donner DOMAIN+username). Samba peut émettre un warning lors du restart mais cela n'affecte pas le fonctionnement.
  • winbind use default domain = Yes : le domaine par défaut est utilisé il est donc possible de se connecter en utilisant seulement le nom de l'utilisateur au lieu de DOMAIN+username.
  • idmap uid = 600-2000 and idmap gid = 600-2000 : définit sur quel user id et group id les utilateurs vont être mappés de l'Active Directory vers le serveur Debian.
  • template shell = /bin/bash : shell par défaut des utilisateurs.
  • offline login = yes : Debian conserve un cache local des utilisateurs et groupes afin d'être opérationnel même en cas de coupure de liaison avec le contrôleur de domaine.
  • enum : permet à la commande "getent" de retourner les groupes avec les comptes utilisateurs.
  • Refresh ticket : normalement winbind redemandera automatiquement un nouveau ticket lorsque le précédent aura expiré.

Redémarrage des services pour prendre en charge la nouvelle configuration :

/etc/init.d/samba restart

Effectuer une requête de TGT Kerberos valide, ce dernier étant autorisé à joindre des machines au domaine AD (le mot de passe administrateur est demandé) :

net join -U Administrateur -S serveur.claudel.priv
Using short domain name – CLAUDEL.PRIV
Joined 'LTSP' to realm 'CLAUDEL.PRIV'

Le serveur est maintenant intégré au domaine claudel.priv et donc listé dans Active Directory. Redémarrage de winbind pour recharger la configuration après l'intégration au domaine :

/etc/init.d/winbind restart
Test

Il est maintenant possible de récupérer la liste des utilisateurs du domaine :

wbinfo -u

et aussi celle des groupes :

wbinfo -g

PAM

Puisque le serveur Debian est maintenant intégré au domaine windows, il va falloir modifier le système d'authentification afin qu'il ne recherche plus dans les comptes locaux mais dans ceux du domaine (Active Directory ou un compte IACA). Plusieurs fichiers de configuration sont à modifier.

On crée en premier lieu le répertoire où se trouvera tous les répertoires utilisateurs. Par défaut, /home/%D (voir le smb.conf ci-dessus). Dans le cas du domaine claudel.priv, on crée :

mkdir /home/CLAUDEL
chmod 777 CLAUDEL

On installe ensuite quelques paquets nécessaires au montage automatique des répertoires utilisateur.

apt-get install libpam-mount smbfs

Modification du fichier /etc/nsswitch.conf :

            passwd:         compat winbind 
            group:          compat winbind 
            shadow:         compat winbind 
            hosts:          files dns 
            
            networks:       files
            
            protocols:      db files 
            services:       db files 
            ethers:         db files 
            rpc:            db files 
            
            netgroup:       nis

Pour tester, on peut afficher la liste des comptes utilisateur du domaine :

getent passwd

et aussi celle des groupes :

getent group

Modification du fichier /etc/pam.d/common-account :

            account sufficient     	pam_unix.so
            account required      	pam_winbind.so

Modification du fichier /etc/pam.d/common-auth :

            auth sufficient 	pam_unix.so	nullok_secure
            auth required 	pam_winbind.so 	use_first_pass
            auth optional    	pam_group.so
            auth optional   	pam_mount.so 	use_first_pass

Remarque : « pam_group » : ce module va permettre d'étendre les droits des groupes de l'Active Directory vers le système linux (/etc/group). En effet, là ou windows dispose d'un nombre de groupes restreint, linux possède des groupes spécifiques : exemple, pour monter un périphérique et se servir de la carte son, il faut faire parti des groupes mount et audio. Il va donc falloir donner ces droits au groupes Active Directory «utilisateurs du domaines» afin qu'ils puissent monter une clé USB ou écouter de la musique. Le fichier de configuration associé « /etc/security/group.conf » sera modifié plus bas dans ce guide.

Modification du fichier /etc/pam.d/common-pammount :

            auth       optional   pam_mount.so try_first_pass 
            session    optional   pam_mount.so try_first_pass

Modification du fichier /etc/pam.d/common-password :

            password   sufficient   pam_unix.so 	nullok obscure md5
            password   sufficient   pam_winbind.so  	use_first_pass 
            password   required     pam_deny.so

Modification du fichier /etc/pam.d/common-session :

            session required pam_mkhomedir.so 	skel=/etc/skel umask=0077 silent
            session optional pam_mount.so 	use_first_pass
            session required pam_unix.so

Remarque :

  • l'option « silent » évite d'avoir un message de confirmation lors de la création ou la suppression d'un dossier.
  • il faut bien mettre « pam_mkhomedir » sinon le répertoire utilisateur n'est pas automatiquement crée par le système si celui-ci n'existe pas.

Modification du fichier /etc/pam.d/gdm :

            #%PAM-1.0 
            
            auth    requisite       pam_nologin.so 
            auth    required        pam_env.so readenv=1 
            auth    required        pam_env.so readenv=1 envfile=/etc/default/locale 
            
            @include common-auth 
            auth    optional        pam_gnome_keyring.so 
            
            @include common-account 
            session required        pam_limits.so 
            
            @include common-session 
            session optional        pam_gnome_keyring.so auto_start 
            
            @include common-password 
            

Montage automatique des répertoires

Cette explication est la solution à la problèmatique des fichiers partagés entre les systèmes linux et windows et les paramètres de chaque applications de l'utilisateurs. Il convient de bien comprendre afin d'appréhender plus facilement le fichier de configuration qui sera peut-être à adapter à votre réseau.

Théorie

L'authentification étant réglée, l'utilisateur doit maintenant pouvoir retrouver ses fichiers persos et les partages publiques dans sa session graphique.

Le problème est le suivant : l'utilisateur doit indépendamment du système où il se connecte pouvoir accéder à ces fichiers persos tout en conservant la configurations des applications. En effet, sous windows la configuration des applications (Firefox, Vlc...) est par défaut dans le répertoire caché System des profils itinérants alors que sous linux, ces fichiers de configurations sous souvent à la racine du home. Il ne faut donc pas les mélanger !

Sur mon contrôleur de domaine Windows, chaque utilisateur dispose d'un répertoire perso qui est partagé sur le domaine de façon cachée (le fameux "$" à la fin du nom de partage).
Exemple : Dupont Mathieu a un répertoire perso dont il peut accéder sous windows par \\serveur.claudel.priv\DUPONT$. Il a aussi accès en fonction de son groupe à un répertoire partagé en \\serveur.claudel.priv\Classes\TS1. Pour les connaisseurs, cette configuration est celle mise en place par Iaca dans l'Éducation Nationale.

Sur les clients légers, le home de l'utilisateur sera /home/CLAUDEL/DUPONT/. Ce répertoire contiendra 2 sous-répertoires :

  • Documents qui sera le point de montage de \\serveur.claudel.priv\DUPONT$.
  • Classes qui sera le point de montage de \\serveur.claudel.priv\Classes\.

Toute l'astuce réside ici : les fichiers de configuration linux resteront sur le serveur linux puisque le répertoire perso DUPONT$ n'est pas directement monté dedans mais dans un sous-répertoire Documents.

Pratique

En fonction de votre configuration (nom de partage ou point de montage), le fichier suivant sera à adapter.

Modification du fichier /etc/security/pam_mount.conf.xml. Ce fichier étant assez long, seuls les changements visibles seront affichés ici : à savoir la création d'un volume qui sera automatiquement monté au démarrage :

            <debug enable="1" />
            <volume
                    user="*"
                    fstype="cifs"
                    server="192.168.224.1"
                    path="%(USER)$"
                    mountpoint="~/Documents"
                    options="dir_mode=0755"
            />
            
            <volume 
                    user="*" 
                    fstype="cifs" 
                    server="192.168.224.1" 
                    path="CLASSES" 
                    mountpoint="~/Classes" 
                    options="dir_mode=0755,nobrl" 
            />

Remarques : cette configuration va de paire avec :

  • server : l'IP de mon contrôleur de domaine windows ou se trouve les répertoires partagés.
  • « template_home_dir » du smb.conf : par défaut quand un utilisateur se connecte son répertoire utilisateur sera monté en /home/NOM_DU_DOMAINE/UTILISATEUR
  • les différentes section concernant « pam_mount » dans les fichiers se situant dans /etc/pam.d (voir plus haut).
  • Un « bug » windows fait qu'il utilise l'attribut de lecture seule sur les dossiers pour forcer l'explorateur à lire dans les fichiers Desktop.ini. Ce bug a été réglé par le patch au niveau du kernel.
  • Une fois les partages correctement montés, il est recommandé de désactiver le mode debug (mettre à 0).
  • Le point de montage n'est pas directement le répertoire « home » de l'utilisateur et qu'à la première connexion le répertoire « Documents » même s'il est automatiquement créé par pam_mount peut ne pas être monté (la première fois). C'est pourquoi, dans le modèle dans /etc/skel/ on créera les dossiers « Documents » et « Classes » qui seront donc appelés par  « pam_mkhomedir » la première fois puis juste après monté par pam_mount. Et dans ce cas tout est ok.

Bugs et solutions

Un bug dû à une latence entre la déconnexion graphique (gdm) et le système fait que le répertoire perso n'est pas correctement démonté.

(pam_mount(mount.c:542) waiting for umount, pam_mount(pam_mount.c:623) unmount of usertest$ failed, pam_mount(pam_mount.c:634) pam_mount execution complete)

Ce bug n'existe pas sur une session ssh en utilisant un compte du domaine (la déconnexion ssh démonte bien le répertoire perso). Pour corriger ce problème il faut ajouter le paramètre -l (lazy) à la commande de démontage utilisée par pam_mount dans le fichier /etc/security/pam_mount.conf.xml

            <umount>umount -l %(MNTPT)</umount>

Par la suite lors d'une déconnexion, le répertoire utilisateur est bien démonté.

Adaptation automatique des groupes linux

On l'a vu plus haut avec PAM, les droits par défaut des utilisateurs de l'AD sont limités. On va donc les étendre grâce à « pam_group » en les ajoutant automatiquement aux groupes d'accès : montage, imprimante, scanner... Ainsi les utilisateurs des clients légers pourront utiliser des imprimantes, des clés USB...

Modification du fichier /etc/security/group.conf :

*;*;*;Al00002400;floppy,audio,cdrom,video,plugdev,scanner,fuse

Remarque : 0000 et 2400 sont respectivement des horaires (hhmm) de début et de fin d'attribution des groupes.

Gestion des connexions perdues ou crashées

Il peut arriver qu'un client se soit mal déconnecté ou ne se soit pas déconnecté du tout (plantage machine ou perte de connexion réseau). Dans ce cas, l'utilisateur n'est plus connecté au serveur mais sa session (programmes en cours...) et ses fichiers (montage de son répertoire perso) sont toujours activés.

Ceci peut poser des problèmes de performances (sur le long terme le serveur pourrait être saturé d'utilisateurs non-actifs) et aussi de connexion (quid d'un utilisateur qui se connecte sur plusieurs machines en même temps ?).

Installation de « gnome-watchdog » (voir dans les ressources ou télécharger directement)

apt-get install gtkdialog
dpkg -i gnome-watchdog_0.9.2_i386.deb

Par défaut, watchdog va killer les process résiduels après une déconnexion. Cependant si l'utilisateur n'a pas pris la peine de se déconnecter proprement (mise hors tension du client...) et tente de se reconnecter alors gnome-watchdog sera impuissant. Pour forcer gnome-watchdog à vérifier si l'utilisateur n'est pas déjà connecté :

touch /etc/check_previous_login

Remarque :

  • Si un fichier check_previous_login est présent dans /etc/ alors un utilisateur ne peut se connecter qu'une session à la fois !
  • Dans la pratique, à chaque connexion d'un utilisateur, /etc/X11/Xsession.d/82-gnome-watchdog va exécuter le script /usr/share/gnome-watchdog/gnome-watchdog-start. Celui-ci récupère alors la liste de tous les utilisateurs connectés. Lors de cette vérification, si un utilisateur n'est plus connecté mais que ses applications sont encore ouvertes, il les kill. Il ne s'agit donc pas d'un cron qui tourne mais bien un déclenchement après connexion utilisateur.

Nettoyage de /tmp

Au fur et à mesure des connexions sur le serveur de clients légers, le répertoire temporaire /tmp se remplit beaucoup plus vite qu'il ne se vide (uniquement au démarrage) et peut arriver à saturation. Il faut donc le vider régulièrement. Ce script va automatiquement supprimer les fichiers ou dossiers temporaires créés il y a plus de 24h.

Création de /root/script/clean_tmp.sh

#!/bin/bash
find /tmp -mtime +0 -type f -exec rm {} \;
find /tmp -mtime +0 -type d -exec rmdir {} \;

Ajout, au cron du root pour exécuter le nettoyage tous les jours à 7h du matin

crontab -e
## PURGE /TMP
00 07 * * * /root/script/clean_tmp.sh 1> /dev/null 2> /dev/null

Activation du pavé numérique au démarrage

Pour activer le pavé numérique dès la fenêtre de connexion, il faut installer le paquet numlockx :

apt-get install numlockx

Un fichier /etc/X11/Xsession.d/55numlockx a normalement été créé. Ainsi à chaque connexion graphique d'un utilisateur ce script sera exécuté et le pavé numérique activé.

Remarque : si ce fichier n'a pas été créé voici son contenu :

            #!/bin/bash 
            # Xsession.d script for numlockx. 
            # 
            # 
            if [ -x /usr/bin/numlockx ]; then 
                    /usr/bin/numlockx on 
            fi 

Mises à jour des clients légers

Matériel

Par défaut, les clients légers détectent le matériel et se configurent automatiquement. Dans le cas contraire (exemple: un écran 17" spécifique) il faut alors éditer le fichier /opt/ltsp/i386/lts.conf.

Remarque : parce que le fichier lts.conf n'est pas simplement partagé par NFS mais fait partie intégrante de l'image Squashfs envoyée par réseau, il faut reconstruire l'image avec ltsp-update-image après chaque changement apporté au fichier.

Logiciel

Depuis la version 5 de LTSP (celle utilisée dans ce guide), les paquets à installer dans l'environnement clients légers sont à la charge de la distribution utilisée (ex: Debian, Archlinux, Fedora, Ubuntu...). Ainsi la gestion est plus simple et complètement déportée : l'installation d'un paquet sur le serveur le rendra instantanément disponible sur les clients légers sans la moindre manipulation supplémentaire et sans faire reconnecter les clients légers.

Exemple : les utilisateurs ont besoin de se connecter sur jabber en utilisant le logiciel pidgin. L'administrateur passe en root sur le serveur Debian (en local, par ssh, sudo depuis un client léger...) et utilise le gestionnaire de paquets de sa distribution (ex: « apt-get install pidgin » pour Debian). Le logiciel sera alors instantanément disponible pour les utilisateurs !

Remarque : après un changement de kernel, il faut en plus reconstruire l'image des clients légers avec ltsp-update-image.

Logiciels et périphériques

Plugin flash player

Par défaut, Debian utilise le paquet « swfdec ». S'il a l'avantage d'être libre il est surtout très lent et pas toujours compatible les animations complexes ou les lecteurs de vidéos flv (youtube, dailymotion...). Faire une installation de la version non-free à partir des backports.

Ajouter dans le /etc/apt/source.list

deb http://www.backports.org/debian lenny-backports main contrib non-free

Ajout de la clé du dépôt

wget -O - http://backports.org/debian/archive.key | apt-key add -

Mise à jour la liste des paquets

apt-get update

Installation du plugin flash

apt-get install -t lenny-backports flashplugin-nonfree flashplugin-nonfree-extrasound
Clés USB

Les utilisateurs faisant parti du groupe autorisé à monter les clés USB (voir pam_group), il n'y a plus aucun problème de montage. Aussi, un plus grand nombre de clés sont reconnues (contrairement à windows où il faut les droits administrateurs) et avec une sécurité accrue : meilleure visibilité des virus (qui n'ont aucun effet) sur la clé.

Imprimantes et scanners

Seul l'administrateur peut gérer les imprimantes et les scanners. Les utilisateurs n'ont qu'un droit d'utilisation (imprimer ou scanner).

Personnalisation de LTPS

L'écran d'accueil est géré par LDM, les thèmes de l'écran de connexion au serveur de clients légers sont à mettre dans /opt/ltsp/i386/usr/share/ldm/themes. Le thème par défaut est « ltsp ».

Pour créer un thème personnalisé, on peut d'abord copier celui par défaut :

cp -r /opt/ltsp/i386/usr/share/ldm/themes/ltsp /opt/ltsp/i386/usr/share/ldm/themes/perso

Après modification des images à l'intérieur de ce dossier, on met à jour le lien symbolique qui gère le thème par défaut :

rm /opt/ltsp/i386/usr/share/ldm/themes/default
ln -s /opt/ltsp/i386/usr/share/ldm/themes/perso /opt/ltsp/i386/usr/share/ldm/themes/default

Remarque : attention le nom des images doit rester identique !

Ressources