Fabriquer un terminal X avec NX/FreeNX
Le 18 February 2009 à 14:33.

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 :

nxserver --adduser toto --system
nxserver --passwd toto
# 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

Error: Failure negotiating the session in stage '7'.
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 avril, 2008 - 23: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 avril, 2008 - 10: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 avril, 2008 - 11: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 avril, 2008 - 23: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 avril, 2008 - 14: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 ?

Dup, le 19 novembre, 2008 - 00:48

Bon voilà un ptit article intéressant qui mèle deux concept connu mais qu'on ne pense pas forcément à marier Wink

Je retiens surtour le coup de DBUS_SESSION dans ssh, sinon oui synergy est un outil qui m'a vraiment épaté et réactif.

Bravo pour cet article, bon je retoune voir ton ldap il me faut l'option pour passer le password de maillon en maillon Sticking out tongue

erdnaxeli, le 20 novembre, 2008 - 18:21

Excellent ce truc ! Faudra que je teste avec mon eeePC.
Par contre quand il faut rediriger Xorg via SSH je n'ai pas tout compris. Si j'ai bien suivi on redirige le port de X11 vers le netbook ce qui fait que quand on lance via ssh une application depuis le netbook celle-ci s'affiche directement sur l'écran du netbook alors qu'elle tourne sur l'autre PC. Quel est le port à rediriger ? Et si j'ouvre un nautilus depuis le netbook (nautilus tournant sur l'autre PC) verrais-je les fichiers du netbook ou de l'autre PC (je penche pour le deuxième solution) ?
Autre question : à ton avis, quel est le vitesse de réseau nécéssaire pour déporter xorg (je demande ça parce que je suis en wifi et assez loin du routeur) ?

Ah oui aussi je n'ai pas saisi l'intêret de lancer X sur le portable à partir de la machine de bureau.

Ulhume, le 20 novembre, 2008 - 18:34

@erdnaxeli

J'ai essayé d'expliquer le principe le mieux possible ici : http://artisan.karma-lab.net/node/82

Pour prendre le cas netbook --SSH---> PC :
- Le port (automatique) redirigé par SSH est le NetBook:6000 généralement qui mappé sur généralement le localhost:6010 .

- Ce qui fait qu'au sein de la session SSH sur PC, le serveur X utilisé est DISPLAY=localhost:10.

Donc c'est bien le deuxième cas, l'application tourne sur le PC, mais utilise un faux display qui est forwardé par ssh sur le vrai serveur X du netbook.

Pour le débit je n'ai pas fait de tests, je suis en lan gigabit donc très mauvais juge. Mais si ton débit est trop faible, je te conseille de passer soit par NX, soit par LBX.

Pour l'intérêt de lancer X à partir du PC de bureau correspond au cas de figure où l'on n'utilise pas un portable, mais une machine fixe, généralement un petit serveur sans clavier ni souris. Lancer le serveur X automatiquement permet donc d'automatiser "l'allumage" du 3ième écran sans avoir à saisir quoi que ce soit.

Spip, le 18 février, 2009 - 22:32

Excellent article comme d'habitude.

J'aimerai poser une question sur ce theme que j'ai depuis quelques temps.

Est il possible d'afficher une pop up sur tous les sessions X de la machine distante ...
...afin de prévenir d'un reboot par exemple après une administration du pc distant (maj kernel etc.)

Merci.

Ulhume, le 19 février, 2009 - 03:18

Dans quel mode de connexio ? direct, ssh ou nx. Dans le dernier cas il me semble qu'il existe un nxserver --broadcast message
pour le reste, c'est peut être fu côté de la comande wall qu'il faudrait chercher.

Spip, le 19 février, 2009 - 08:54

oh, pardon, oui c'est à ssh que je pensais au premier abord...

tuxce, le 19 février, 2009 - 15:57

Un complément d'information sur ssh qui pourrait t'intéresser, je m'étais posé la question il y a un moment sur la différence entre le -X qu'on voit un peu partout utilisé avec ssh et le -Y que j'avais commencé à utiliser parce que je suis tombé dessus avant le -X Smiling
http://www.hsc.fr/ressources/breves/ssh-x11.html

Ulhume, le 23 février, 2009 - 14:03

Tu as un exemple pratique pour lequel le -Y est obligatoire ?

Sooske, le 23 février, 2009 - 09:57

Dans l'utilisation de freenx, je suis obligé de me mettre en fullscreen pour ne pas décaler le tableau de bord de la mandriva 2009.1, l'un de vous aurez une solution pour éviter cela ?
Sachant qu'il serait plus pratique d'avoir freenx, en taille plus petite sur le bureau afin de travailler plus facilement.

Ulhume, le 23 février, 2009 - 14:04

En réglant la résolution dans le paramétrage du client ?

Sooske, le 23 février, 2009 - 15:57

Je n'ai trouvé qu'en mettant en fullscreen et la ça ne me décale rien du tout.

TKz, le 9 août, 2009 - 21:34

Merci pour cet article fort intéressant (malheureusement je l'ai trouvé trop tard, j'ai configuré mon FreeNX sans ton aide, j'aurais peut être gagné un peu de temps Smiling )

Juste une précision :

NX utilisant le système SSH sans mot de passe pour se connecter. Il va donc nous falloir récupérer la clef publique du serveur qui 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."

C'est la clé privée qu'on récupère, c'est elle qui nous permet de nous connecter au serveur, et non la clé publique, qui comme son nom l'indique peut être "publique" sans que ce soit un problème de sécurité.

erdnaxeli, le 13 août, 2009 - 13:29

C'est moi où l'article a changé depuis mon dernier commentaire ? Tu ne parles plus de comment utiliser le même clavier la même souris pour deux machines par exemple (ce qui m'intérresse actuellement).

Ulhume, le 13 août, 2009 - 23:34

Non c'est pas toi, mais il y a eu séparation : http://artisan.karma-lab.net/node/1314

erdnaxeli, le 14 août, 2009 - 12:41

Merci !

Sinon, à propos de Xorg, je savais qu'il pouvait s'utiliser via le réseau mais je ne pensais pas que c'était aussi simple. Dans le cas d'un ssh -X, tu dis que le volume de données peut être pénalisant. Est-ce que c'est pareil pour l'option "native" ? Autre question, avec l'option "native" on se connecte d'abord en ssh, mais les données transitent-elle par ce tunnel ou pas ?

Ulhume, le 15 août, 2009 - 10:28

Cela dépend beaucoup des machines en jeux car ce qui pénalise avec l'option tunnel SSH, c'est le chiffrement. En revanche, SSH permet la compression. Donc deux machines véloces seront normalement plus rapides en tunnel SSH qu'en natif.

Dans l'option native, SSH ne sert qu'à se connecter. Les applications que tu lances utilisent la variable d'environnement $DISPLAY pour savoir où se trouve le serveur X11. Si le mode "tunnel SSH" est utilisé, il s'agit généralement d'un "localhost:11", si c'est le mode natif, "serveur_distant:0". Dans le second cas, le trafic de X11 ne passe donc pas par ssh mais va bien directement sur "serveur_distant"

xanix, le 24 février, 2010 - 12:59

J'ai trouvé l'article très intéressant.

Mais voilà mon problème :

sur ma première machine j'ai DISPLAY=:0.0

et sur ma seconde j'ai DISPLAY=localhost:11.0

quand je vais sur ma seconde machine et que je fais DISPLAY=:0.0 je peux rediriger mes application

mais sur ma première machine quand je fais DISPLAY=lochalhost:11.0, il me dit can't open display.

Ma question à quoi correspond localhost ?

Ulhume, le 25 février, 2010 - 09:59

localhost est l'adresse locale de ta machine. Même si aucun cable ethernet (ou du wifi) n'est présent, tu as toujours une adresse 127.0.0.1 qui correspond au nom "localhost".

Sur ta seconde machine, le locahost:11.0 correspond à un tunnel fait par ssh entre le display :11 local et le display distant (celui où la commande ssh a été lancée).

xanix, le 25 février, 2010 - 12:51

Merci pour la réponse rapide.
Mais comment je fais pour rediriger mes applications avec le display localhost:11.0

j'ai testé :

DISPLAY=localhost:11.0

DISPLAY=127.0.0.1:11.0

DISPLAY=10.0.0.4:11.0 qui est l'adresse ip de mon client

DISPLAY=:11.0

mais j'ai toujours le même message d'erreur.
can't open display

alors que j'arrive à faire xclock -display :0.0 sur mon client et ça marche.

xanix, le 27 février, 2010 - 17:20

je viens de trouver :

xclock -display 10.0.0.4:7.0

mais pourquoi le display 7 alors que sur ma machine c'est localhost:11.0 ?

Poster un nouveau commentaire

Si vous avez détecté une erreur, coquille ou bêtises du même ordre, merci de plutôt passer par le formulaire de contact
Pour vous abonner au flux des commentaires sur cet article, clickez ici.
Pour répondre à quelqu'un, utilisez plutôt le lien répondre qui se trouve en haut (ou en bas) à gauche de son commentaire.
Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement. Si vous avez un compte gravatar, l'utilisez pour afficher votre avatar.
  • 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.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote> <div> <p> <br>
  • 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.
  • Every instance of custom tags in the input text will be replaced with a specific tool shortcut.

Plus d'informations sur les options de formatage


Commentaires récents
Porte secrète