<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1524"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1524/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1524/atom/feed</id>
  <updated>2008-10-02T17:59:10+02:00</updated>
  <entry>
    <title>Fabriquer un terminal X avec NX/FreeNX</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1524" />
    <id>http://artisan.karma-lab.net/node/1524</id>
    <published>2008-04-09T21:24:48+02:00</published>
    <updated>2008-10-02T17:59:10+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="X11" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
   <a class='external' target='_blank' href='http://freenx.berlios.de/' >FreeNX</a> est la version libre d'un excellent produit <a class='external' target='_blank' href='http://www.nomachine.com/' >NoMachine</a>. 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. 
</p>    ]]></summary>
    <content type="html"><![CDATA[<p>
   <a class='external' target='_blank' href='http://freenx.berlios.de/' >FreeNX</a> est la version libre d'un excellent produit <a class='external' target='_blank' href='http://www.nomachine.com/' >NoMachine</a>. 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. 
</p>
<!—break-->

	<a name='chapter_1'></a>
  <h2>Lancer des applications graphiques à distance</h2>
	
<p>
  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.
</p>
<p>
 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.
</p>
<p>
  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.</p>
<p>
  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 
  <a target='_blank' href='http://fr.wikipedia.org/wiki/bauds'>
  bauds
  </a>. Nous pouvons citer pour mémoire le module <a class='external' target='_blank' href='http://en.wikipedia.org/wiki/Low_Bandwidth_X' >LBX</a>. 
</p>
<p>
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 <a class='external' target='_blank' href='/%20node/82' >SSH</a> et d'optimisation du protocole X : les clients/serveurs NX.
</p>

	<a name='chapter_2'></a>
  <h2>De NoMachine à FreeNX</h2>
	
<p>
   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.
</p>
<p>
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. 
</p>
<p>
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 <a class='external' target='_blank' href='http://www.nomachine.com/download.php' >existe</a> pour Linux, Windows, MacOS et Solaris.
</p>
<p>
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. 
</p>

	<a name='chapter_3'></a>
  <h2>Mise en oeuvre</h2>
	
<p>
L'installation du serveur FreeNX sur la machine distante est très simple, il suffit juste de faire un <kbd>urpmi freenx</kbd>. Ceci fait, il faut indiquer à freenx que l'utilisateur <kbd>gastoon</kbd> est autorisé à s'y connecter :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  nxserver --adduser toto --system<br />
nxserver --passwd toto<br />
<span class="co0"># redonner le mot de passe de toto</span>
  </div>
  
  </div>
</p>
<p>
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 <a class='external' target='_blank' href='http://www.nomachine.com/download-package.php?Prod_Id=59' >partie download du site de NX</a>. Une fois téléchargé, lancez la commande <kbd>urpmi</kbd> en mettant en paramètre le chemin et le nom du fichier téléchargé. 
</p>
<p>
Ne reste alors plus qu'à tester. Lancez la commande <kbd>nxclient</kbd>. Cela devrait faire apparaître une fenêtre de connexion. Saisissez <kbd>toto</kbd> comme login, le mot de passe, donnez le nom qui vous amuse à la session, puis cliquez sur <kbd>configure...</kbd>
</p>
<p>
Dans le cadre <kbd>Server</kbd>, saisissez le nom ou l'IP de la machine distante et cliquez sur <kbd>Key...</kbd>. 
</p>
<p>
NX utilisant le système <a class='external' target='_blank' href='/node/82' >SSH sans mot de passe</a> 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 <kbd>/var/lib/nxserver/nxhome/.ssh/client.id_dsa.key</kbd>. Faites un simple copier/coller dans la boite de dialogue et validez. 
</p>
<p>
Allez maintenant dans l'onglet <kbd>Advanced</kbd> et vérifiez que l'option <kbd>Disable SSL encryption of all traffic</kbd> est bien décoché. Ensuite cliquez sur <kbd>OK</kbd>.
</p>
<div class='inline-box note'>Si comme moi vous utilisez aussi NX en local, cochez cette case pour rendre le protocole plus rapide.</div>
<p>
  Maintenant, il ne reste plus qu'à se connecter en cliquant sur <kbd>login</kbd>. 
</p>

	<a name='chapter_4'></a>
  <h2>Utilisation avancée</h2>
	
<p>
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 <kbd>General</kbd> en sélectionnant votre environnement (Gnome par exemple) dans la section <kbd>desktop</kbd>. Pour lancer l'environnement par défaut, sélectionnez <kbd>Custom</kbd>. Cela lancera ce qui aurait été utilisé par un <kbd>startx</kbd> sur la machine distante.</p>
<p>
Enfin, pour lancer une seule application, sans mettre en branle une session complète, retournez dans le paramétrage de la session. Réglez à <kbd>Custom</kbd>, puis cliquez sur <kbd>Settings...</kbd>. Là, par exemple pour ne lancer que la commande <kbd>xterm</kbd>, sélectionnez <kbd>Run the following command</kbd> et saisissez <kbd>/usr/bin/xterm</kbd>. 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.
</p>


	<a name='chapter_5'></a>
  <h2>En case de problème</h2>
	
<p>Il y a un paquet de choses qui peuvent bloquer la connexion à NX. Voici celles que j'ai pu rencontrer.</p>
<h3>Activation des logs</h3>
<p>
Il y a bien un fichier de logs créé sur le serveur en <kbd>/Var/log/nxserver.log</kbd> mais il n'est pas très bavard par défaut... Pour activer les logs, il faut ouvrir le fichier <kbd>/etc/nxserver/node.conf</kbd> puis décommenter/modifier la ligne <kbd>NX_LOG_LEVEL<.kbd> en changeant le 0 par un 6 ou un 7. Sauver puis redémarrez le serveur par un <kbd>nxserver --restart</kbd>. Les logs devrait d'un coup être beaucoup plus loquaces. 
</p>
<h3>Il y a des sessions suspendues...</h3>
<p>
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 <kbd>nxserver --list</kbd>. Si des sessions apparaissent, lancez un nettoyage par <kbd>nxserver --cleanup</kbd>. Retentez la connexion. 
</p>
<h3>Version du client incompatible</h3>
<p>
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).
</p>
<h3>Mauvaise configuration de sshd</h3>
<p>
Si l'on obtient l'erreur <kbd>Failed publickey for nx from ...</kbd> dans les logs serveurs de ssh, il est possible qu'il vous faille commenter dans le fichier <kbd>/etc/sshd/sshd_config</kbd> une ligne du style <kbd>AuthorizedKeysFile home/lobs/.ssh/authorized_keys2</kbd>. Relancez ensuite le serveur et recommencez la connexion. 
</p>

<h3>Activation du SSH total</h3>
<p>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 <kbd>Avanced</kbd>, <kbd>Enable SSH encryption of all Traffic</kbd>.
<div class='inline-box attention'>
  Dans la version 3.0 de nxclient, l'option s'est inversée, il faut donc vérifier que l'option <kbd>Disable SSL encryption of all traffic</kbd> est <b>décochée</b>
</div>

<h3>Erreur de cookie</h3>
<p>
Si vous obtenez l'erreur 

  <div class='code-block code-block-fragment'>
  <div class='container'>
  Error: Failure negotiating the session in stage '7'.<br />
Error: Wrong version or invalid session authentication cookie.
  </div>
  
  </div>
</p>
<p>
 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 :

  <div class='code-block code-block-fragment'>
  <div class='container'>
  urpmi xinit
  </div>
  
  </div>
</p>

<h3>Erreur d'authentification de l'utilisateur NX</h3>
<p>
 mv authorized_keys2 authorized_keys
</p>

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

  <div class='code-block code-block-fragment'>
  <div class='container'>
  Xft.dpi: 96
  </div>
  
  </div>
</p>
<h3>Si les fontes sont moches ET les icônes aussi</h3>
<p>
  Là vous êtes sûrement sous Gnome. Auquel cas il faut que vous lanciez, dans la session NX, la commande <kbd>/usr/lib/gnome-settings-daemon</kbd> avant de lancer d'autres applications. Tous les thèmes devraient alors être correctement utilisés.
</p>

<h3>Si la connexion cale en disant que le serveur ne peut se connecter au localhost:22</h3>
<p>
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 <kbd>/etc/nxserver/node.conf</kbd>, décommenter la ligne <kbd>#Port 22</kbd> et replacer 22 par le port que votre SSHD écoute. 
</p> 

	<a name='chapter_6'></a>
  <h2>Conclusion</h2>
	
<p>
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 <a class='external' target='_blank' href='/node/1314' >troisième écran</a> utilisé en conjonction avec <a class='external' target='_blank' href='/node/1308' >synergy</a>. 
</p>
    ]]></content>
  </entry>
</feed>
