code. grind. sleep.

vendredi 21 octobre 2011

X11 forwarding request failed on channel 0

Quand j'essaye de me logguer sur ma box NetBSD fraichement passé en X.org modular, j'ai ça :

orgrim@serfouette ~ $ ssh rateau 
X11 forwarding request failed on channel 0
Last login: Fri Oct 21 12:20:24 2011 from serfouette.home.orgrim.net

WTF? ça tombe en marche SSH normalement.

Et bien le souci vient de l'échange des magic cookies pour l'authentification entre serveurs X à travers SSH, c'est utilisé par le X11 forwarding et on a besoin de plusieurs choses pour ça :

  • le chemin complet vers xauth sur le client
  • le chemin complet vers xauth sur le serveur
  • Avoir X11Forward yes sur le serveur quand on le demande sur le client (il vaut yes dans le /etc/ssh/ssh_config du client par flemme de taper -X sur la ligne de commande)

Le client est sous Linux, donc pas de soucis le chemin en dur /usr/bin/xauth dans le binaire sshd marche. Par contre pour NetBSD avec du X.org modular, il faut décommenter l'option XAuthLocation dans /etc/ssh/sshd_config et /etc/ssh/ssh_config pour donner le bon chemin vers xauth, comme indiqué en commentaire dans ces deux fichiers :

# If you use xorg from pkgsrc then uncomment the following line.
#  XAuthLocation /usr/pkg/bin/xauth

Enfin, comme le X11Forward est à no par défaut sur NetBSD, je l'ai activé. La vrai solution est de faire ça côté client en utilisant explicitement l'option -X quand on veut ouvrir des fenêtres sur le serveur.

Le pire c'est que Google ne sort rien sur le message "X11 forwarding request failed on channel 0", à part une question sans réponse sur un stackoverflow-like en Russe !

mardi 4 octobre 2011

Passer de X.org natif à modular

X.org est fourni dans le basesys et dans pkgsrc, on appelle le premier « native » et le second « modular » selon la valeur de la variable X11_TYPE que l'on positionne dans son /etc/mk.conf pour signifier à pkgsrc sur lequel linker.

Il s'agit des mêmes versions à peu de choses prêt, et X.org native n'est pas vieux ou non maintenu comme la rumeur voudrait le faire croire. Il est juste en retard parce qu'il suit le cycle de release du basesys alors que modular suit celui de pkgsrc et est tiré vers l'avant par les packages qui en dépendent. Cela peut poser problème lorsqu'on suit la cible mouvante qu'est pkgsrc-current.

La première chose à faire pour passer de native à modular est d'éditer /etc/mk.conf pour changer X11_TYPE, on en profite pour ne plus compiler le native :

MKX11=no 
X11_TYPE=modular

Ensuite, il faut modifier la liste de packages à compiler pour y ajouter soit tout modular en installant meta-pkgs/modular-xorg, soit en n'installant que le nécessaire, ça fait plus cool, dans /usr/pkgsrc/pkgchk.conf (si vous avez suivi les docs ici ou dans le wiki) :

meta-pkgs/modular-xorg-apps
meta-pkgs/modular-xorg-libs
meta-pkgs/modular-xorg-fonts
x11/xf86-input-keyboard
x11/xf86-input-mouse
x11/xf86-input-void
x11/xf86-video-nv
x11/xf86-video-vesa
x11/xf86-video-vga
x11/xf86-video-wsfb
x11/modular-xorg-server

Ensuite on donne ça à manger à pkg_comp ou à son bulk. L'important ici est de tout recompiler pour bien transférer les dépendances de native vers modular : en gros on pète la sandbox, que ça soit de mk/bulk ou pkg_comp et on recommence. Etant passé en mode bulk partiel comme indiqué dans un précédent post, voici comment faire :

1. On vérifie avec mount que la standbox n'est pas montée ni qu'un build tourne (dans ce cas faut le killer), sinon :

# /usr/sandbox/sandbox umount

2. On vérifie que le contenu des mk.conf du système et de la sandbox sont en phase, c'est le seul fichier de la sandbox à sauver

3. On recrée la sandbox :

# rm -rf /usr/sandbox
# cd /usr/pkgsrc/mk/bulk
# sh mksandbox --without-x /usr/sandbox

4. On nettoie les packages déjà compilés, pour forcer leur recompilation, et les fichiers cachés du bulk build :

# cd /usr/pkgsrc/packages/
# mv CVS .CVS
# rm -rf *
# mv .CVS CVS
# cd /usr/pkgsrc
# rm .broken.html .bulk_build_id .bulk_db .bulklock .depends .dependstree .index  .order .start .supports
# pkgclean

5. On lance le bulk build et on attend, il faut prévoir entre 150 et 200 packages supplémentaires à compiler.

Les étapes suivantes sont simples, on sauvegarde tout ce qu'il faut dans /usr/pkg, puis on supprime tous les packages installés :

# cd /usr
# mv pkg pkg.old
# cd /var/db
# mkdir old_pkgdb
# mv pkg pkg.refcount old_pkgdb
# rm -rf pkgin

A partir d'ici, on n'a plus de programmes issus de pkgsrc, en gros par de sudo, vim et autres...

Puis, il faut supprimer les fichiers des sets de X.org, on se base pour cela sur le contenu de /etc/mtree/set.x*. On en arrive donc à un stade où on est dans la même situation qu'après une installation du système sans les sets de X.org natif.

Enfin, on réinstalle tout les packages avec pkgin, qui dans sa version 0.5.0 (du CVS) peut importer une liste de packages au format de pkg_chk, qui se trouve être le même utilisé par le bulk-build, comme de par hasard :

# pkg_add http://pkgsrc.orgrim.net/NetBSD/5.1/amd64/All/pkg_install-20110805.tgz
# mkdir -p /usr/pkg/etc
# cp -r /usr/pkg.old/etc/pkgin /usr/pkg/etc
# ./pkgin up
# ./pkgin im pkgchk.conf

Note : si le pkg_add de pkg_install ne passe pas, essayer avec -f.

et hop, reste plus qu'à reconfigurer les chemins dans /etc/X11/xorg.conf et c'est bon.