Ce que vous voyez là-haut dans la belle image (cliquouillez pour l'agrandir), c'est une session graphique assez encombrée sur mon brave Totor (GNU/Linux Mandriva / KDE), et dans la grande fenêtre en bas à droite nous avons une session graphique complète ouverte à distance sur la machine Doudou de mademoiselle Patâpatî (GNU/Linux Edubuntu / Gnome).

Pour bien préciser ce dont il s'agit, ce n'est pas une simple "recopie d'écran / prise de contrôle à distance" façon VNC, mais bel et bien une session graphique à distance complète, c'est-à-dire que cette fenêtre de ma machine se comporte comme un terminal X connecté sur la machine de ma fille.

Autrement dit, pendant que mes gosses jouent au Galaxian sur leur machine, connectés sur un de leurs profils utilisateurs, je peux, moi, me connecter simultanément sur leur machine, obtenir un écran d'ouverture de session (gdm), me connecter sous mon profil et lancer un environnement graphique totalement différent du leur, avec mes propres fenêtres, etc., où je peux exécuter mes propres applications, sans aucun rapport avec ce qu'eux sont en train de faire de leur côté, sur la même machine.

Eh oui, une machine GNU/Linux est multitâche à un point que nombre d'utilisateurs n'imaginent pas : On peut sans problème y connecter de multiples terminaux, textes ou graphiques, virtuels ou physiques, en local ou via le réseau.

Dans le cas présent je peux gérer depuis ma machine (Totor) une session graphique distante sur la machine (Doudou) de ma fille de deux manières différentes :

  • Soit complètement en plein écran, c'est-à-dire que je travaillerai sur la machine distante exactement comme je le ferais sur ma machine locale (en dehors du fait que l'affichage sera plus lent). Je pourrai passer de la session graphique plein écran de ma machine locale à la session graphique plein écran de la machine distante en utilisant les combinaisons de touches [Ctrl]-[Alt]-[F7] et [Ctrl]-[Alt]-[F8] - exactement comme quand on ouvre deux sessions graphiques d'utilisateurs différents sur la même machine.
  • Soit en faisant apparaître la session distante (entière) dans une fenêtre de ma session graphique locale, ce qui se fait en utilisant le "serveur graphique" Xnest (en le lançant avec une commande du genre : Xnest :5 -once -query doudou)

Doudou remote loginPour faire ces belles choses, on utilise :

Sur la machine distante (Doudou) :

Pour pouvoir se logguer sur la machine distante (ici, une Edubuntu), on utilisera le gestionnaire de connexion graphique de l'Ubuntu, à savoir "gdm", et on le configurera simplement de manière à lui permettre d'accepter les connexions distantes utilisant le protocole XDMCP

  • ATTENTION : Si vos machines sont connectées directement à un réseau ouvert (Internet...), il faudra veiller, avec le firewall (iptables), à ce que le port XDMCP (177/udp) soit ouvert uniquement pour l'accès depuis une machine locale, sinon on crée un risque de sécurité...
  • Pour configurer le gdm de Doudou, j'ai mis dans le fichier /etc/gdm/gdm.conf-custom :
[daemon]

# The greeter for xdmcp logins, usually you want a less graphically intensive
# greeter here so it's better to leave this with gdmlogin
RemoteGreeter=/usr/lib/gdm/gdmlogin

[xdmcp]

# Distributions: Ship with this off.  It is never a safe thing to leave out on
# the net.  Setting up /etc/hosts.allow and /etc/hosts.deny to only allow local
# access is another alternative but not the safest.  Firewalling port 177 is
# the safest if you wish to have xdmcp on.  Read the manual for more notes on
# the security of XDMCP.
Enable=true

# Honor indirect queries, we run a chooser for these, and then redirect the
# user to the chosen host.  Otherwise we just log the user in locally.
HonorIndirect=false

# The number of seconds after which a non-responsive session is logged off.
# Better keep this low.
PingIntervalSeconds=15

# How many times can a person log in from a single host.  Usually better to
# keep low to fend off DoS attacks by running many logins from a single host.
# This is now set at 2 since if the server crashes then GDM doesn't know for
# some time and wouldn't allow another session.
DisplaysPerHost=4

...Après quoi, il convient de redémarrer gdm sur Doudou : /etc/init.d/gdm restart

Sur la machine locale (Totor) :

  • Il faut s'assurer que notre serveur X accepte d'être contacté depuis le réseau sur le port 6000/tcp (et ports suivants, si plusieurs sessions graphiques sont lancées, ou ouvrira donc par exemple 6000-6015/tcp dans le firewall, et comme plus haut, uniquement pour les machines de notre LAN, sinon on crée un vieux trou de sécurité)
  • Si on a un fichier /etc/X11/xdm/Xservers, veiller à y enlever l'option "-nolisten tcp", si elle figure sur les lignes servant à lancer le(s) serveur(s) X. C'est à partir de là qu'il faudra s'assurer qu'on a correctement firewallé les choses. On aura alors par exemple quelque chose comme :
:0 local /usr/bin/X -deferglyphs 16
:1 local reserve /usr/bin/X :1 vt8 -deferglyphs 16
:2 local reserve /usr/bin/X :2 vt9 -deferglyphs 16
:3 local reserve /usr/bin/X :3 vt10 -deferglyphs 16
:4 local reserve /usr/bin/X :4 vt11 -deferglyphs 16
:5 local reserve /usr/bin/X :5 vt12 -deferglyphs 16

  • Si on utilise le gestionnaire de connexion kdm (comme sur ma Mandriva), on modifiera son fichier de configuration /etc/kde/kdm/kdmrc de la manière suivante :
  • On pourra (optionnellement) ajouter la nouvelle machine à la liste des "machines distantes disponibles", avec une ligne du genre : ChooserHosts=*,doudou
  • Si on a "-nolisten tcp" sur la ligne "ServerArgsLocal", on veillera à enlever cette option qui empêcherait notre serveur X d'être contacté par le distant.

...Et on redémarrera notre kdm (service kdm restart)[1]

À partir de là :

  • Nous devrions être capables de démarrer facilement une session sur la machine distante, plein écran, depuis notre kdm, en choisissant simplement "Menu / Connexion distante", puis en sélectionnant (ou tapant le nom de) la machine à laquelle on souhaite se connnecter (Doudou). On obtiendra alors son propre gdm, sur lequel on pourra ouvrir la session.

=> Attention, Gnome est buggué ! L'ouverture de session Gnome sur une machine Ubuntu distante foirera (écran vide, puis avec une fenêtre grise elle aussi vide) si on ne décoche pas le "Son ESD" dans les "Préférences du son" (ce qu'on devra donc faire en local avant de tenter de se connecter à Gnome à distance...). On n'a pas ce problème avec KDE ;-)

  • Si nous voulons ouvrir "une session distante dans notre session graphique locale", nous utiliserons le serveur graphique Xnest (il faut donc installer le paquetage corespondant), et nous lancerons Xnest avec une ligne de commande comme :

Xnest :5 -once -query doudou

Et voilou !

=> Xnest a une limite bête et con : On se trouve dans Xnest avec une disposition de clavier américain QWERTY... Et je n'ai pas trouvé le moyen d'y couper (Tout tuyau apprécié !). Personnellement, j'arrive à m'en accomoder, mais ça risque de gêner très fort ceux qui ne connaissent pas par coeur la disposition du clavier QWERTY...

On notera enfin que le mode d'accès "plein écran" (Une session graphique pour la machine locale, une autre pour la machine distante, et la combinaison de touches [Ctrl]-[Alt]-[Fn] pour passer de l'une à l'autre) est considérablement plus performant que le mode faisant appel à Xnest. Par ailleurs, outre le problème de clavier d'Xnest (qui n'existe pas en mode plein écran), Xnest est également assez instable et il arrive fréquemment qu'il se plante (sa fenêtre disparaît) si on passe sur un autre bureau virtuel que celui sur lequel il est affiché. Pour ces raisons, je conseille vivement d'ouvrir une session graphique distante en mode plein écran, et là, on a vraiment l'impression de passer instantanément d'une machine à une autre par [Ctrl]-[Alt]-[Fn].

Notes

[1] Ce qui tuera notre sessions graphique courante, si nous en avons une !)