21 junio 2010

Squeeze Debian GNU/Linux Multiseat

Què és un Sistema Multiseat o Multiestació.

Un sistema Multiseat o multiestació, també anomenat multiterminal, multi-station, multihead, és la configuració especial d'un equip informàtic que permet treballar a múltiples usuaris al mateix temps, cadascun amb el seu propi monitor, teclat, ratolí i, opcionalment, amb la seva pròpia targeta de so.

Preparació del sistema.

L'equip utilitzat per fer aquest exemple ha estat un ordinador AMD Athlon 64 X2 Dual Core Processor 5000+; 2048 MB de memòria RAM; un disc dur de 320 GB; una targeta gràfica integrada Nvidia Geforce 8300 amb tres sortides (VGA/DVI/HDMI); dos monitors, un LG L196WTQ (1440x900) i un Acer P205H (1600x900); dos teclats, un PS/2 i un USB; i dos ratolins USB.
Es parteix de la base que ja es disposa d'un ordinador amb la versió Squeeze de Debian GNU/Linux instal·lada.
Abans de començar, cal configurar la xarxa i crear els usuaris necessaris donat que algunes eines de Gnome no funcionen quan es treballa amb múltiples sessions simultàniament. Després s'ha d'actualitzar el sistema amb:
# aptitude update
# aptitude safe-upgrade

Instal·lació dels driver propietaris d'Nvidia

Per modificar l'arxiu xorg.conf, i tenint en compte que es té una targeta gràfica Nvidia, primer de tot cal instal·lar els drivers propietaris de Nvidia que facilitaran molt la tasca. Començar descarregant els controladors de la pàgina oficial de Nvidia. Una vegada descarregats s'ha de parar el servidor X amb:
# /etc/init.d/gdm stop
També ens hem d'assegurar que tenim instal·lats els paquets necessaris per compilar el driver:
# aptitude install binutils gcc make linux-headers-`uname -r` 
A continuació s'ha d'executar el guió descarregat, que en el moment d'escriure aquest manual és la versió NVIDIA-Linux-x86_64-195.36.31-pkg2.run:
# sh ./NVIDIA-Linux-x86_64-195.36.31-pkg2.run
Una vegada instal·lat el controlador, es pot tornar a reiniciar el servidor X amb:
# /etc/init.d/gdm start
A més a més és molt important realitzar còpies de seguretat dels arxius xorg.conf i gdm.conf abans de començar perquè al llarg del procés de configuració pot ser necessari restablir-los.
# cp /etc/X11/xorg.conf /etc/X11/xorg.conf.original
# cp /etc/gdm/gdm.conf /etc/gdm/gdm.conf.original
Instal·lació de Xephyr
A continuació cal instal·lar xephyr i wmctrl. Aquests paquets no estan inclosos a la instal·lació per defecte, però es poden trobar als repositoris oficials.
# apt-get install xserver-xephyr wmctrl

Configuració del sistema multiestació.


Configuració del fitxer xorg.conf.


Ara es procedeix a configurar l'arxiu xorg.conf mitjançant l'eina NVIDA X Server settings que es troba al menú -> sistema -> preferències. Per fer-ho cal activar tots els monitors en mode TwinView com mostren les imatges següents:


Aprofitem aquest moment per conèixer la resolució de cada monitor, i anotem els resultats en un paper, doncs ho necessitarem més endavant. Aquest és el codi de l'arxiu xorg.conf una vegada aplicats i desats els canvis fets.
# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig: version 1.0 (buildmeister@builder58) Tue Oct 20 21:25:04 PDT 2009
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0" 0 0
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
Option "Xinerama" "0"
EndSection

Section "Files"
EndSection

Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
EndSection

Section "Monitor"
Identifier "Monitor0"
VendorName "ACER"
ModelName "Acer P205H"
HorizSync 31.0 - 83.0
VertRefresh 56.0 - 75.0
Option "DPMS"
EndSection

Section "Monitor"
Identifier "Monitor1"
VendorName "LG Electronics"
ModelName "LG L196WTQ"
HorizSync 30.0 - 83.0
VertRefresh 56.0 - 75.0
EndSection

Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 8300"
EndSection

Section "Device"
Identifier "Device1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce 8300"
BusID "PCI:2:0:0"
Screen 1
EndSection

Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
Option "TwinView" "1"
Option "TwinViewXineramaInfoOrder" "CRT-0"
Option "metamodes" "CRT: nvidia-auto-select +0+0, DFP: nvidia-auto-select +1600+0"
SubSection "Display"
Depth 24
EndSubSection
EndSection

Section "Screen"
Identifier "Screen1"
Device "Device1"
Monitor "Monitor1"
DefaultDepth 24
Option "TwinView" "0"
Option "metamodes" "DFP: nvidia-auto-select +0+0"
SubSection "Display"
Depth 24
EndSubSection
EndSection 

Creació del guió llançador del servidor xephyr: Xephyr-path.sh

A continuació cal crear el guió responsable de carregar les dues sessions del servidor Xephyr:
# gedit /usr/sbin/Xephyr-path.sh
amb el següent contingut:
#!/bin/bash
# 200906 - josean
# http://netpatia.blogspot.com/

trap "" usr1
XEPHYR=/usr/bin/Xephyr
DISPLAY=:0
XAUTHORITY=/var/lib/gdm/:0.Xauth
args=()

while [ ! -z "$1" ]; do
if [[ "$1" == "-kbdpath" ]]; then
shift
if [ ! -z "$1" ]; then
 args=("${args[@]}" "-keybd")
 args=("${args[@]}" "evdev,,device=/dev/input/by-path/$1,xkbrules=xorg,xkbmodel=evdev,xkblayout=es")
fi
elif [[ "$1" == "-mousepath" ]]; then
shift
if [ ! -z "$1" ]; then
 args=("${args[@]}" "-mouse")
 args=("${args[@]}" "evdev,,device=/dev/input/by-path/$1")
fi
else
args=("${args[@]}" "$1")
# echo "+++ args $1 +++" >> /tmp/logXephyr
fi
shift
done

# Next line is just to create a log file with the invocation parameters, for debug purposes
echo $XEPHYR -ac "${args[@]}" >> /tmp/logXephyr
exec $XEPHYR -ac "${args[@]}"
Finalment se li han de donar permisos d'execució al propietari (root):
# chmod 755 /usr/sbin/Xephyr-path.sh

Modificació de l'arxiu gdm.conf.

Per poder modificar l'arxiu gdm.conf, primer s'ha d'obtenir informació relativa als events d'entrada del sistema. Aquesta informació la proporciona les següents ordres:
# ls /dev/input/by-path/ | grep event | grep kbd
pci-0000:00:02.0-usb-0:3:1.0-event-kbd
platform-i8042-serio-0-event-kbd
# ls -la /dev/input/by-path/ | grep event | grep mouse
pci-0000:00:04.0-usb-0:1:1.0-event-mouse
pci-0000:00:04.0-usb-0:3:1.0-event-mouse
La primera ordre mostra els teclats, i la segona els ratolins. Tots els dispositius que comencen per "platform" corresponen als dispositius "PS/2" i els "PCI" són, òbviament, els USB.
A continuació ja es pot editar l'arxiu gdm.conf i afegir la informació necessària sota l'etiqueta [servers]. En l'exemple següent, ombrejat en groc, es mostra la configuració de les dues terminals d'acord als paràmetres de resolució i events d'entrada obtinguts anteriorment.
[servers]
# Also note, that if you redefine a [server-foo] section, then GDM will
# use the definition in this file, not the GDM System Defaults configuration
# file. It is currently not possible to disable a [server-foo] section
# defined in the GDM System Defaults configuration file.
#
# 0=Standard
#
# Means that DISPLAY ":0" will start an X server as defined in the
# [server-Standard] section.
# ****************************************************************************
# Multiseat setup (200906)

0=Xephyr0
1=Xephyr1
2=Xephyr2

[server-Xephyr0]
name=Xephyr0
command=/usr/bin/X -br -dpms -s 0
handled=false
flexible=false

[server-Xephyr1]
name=Xephyr1
command=/usr/sbin/Xephyr-path.sh -br -screen 1440x900 -kbdpath pci-0000:00:02.0-usb-0:3:1.0-event-kbd  -mousepath pci-0000:00:04.0-usb-0:3:1.0-event-mouse
handled=true
flexible=false

[server-Xephyr2]
name=Xephyr2
command=/usr/sbin/Xephyr-path.sh -br -screen 1600x900 -kbdpath platform-i8042-serio-0-event-kbd -mousepath pci-0000:00:04.0-usb-0:1:1.0-event-mouse
handled=true
flexible=false
# ***************************************************************************
El segon canvi que s'ha de fer en el fitxer gdm.conf està relacionat amb la petició d'autenticació. En la secció [daemon], s'ha de canviar la referència al “Greeter” original per una referència a un nou guió que s'encarregarà de col·locar cada finestra de xephyr a la seva posició correcta:
# ****************************************************************************
[daemon]
# The greeter for attached (non-xdmcp) logins. Change gdmlogin to gdmgreeter
# to get the new graphical greeter.
# Greeter=/usr/lib/gdm/gdmgreeter
Greeter=/usr/sbin/Xephyr-login.sh
# ****************************************************************************
Aquest guió serà cridat per l'usuari gdm, de mode que s'ha de crea el guió com a propietat d'aquest usuari, donant únicament permisos d'execució a aquest.
# gedit /usr/sbin/Xephyr-login.sh
# chown gdm:gdm /usr/sbin/Xephyr-login.sh
# chmod 744 /usr/sbin/Xephyr-login.sh
I el contingut del guió serà el següent:
#!/bin/bash
# /usr/sbin/Xephyr-login.sh

XAUTH_BASE=/var/lib/gdm/:0.Xauth
DISPL_BASE=:0

XEP=$(XAUTHORITY=$XAUTH_BASE xwininfo -root -children -display :0 | grep "Xephyr on :1" --max-count=1)
echo ${XEP} >> /tmp/logXephyrLogin

# assign values to positional parameters to obtain the id (first parameter) of the Xephyr window
set ${XEP}
DISPLAY=$DISPL_BASE XAUTHORITY=$XAUTH_BASE wmctrl -i -r $1 -e 0,1600,0,-1,-1
echo $1 >> /tmp/logXephyrLogin_1

/usr/lib/gdm/gdmlogin

En aquest cas s'ha desplaçat una de les sessions 1600 pixels a la dreta, donat que és la resolució de la pantalla de l'esquerra.