Construire un bureau multi-X11 unifié
18 février, 2009 - 12:53 | Ulhume | X11 Tutoriel

La problématique est simple : soit deux machines, par exemple un portable et une machine de bureau, le tout sous GNU/Linux/X11, comment faire de sorte à ce que les deux machines forment un seul et même bureau ?

Précisions

Dans cette histoire, le but n'est pas uniquement de placer le bureau de la seconde machine dans le prolongement (au sens clavier/souris du terme) de la première, synergy fait cela déjà très bien tout seul. Il s'agit en fait de pousser la logique un cran plus loin en étendant l'affichage de la machine de bureau sur l'écran du portable. En d'autres termes, avoir une application qui tourne "physiquement" sur la machine de bureau tout en s'affichant sur l'écran du portable. Les avantages étant que le seul CPU plus musclé de la machine de bureau est sollicité et que ce sont les données et paramétrages de la machine de bureau qui sont utilisées.

Les applications de cette approche sont nombreuses, on peut ainsi déplacer sur cet écran supplémentaire des applications importante mais qui prennent de la place (mail, chat, etc). On peut aussi lancer un VmWare pour placer selon ses besoins une machine Windows ou MacOS afin de tester un développement. La seule contrainte étant qu'il serait impossible de déplacer une fenêtre d'une machine à l'autre.

Pour faire cela nous n'avons besoin que de deux choses. Tout d'abord l'indispensable synergy, et tout simplement SSH. Etant entendu que les deux machines communique par un réseau local.

Paramétrage de de Synergy

Je pars ici du principe que cette machine est déjà équipée de X et d'un environnement tel Gnome ou KDE. La première chose qu'il fait faire c'est de paramétrer synergy pour asservir le ou les serveurs X esclaves. Pour cela j'utilise le tutorial sur synergy pour rédiger un /etc/synergy.conf de sorte à placer les deux écrans côte à côte.

Pour que le serveur synergy soit correctement lancé en même temps que notre session graphique, nous allons créer un petit script qui va s'exécuter au moment du lancement de la session X. Ce genre de script se trouve dans le dossier /etc/X11/xinit.d. Le numéro par lequel il commence indique l'ordre de chargement. Le notre s'apellera 35multiX11. 35 pour le placer après le chargement de D-BUS (30) que nous allons voir juste après.

#! /bin/sh

synergys
/etc/X11/xinit.d/35multiX11

Ensuite, il faut rendre le fichier exécutable (chmod +x ...) et ainsi, dés que votre session de X11 se lance, le serveur synergy est mis en route.

Sur le portable, la seule chose à faire est de lancer le client synergy en même temps que la session, cela se fait très simplement en modifiant (ou créant) le ficher ~/.xinitrc et en ajoutant :

# On tue un éventuel reste
pkill synergyc

# Lancement du client synergy
synergyc machine_maitre
~/.xinitrc

Paramétrer l'ouverture de liens

Lorsque vous vous connectez sur chaque machine, vous pouvez normalement vous balader avec votre souris de l'une à l'autre. Pour lancer une application sur l'écran du portable, il nous faut maintenant ouvrir une session ssh de celui-ci vers la machine de bureau. Après, dans cette console, exécutez par exemple liferea qui devrait s'afficher sur le portable mais utiliser les réglages de la machine de bureau, logique.

Maintenant, lorsque l'on clique sur un lien dans liferea, cela ne s'ouvre pas sur le firefox de l'autre machine... En effet, FireFox utilise l'identificateur de l'écran (variable DISPLAY) pour savoir où ajouter son onglet. Or cette variable dans une session SSH n'est évidement pas le :0.0 dans lequel FireFox tourne, mais plutôt un localhost:11.0 lié au tunnel créé par SSH.

La "Solution" est donc de se dire que FireFox est toujours sur mon écran de droite : DISPLAY=:0. Il suffit de faire un petit script qui va exporter la valeur de DISPLAY avant d'appeler FireFox

#! /bin/sh

export DISPLAY=:0
/usr/bin/firefox $1

Pour que Gnome utilise ce script, il ne reste plus qu'à lancer Préférences/applications préférées pour remplacer l'appel d'origine à FireFox par celui à notre script.

Et pour que KDE soit au courant, il faut lancer kcontrol/Composants KDE/Sélecteur de Resources pour remplacer l'appel d'origine à FireFox par celui à notre script.

Voilà, c'est "presque" fini ;-) Presque j’ai dit… En effet il se peut que cela continue de coincer pour des raisons de sécurité. Il faut dans ce cas autoriser l'interaction entre les deux serveurs de manière explicite. C'est le rôle de la commande xhost. Nous allons donc, une fois de plus, ajouter une ligne, avant exec gnome-session, à notre ~/.gnomerc de sorte a donner cette autorisation sur le DISPLAY=:0 :

xhost +

Et comme il va falloir aussi autoriser les connections au display ouvert de l'autre côté par SSH, nous rajoutons dans ~/.bashrc :

if [ ! -z $DISPLAY ] ; then
 xhost + > /dev/null
fi

Ceci ouvre les droits pour TOUS les hosts et TOUS les utilisateurs. Je vous conseille de faire un man xhost pour limiter l'accès à votre utilisateur et/ou votre host. Je ne le fais pas ici, c'est déjà bien assez compliqué ;-)

Faire causer FireFox avec l'aggregateur de nouvelles

Lors de la première version de ce tutoriel, il fallait toute une magouille avec DBUS pour arriver à pouvoir interagir dans l'autre sens, à savoir ajouter un flux à Liferea à partir de FireFox. J'ai laissé la dite magouille en fin de billet pour mémoire mais aujourd'hui il semble que cela fonctionne très bien sans cela. Du coup ce qui suit est la procédure générale permettant d'ajouter de firefox un flux à liferea, avec ou sans portable.

Liferea est fournit avec un petit script, /usr/bin/liferea-add-feed qui fait normalement le boulot. Pour l'ajouter à firefox, là aussi, la procédure c'est diablement simplifiée. Il suffit maintenant d'aller dans les préférences, onglet Applications, aller à Flux WEB et sélectionner Autres... puis le fameux script. Ceci fait, ça marche tout seul.

Lancer X sur le portable à partir de la machine de bureau

Il n'est pas nécessaire, surtout si c'est un petit portable, de lancer toute l'artillerie Gnome. Vous pouvez très bien ne lancer que le serveur X11 avec dans ~/.xinitrc le strict minimum comme un openbox, fbpanel, etc.

Dans cette option, on aime bien l'idée de lancer ce serveur à la main à partir de la machine de bureau. Le seul "hic" c'est qu'un utilisateur ne peut "officiellement" pas lancer un serveur X, je donne ici le résultat pour que Google le mange :

gaston$ssh machine_esclave "startx" &
xauth: creating new authority file /home/yoran/.serverauth.9780
 
Authentication failed - cannot start X server.
Perhaps you do not have console ownership?

L'astuce cette fois est d'autoriser une telle chose en modifiant, sur la machine esclave le fichier /etc/pam.d/xserver comme suite :

#%PAM-1.0
auth sufficient pam_rootok.so
auth required pam_console.so
#auth required pam_permit.so
account required pam_permit.so

Maintenant vous pouvez lancer, via ssh, votre serveur X à distance et le nouvel écran devrait prendre vie et vous devez pouvoir y aller avec votre souris.

Gestion de DBUS

Cette partie est obsolète, je la laisse juste pour mémoire. A l'évidence les nouvelles version de DBUS n'ont pas besoin de cela pour retrouver leurs petits à travers une session SSH.

L'autre aspect à prendre en compte sur la machine "maître" est le partage de la session de DBUS. Rapidement, DBUS est un bus logiciel qui permet, comme DCOP mais de manière standard, aux applications de causer entre elles. Il existe dans les distributions modernes deux instances de DBUS, celle utilisée par le système, et celle locale à la session utilisateur. C'est cette dernière que nous devons chercher à partager.

La session utilisateur de DBUS est crée par le gestionnaire de session de l'environnement graphique, ici gnome-session. Cette session est lancée par dbus-launch qui export la variable DBUS_SESSION_BUS_ADDRESS. C'est cette variable qui permet aux applications de savoir quelle session utiliser pour causer entre elles.

Le « problème » lorsque nous nous connectons via SSH, cette fameuse variable n'existe pas et du coup les applications lancées dans le SSH ne peuvent communiquer avec celles lancées dans la session gnome qui elles, ont cette variable.

Pour régler ce problème, nous allons commencer par ajouter à notre précédent fichier /etc/X11/xinit.d/35multiX11 la ligne suivante :

echo DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS > ~/.ssh/environment

L'astuce ici est donc de renseigner au lancement de la session, ce fichier ~/.ssh/environment qui est utilisé par ssh pour nourrir l'environement d'une nouvelle session. Mais pour que cela fonctionne, il faut modifier le fichier /etc/ssh/sshd_config pour ajouter la permission PermitUserEnvironment yes et redémarrer le serveur ssh.

Du coup, toute session SSH ouverte sur la machine maître aura sa bonne variable DBUS et les applications pourront communiquer d'où qu'elles soient lancées.

Conclusion

Ok, c'est un peu de la bidouille mais avouez que c’est fascinant ce que X11 et un peu d’huile de ou de permettent de faire ! Je ne voudrais pas jouer les trolls provoquant mais je vois mal ce genre de montage fonctionner avec Windows (sans Cygwin ;-).

Commentaires

malic, le 31 janvier, 2008 - 10:18

C'est une excellente idée mais j'imagine qu'il est impossible de glisser une fenetre des 2 premiers écrans vers le 3ème et inversement?

Dab, le 24 janvier, 2008 - 23:37

Héhé en effet je suis l'un des intéressés ;)
Marrant ce truc, et qui de plus couplé avec un vnc complète bien la panoplie.
hmmmm ... ça va finir dans Zaurusfr, qu'en pense tu ?

Ulhume, le 31 janvier, 2008 - 12:14

Non effectivement ce n'est pas possible.. pour l'instant :-)

En fait dans le projet GPE il y a un outil qui s'appelle Teleport qui fait exactement ce travail, à savoir re-rooter une fenêtre d'un serveur sur un autre. Je n'ai pas trouvé de paquet pour la driva mais il semble qu'il y en ait sous debian/ubuntu.

Sinon il est possible d'utiliser le proxy de serveur XMove qui fait aussi ce travail là, je n'ai pas encore testé.

Maintenant, c'est pour cela que je ne colle que kmail, akregator et kopete sur cet écran, à savoir des choses que je ne suis jamais amené à bouger. Le seul problème était donc l'ouverture des URL.

Ulhume, le 25 janvier, 2008 - 00:13

Je pense que ça le ferait bien :) En plus c'est ultra-fluide et permet de modifier la distrib bcp plus rapidement qu'avec vnc ou le sytus. En plus le copier/coller du PC vers le zaurus et vice-versa, un bonheur :)

Ulhume, le 25 janvier, 2008 - 10:12

Un peu oui :) J'avoue que ma méthode (suppression du module) est quelque peu.. sauvage :)

Janusz, le 25 janvier, 2008 - 10:53

Très bon outils en effet. Même le presse papier (copier/coller) entre machines de système différents fonctionne.

Attention tout de même à ne pas prendre l'habitude de taper ses mots de passe par Synergy ; les informations circulent en claire sur le réseau. Un tunnel ssh peut corriger ce problème (voir dans la doc du site de Synergy).

Ulhume, le 25 janvier, 2008 - 11:36

@janusz bonne remarque pour la sécurité mais c'est tout de même limité en terme de risque par le besoin d'avoir un écran physique, la machine est donc généralement dans nos pieds ;-)

Pour le copier coller je l'avais marqué il me semble, je vais mettre cela plus en relief car c'est vraiment un des éléments qui rend la solution ultra-naturelle. Manquerait plus que le drag-n-drop :)

Dab, le 26 juin, 2008 - 11:27

Et hop un p'tit lien intéressant que je viens de voir passer sur Planete Libre : http://0pointer.de/blog/projects/mango-lassi.html ( http://www.atlas95.com/blog/2008/06/25/en-vrac-pulseaudio-51-pulseaudio-... )

Armetiz, le 18 novembre, 2008 - 22:18

Coucou,
J'utilise synergy depuis une bonne année maintenant, et c'est du pure bonheur ! Surtout avec un pc portable, quand on arrive à la maison, meme pas besoin de station d'accueil à je ne sais pas combien d'euros pour avoir une souris supplémentaire, il suffit de brancher la prise réseau pour partager clavier/souris avec le fixe.

Par contre, je ne suis pas sur de comprendre l'intérêt de la déportation du X via SSH.
Tu dispose d'un serveur suffisamment puissant pour héberger plusieurs sessions graphiques, mais après ? Je n'arrive pas à saisir le croisement que tu fais.
Je me suis arrêté à synergy : partage de clavier/souris entre Mac OS/X - Linux - Windows... Et au fait que l'on pouvait démarrer une session graphique via le réseau. Mais le mix que tu fais avec les deux ?

Voilà, j'espère que c'est un peu moins obscure maintenant. Et la raison qui m'a fait mettre tout cela en tuto c'est que je commence à avoir des gens qui passe chez moi en me disant "euh, comment je fais la même chose" (coucou Ludo ;-). Donc ce "besoin" ne doit pas être si unique :)

Ulhume, le 26 juin, 2008 - 13:17

Ca avait l’air sympa ce Mango-Lassi, mais… marche pas bien chez moi… Peut-être la faute au double twinview (ma machine A et ma machine B ont chacune 2 écrans en nvidia/twin) ?

- Sur la machine A (celle qui a clavier-souris), j’ai les préférences et je peux connecter la machine B mais la souris ne sort pas de l’écran de A pour aller sur B.

- Et sur la machine B, qui n’a ni clavier ni souris, il me claque une erreur lorsque je cherche à afficher les préférences :
(mango-lassi:6699): Gtk-CRITICAL **: gtk_window_present_with_time: assertion `GTK_IS_WINDOW (window)’ failed

Donc pas grand succès… Pourtant tout le monde se voit, les messages de connection s’affichent des deux côtés, c’est juste la souris qui ne semble pas désirer se balader…

Et pourtant, le plus étrange est que si je débranche la souris de A pour la brancher sur B, j’ai une souris qui apparaît sur A… Et qui ne va jamais sur B :-)))) Là, là… ça devient assez surréaliste :-)

Alors soit j’ai loupé une énorme marche, soit il va falloir laisser le produit un peu maturer :-)

Synergy, lui, je l’utilise depuis des mois (depuis cet article en fait) et il marche très bien. La seule différence est qu’il n’utilise pas Avahi ce qui n’est pas d’un grand intérêt à mon sens pour des machines qui sont côte à côte par la force des choses. L’autre petite différence sont les messages à l’écran pour dire qui est connecté sur quoi, mais là aussi, le but est que ce soit connecté tout court, a la limite les messages me font prendre conscience que ce sont deux bécanes différentes alors qu’avec synergy je finis même par oublier ce “détail” tant je passe naturellement de l’une aux autres.

Enfin bon, on va voir comment ça va évoluer mais à première vue, synergy a encore une bonne longueur d’avance et je ne suis pas bien sur de comprendre l’intérêt d’un 3ième produit qui fait la même chose.

Ulhume, le 18 novembre, 2008 - 23:20

@Armetiz

L'intérêt de lancer les applications via SSH est que
1/ La machine n'a pas besoin d'être puissante.
2/ Je n'ai pas besoin d'y installer les applications que je veux utiliser sur "son" écran.
3/ Je n'ai pas besoin de paramétrer une application sur le netbook pour l'utiliser alors qu'elle l'est déjà sur mon PC principale.

Je peux par exemple ouvrir eclipse sur l'écran central, travailler, le fermer et le réouvrir sur l'écran de gauche pour avoir le code sous les yeux en écran histoire d'écrir un mail compliqué, en ayant fait la même chose dans l'autre sens avec evolution.

En fait pour mieux comprendre le concept, il faudrait imaginer un synergy qui me permette de transférer une fenêtre d'un écran à l'autre. Pour l'instant je ne peux pas, donc j'utilise la ligne de commande et SSH. J'ai dans l'idée un petit soft qui me permettrait de faire cela en re-rootant une fenêtre de manière plus ergonomique sur un autre serveur X. Cette application existe sous GPE (Gnome pour les PDA) mais demande à être portée sur Gnome tout court.

Tout cela tient donc au fait que j'ai pris l'habitude de travailler intensivement avec trois écrans. Synergy n'est donc pas là pour commander mon netbook, je n'utilise en réalité les applications du netbook que lorsque je suis en déplacement, mais pour étendre mon bureau principal et SSH me permet juste d'y relocaliser des applications.

Dab, le 26 juin, 2008 - 17:50

Je dois te dire que je n'ai même pas testé (zaurus au repos en ce moment), mais j'aimais bien l'idée d'un transfert de la souris ET du son avec pulseaudio.
Sinon c'est vrai que si son seul apport est l'affichage de popup je vais freiner des 4 fers.
Un surcouche à synergy le fait aussi semble-t-il : http://code.google.com/p/gnome-synergy/source/checkout

SckyzO, le 18 février, 2009 - 15:40

Salut Artisan Numérique, juste pour te demande de changer un truc sur ton article, tu as une balise italique mal fermée, et elle modifie totalement le planet libre en mettant tous les articles qui suivent en italique.
(dans le chapitre AUTOMATISATION)

Merci,

SckyzO

Ulhume, le 18 février, 2009 - 16:34

Désolé, c'est réglé :)

SckyzO, le 18 février, 2009 - 16:40

Merci beaucoup :)

Raf, le 2 mai, 2010 - 20:34

Super tuto !

Petite question à tout hasard, c'est normal qu'après avoir crypté la connexion sur le port 24800 j'arrive à utiliser avec "synergyc localhost" sur le port crypté , ok, mais étrangement j'arrive également encore à me connecter comme ceci : "synergyc 192.168.1.xxx"...

Je m'attendais après être passé en ssh à ce que l'ancienne accès en clair ne soit plus valable... peut être me trompe-je ??

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.
  • 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

Êtes-vous humain ?
Cette question est là pour déterminer si vous êtes humain ou pas...