Fabriquer un terminal X avec NX/FreeNX
Le 9 avril 2008, à 21:24 par Ulhume...

FreeNX est la version libre d'un excellent produit NoMachine. L'objectif de ces serveurs est de permettre, même à très bas débit, de déporter l'affichage graphique des serveurs X sur un terminal distant, que ce soit un Unix, ou même un Windows.

Lancer des applications graphiques à distance

Comme vous ne l'ignorez peut-être pas, X11 est une technologie client/serveur. C'est à dire que lorsque une application est lancée, elle n'écrit jamais directement sur l'écran mais se connecte via le réseau, à un serveur, le fameux Xorg. Ainsi, à chaque vois qu'elle veut afficher un bouton, ou une image, c'est à ce serveur que cette demande est transmise et c'est lui qui effectue le rendu visuel.

Alors évidemment ceci ne va pas sans une certaine perte de performance par rapport, par exemple, à Windows dont les applications se passent de cet intermédiaire. Cependant les impactes sur la vitesse sont limités à plusieurs étages comme par l'utilisation de sockets rapides dits UNIX au lieu des classiques TCP/IP ou encore un accès direct à la carte graphique dans des cas critiques comme la 3D ou la vidéo.

Maintenant cette toute relative perte de performance ne doit pas faire oublier les immenses avantages de cette solution : la transparence réseau. En effet, déporter l'affichage d'une application sur une machine distante, exécuter sur son écran local une application qui se trouve sur un serveur distant, tout cela et bien d'autres choses encore sont rendues possibles grâce au serveur X.

X était conçu l'origine pour tourner sur des LAN à 10mb/s avec un serveur puissant et des terminaux graphiques. Mais rapidement, le développement des modems RTC a amené des groupes de travail à plancher sur des versions plus efficaces de X, moins consommatrices en bande passante, pour arriver à le faire passer par ces petits tuyaux à 14400 bauds . Nous pouvons citer pour mémoire le module LBX.

Aujourd'hui, avec nos lignes haut débit, il est possible de disposer à distance d'une fluidité d'affichage très proche de ce que l'on obtient en local. Non plus grâce à LBX, paix à son âme, mais par une savante mixture de SSH et d'optimisation du protocole X : les clients/serveurs NX.

De NoMachine à FreeNX

Comme nous l'avons vu, il est depuis longtemps possible de lancer une application distante en utilisant un serveur graphique local. A nature même de X est faite pour cela. SSH permet lui aussi de faire ce genre de chose sans avoir à ouvrir le moindre port, grâce à son système de redirection. Du coup, si vous faites un ssh sur une machine distante qui dispose de X, il suffit de lancer une application graphique pour qu'elle s'affiche en locale. C'est le CPU distant qui travail mais votre machine locale qui affiche avec SSJ qui faire la colle sécurisée entre les deux.

L'idée de NoMachine exploite ce concept en le combinant avec l'idée de compression, d'optimisation, et de mise en cache de LBX. Le résultat est un la possibilité d'accéder à son bureau de n'importe où, avec une qualité et une rapidité étonnante.

Le système NoMachine ne demande aucune modification des applications et utilise pleinement la norme X11. Il se compose d'un serveur et d'un client. Ce dernier existe pour Linux, Windows, MacOS et Solaris.

Côté serveur, à l'origine, la version était seulement commerciale et les sources pas tous libres. C'est pour cela qu'est né le projet FreeNX permettant d'intégrer dans toutes les distributions un serveur libre exploitant le protocole NX. Ceci dit, FreeNX ne serait rien sans la société NoMachine, donc pensez-y pour un usage en entreprise et prenez plutôt les licences chez eux.

Mise en oeuvre

L'installation du serveur FreeNX sur la machine distante est très simple, il suffit juste de faire un urpmi freenx. Ceci fait, il faut indiquer à freenx que l'utilisateur gastoon est autorisé à s'y connecter :

  1. nxserver --adduser toto --system
  2. nxserver --passwd toto
  3. # redonner le mot de passe de toto

Ceci fait, c'est terminé pour la machine distante. Il faut maintenant installer le client NX pour la machine locale. Il se trouve sur la partie download du site de NX. Une fois téléchargé, lancez la commande urpmi en mettant en paramètre le chemin et le nom du fichier téléchargé.

Ne reste alors plus qu'à tester. Lancez la commande nxclient. Cela devrait faire apparaître une fenêtre de connexion. Saisissez toto comme login, le mot de passe, donnez le nom qui vous amuse à la session, puis cliquez sur configure...

Dans le cadre Server, saisissez le nom ou l'IP de la machine distante et cliquez sur Key....

NX utilisant le système SSH sans mot de passe pour se connecter il va donc nous falloir copier la clef publique du serveur. Cette clef se trouve, sur la machine distante, dans le fichier /var/lib/nxserver/nxhome/.ssh/client.id_dsa.key. Faites un simple copier/coller dans la boite de dialogue et validez.

Allez maintenant dans l'onglet Advanced et vérifiez que l'option Disable SSL encryption of all traffic est bien décoché. Ensuite cliquez sur OK.

Si comme moi vous utilisez aussi NX en local, cochez cette case pour rendre le protocole plus rapide.

Maintenant, il ne reste plus qu'à se connecter en cliquant sur login.

Utilisation avancée

Par défaut, le client NX chercher à lancer en plein écran une session KDE complète. Il est possible de customiser ce comportement dans l'onglet General en sélectionnant votre environnement (Gnome par exemple) dans la section desktop. Pour lancer l'environnement par défaut, sélectionnez Custom. Cela lancera ce qui aurait été utilisé par un startx sur la machine distante.

Enfin, pour lancer une seule application, sans mettre en branle une session complète, retournez dans le paramétrage de la session. Réglez à Custom, puis cliquez sur Settings.... Là, par exemple pour ne lancer que la commande xterm, sélectionnez Run the following command et saisissez /usr/bin/xterm. Et comble du raffinement, pour que cette application ne se lancera pas un bureau virtuel mais uniquement sa fenêtre standard. Totalement intégré donc.

En case de problème

Il y a un paquet de choses qui peuvent bloquer la connexion à NX. Voici celles que j'ai pu rencontrer.

Activation des logs

Il y a bien un fichier de logs créé sur le serveur en /Var/log/nxserver.log mais il n'est pas très bavard par défaut... Pour activer les logs, il faut ouvrir le fichier /etc/nxserver/node.conf puis décommenter/modifier la ligne NX_LOG_LEVEL<.kbd> en changeant le 0 par un 6 ou un 7. Sauver puis redémarrez le serveur par un nxserver --restart. Les logs devrait d'un coup être beaucoup plus loquaces.

Il y a des sessions suspendues...

Si la connexion ne passe pas, vérifiez qu'il n'y a pas de session existante bloquée dans le tuyau. Pour cela, il faut utiliser sur la machine distante la commande nxserver --list. Si des sessions apparaissent, lancez un nettoyage par nxserver --cleanup. Retentez la connexion.

Version du client incompatible

Cela coince avec les versions .4 de freeNX si l'on utilise une version du client supérieur à la 1.5. On peut trouver facilement cette ancienne version via google (me la demander le cas échéant).

Mauvaise configuration de sshd

Si l'on obtient l'erreur Failed publickey for nx from ... dans les logs serveurs de ssh, il est possible qu'il vous faille commenter dans le fichier /etc/sshd/sshd_config une ligne du style AuthorizedKeysFile home/lobs/.ssh/authorized_keys2. Relancez ensuite le serveur et recommencez la connexion.

Activation du SSH total

Si l'on n'est pas en LAN et donc que l'on passe par un tunnel SSH, il faut absolument, dans la configuration du client, activer l'option de l'onglet Avanced, Enable SSH encryption of all Traffic.

Dans la version 3.0 de nxclient, l'option s'est inversée, il faut donc vérifier que l'option Disable SSL encryption of all traffic est décochée

Erreur de cookie

Si vous obtenez l'erreur

  1. Error: Failure negotiating the session in stage '7'.
  2. Error: Wrong version or invalid session authentication cookie.

Dans mon cas, il s'agissait seulement d'un serveur X non opérationnel sur la machine distante. Ceci a été réglé par un simple :

urpmi xinit

Erreur d'authentification de l'utilisateur NX

mv authorized_keys2 authorized_keys

Si le fontes sont moches

Si les fontes sont trop petites, vous devez rajouter sur le compte local un fichier ~/.Xresources et y mettre la ligne

Xft.dpi: 96

Si les fontes sont moches ET les icônes aussi

Là vous êtes sûrement sous Gnome. Auquel cas il faut que vous lanciez, dans la session NX, la commande /usr/lib/gnome-settings-daemon avant de lancer d'autres applications. Tous les thèmes devraient alors être correctement utilisés.

Si la connexion cale en disant que le serveur ne peut se connecter au localhost:22

Peut-être avez-vous suivi mes conseils et placé SSHD sur un port différent du 22. Auquel cas sur le serveur il vous faut éditer /etc/nxserver/node.conf, décommenter la ligne #Port 22 et replacer 22 par le port que votre SSHD écoute.

Conclusion

NX/FreeNX sont des outils fantastiques permettant de transformer un vieille bécane poussive en un performant serveur X. Personnellement c'est le mode d'affichage qui me permet d'exploiter mon troisième écran utilisé en conjonction avec synergy.

Commentaires

Dab, le 9 April, 2008 - 22:52

Merci pour cet excellent article, je cherche justement à remplacer Exceed par un équivalent free. Un collègue avait fait un test concluant avec openssh + Xming mais cette solution semble plus intéressante. A savoir si l'on peut compiler le serveur sur AIX ?

Bizu , le 10 April, 2008 - 09:28

Bonjour ! J'ai trouvé cet article très très intéressant, je me pose juste une question avant d'y passer Smiling

J'avais déjà essayer les bureaux à distance sous Linux avec la bête fonction 'Bureau à distance' d'Ubuntu mais celle-ci utilisait VNC qui m'a tout de suite déplut (affichage ralentit, couleurs bizarres)

Est-ce que FreeNX utilise aussi VNC ?

malic , le 10 April, 2008 - 10:51

Je n'ai jamais réussi à mettre un client sous FreeBSD malheureusement mais c'est un excellent outils.

Petit ajout :
A noter une chose, FreeNX n'est pas un outils de prise de main à distance mais un véritable serveur de terminal. La différence peut paraître floue mais elle est simple.
Prise de main à distance, je prends la main sur l'affichage/clavier/souris (l'écran de l'ordi serveur) et on peut me voir voir bouger, ce que je fais dessus.
Un serveur de terminal crée un "nouvel affichage" sur le serveur et on ne voit pas ce que vous faites sur l'écran de l'ordi serveur.
Méfiez vous: ça n'est pas adapté pour piloter le poste à Mamie pour la dépanner.

Non, il n'utilise pas VNC mais les comme la détailler Ulhume, il utilise l'architecture client-serveur d'XWindows à travers un canal crypté SSH.

Forth , le 17 April, 2008 - 22:33

Salut,

Très bonne introduction à la techno NoMachine, il existe un client libre OpenNX http://sourceforge.net/projects/opennx
et pour la prise en main à distance, le protocole NX permet de transporter/compresser d'autres protocoles que X (vnc, rdp): http://openfacts.berlios.de/index-en.phtml?title=NX_Components

Ulhume, le 19 April, 2008 - 13:12

@Forth (un rapport entre ce psoeudo et le langage de mon enfance ? )
Je ne connaissance pas OpenNX, très sympa comme projet. Pour l'instant il ne semble pas encore en standard dans la mandriva, faudrait que je compile cela à l'occasion.

Sinon intéressant tes infos sur l'utilisation de NX pour le RDP, le seul truc que je capte pas bien c'est que pour moi RDP c'est du Terminal Servel, donc il faut un Windows en début de chaîne non ?

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...