HowTo multiQ multipuesto en la Universidad Nacional del Quilmes

url:http://rblanco.blog.unq.edu.ar/modules/cnews/article.php?storyid=2
url:rblanco@unq.edu.ar

Completo how-to de multiQ (multipuesto en la Universidad Nacional de Quilmes) basado en la distribucion Arch Linux (se puede hacer en otras, recomiendo ésta).

  • Instalar Arch (u otra distro, si insiste. He testeado en Debian y Fedora sin problemas) con el modulo xf86-input-evdev (usar versión <= 1.1.3, las versiones posteriores tienen un bug) Xorg (6.9 en adelante) y drivers de placa de video. Estas últimas son nvidia y ati en el ejemplo mostrado. Vale aclarar que primero debe iniciar la nvidia y luego la ati, de otra manera la ati cuelga al iniciar la nvidia. De hecho no logré al momento usar sólo ati (rage xl, gama baja baja). Las nvidia no presentaron ningún problema (modelo GeForce MX4000), hasta 6 puestos probados.
  • Conectar teclados y mouses con los hubs usb como irán definitivamente y tener en cuenta su ubicación ya que si esta es modificada no funcionará hasta tanto no reflejemos ese cambio en el archivo xorg.conf
  • Buscar los teclados y mouses en /proc/bus/input/devices:
less /proc/bus/input/devices

Esto es lo que nos muestra:

[root@arch /]# less /proc/bus/input/devices

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0 --> esta es la dirección física del dispositivo
S: Sysfs=/class/input/input0
H: Handlers=kbd event0
B: EV=120013
B: KEY=4 2000000 3802078 f840d001 f2ffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7 --> es un teclado



I: Bus=0003 Vendor=09da Product=000a Version=0001
N: Name="A4Tech PS/2+USB Mouse"
P: Phys= usb-0000:00:02.0-2/input0 --> dirección física del mouse
S: Sysfs=/class/input/input1
H: Handlers=mouse0 event1 ts0 --> es un mouse
B: EV=7
B: KEY=ff0000 0 0 0 0 0 0 0 0
B: REL=303


I: Bus=0010 Vendor=001f Product=0001 Version=0100
N: Name="PC Speaker"
P: Phys=isa0061/input0
S: Sysfs=/class/input/input2
H: Handlers=kbd event2
B: EV=40001
B: SND=6



I: Bus=0003 Vendor=04d9 Product=1400 Version=0142
N: Name="HID 04d9:1400"
P: Phys=usb-0000:00:02.0-8/input0 --> esta es la dirección física del dispositivo
S: Sysfs=/class/input/input3
H: Handlers=kbd event3
B: EV=120003
B: KEY=10000 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: LED=7 --> es un teclado



I: Bus=0003 Vendor=04d9 Product=1400 Version=0142
N: Name="HID 04d9:1400"
P: Phys=usb-0000:00:02.0-8/input1  --> dirección física del mouse
S: Sysfs=/class/input/input4
H: Handlers=kbd mouse1 event4 ts1 --> es un mouse
B: EV=7
B: KEY=1f0000 0 0 39fa d801d101 1e0000 0 0 0
B: REL=103

Cada bloque es un dispositivo (el pc speaker esta en gris ya que no nos incumbe) y los teclados cuando tienen teclas especiales las pone en un bloque casi idéntico al de teclado por lo tanto para diferenciar el verdadero teclado de sus teclas especiales debemos prestar atención que al final de las descripciones del dispositivo diga B: LED=7 o algo similar. Este paso consiste solamente en identificar los dispositivos y buscar su dirección "phys" que es la dirección fisica del teclado o mouse, ya sea el nodo usb al que esta conectado o los puertos serie y ps/2. Existe otra manera de hacerlo que anda por ahí, por los "events", pero no es lo mejor ya que en un cambio de mouse o teclado estos events suelen cambiar y mezclarse. El phys es inamovible, uno sabe que si conecta un teclado en esa boca usb va a funcionar, por lo cual uno puede sacar y poner teclados o mouses de un determinado puerto usb y va a funcionar sin tener que reconfigurar las X o reiniciarlas.

  • Identificar el bus pci de las placas de video con lspci :
[root@arch /]# lspci |grep VGA
01:00.0 VGA compatible controller: nVidia Corporation NV18 [GeForce4 MX 440 AGP 8x] (rev a2)
01:09.0 VGA compatible controller: ATI Technologies Inc Rage XL AGP 2X (rev 65)
  • Construir la configuracion de X que esta en /etc/X11/xorg.conf

Ejemplo completo:

[root@arch /]# cat /etc/X11/xorg.conf


Section "Files"
    ModulePath "/usr/lib/xorg/modules"
EndSection

Section "Module"
    Load "dbe"
    Load "extmod"
    Load "fbdevhw"
    Load "record"
    Load "freetype"
    Load "type1"
    Load "glx"  #modulo de aceleración
EndSection

Section "ServerLayout"
    Identifier "puesto1"
    Screen 0 "Screen1" 0 0
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Teclado1" "CoreKeyboard"
EndSection

Section "ServerLayout"
    Identifier "puesto2"
    Screen 0 "Screen2" 0 0
    InputDevice "Teclado2" "CoreKeyboard"
    InputDevice "Mouse2" "CorePointer"
EndSection

Section "InputDevice"
    Identifier "Teclado1"
    Driver "evdev"
    Option "Phys" "isa0060/serio0/input0" #es el ps/2
    Option "XkbRules" "xorg"
    Option "XkbModel" "evdev"
    Option "XkbLayout" "es"
EndSection

Section "InputDevice"
    Identifier "Teclado2"
    Driver "evdev"
    Option "Phys" "usb-0000:00:02.0-2/input0"
    Option "XkbRules" "xorg"
    Option "XkbModel" "evdev"
    Option "XkbLayout" "es"
EndSection

Section "InputDevice"
    Identifier "Mouse1"
    Driver "evdev"
    Option "Phys" "usb-0000:00:02.0-7/input0"
EndSection

Section "InputDevice"
    Identifier "Mouse2"
    Driver "evdev"
    Option "Phys" "usb-0000:00:02.0-2/input1"
EndSection

Section "Monitor"
    Identifier "Monitor1"
    VendorName "MiMono"
    ModelName "ape12"
    #HorizSync 30.0 - 55.0
    #VertRefresh 50.0 - 120.0
    Option "dpms"
EndSection

Section "Monitor"
    Identifier "Monitor2"
    VendorName "Marca"
    ModelName "modelo"
    #HorizSync 30.0 - 110.0
    #VertRefresh 50.0 - 150.0
    Option "DPMS"
EndSection

Section "Device"
    Identifier "Videocard1"
    Driver "nvidia"
    VendorName "Videocard vendor"
    BoardName "nVidia Corporation NV18 [GeForce4 MX 4000 AGP 8x]"
    BusID "PCI:1:0:0"
EndSection

Section "Device"
    Identifier "Videocard2"
    Driver "ati"
    BusID "PCI:1:9:0"
EndSection

Section "Screen"
    Identifier "Screen1"
    Device "Videocard1"
    Monitor "Monitor1"
    DefaultDepth 24
    SubSection "Display"
        Viewport 0 0
        Depth 24
        Modes "1152x864" "1024x768" "800x600"
        EndSubSection
EndSection

Section "Screen"
    Identifier "Screen2"
    Device "Videocard2"
    Monitor "Monitor2"
    DefaultDepth 24
    SubSection "Display"
        Viewport 0 0
        Depth 24
        Modes "1152x864" "1024x768" "800x600"
    EndSubSection
EndSection
  • Probar ambos puestos con las opciones -novtswitch y -sharevts:
[root@arch /]# X -novtswitch -sharevts -layout puestoN :N & xterm -display :N & sleep 10 ; killall X

donde N es el numero de puesto. Durante 10 segundos nos mostrará nuestra un modo grafico con una consola lo que nos alcanzara para probar el mouse y teclado, pasado ese tiempo se cerrará automaticamente. De no ser asi habrá que entrar por ssh a la máquina y matar X (killall X).

  • Ahora crearemos links simbólicos al binario de X, uno para cada puesto para así tener separados los procesos de las X, un proceso por cada puesto. De esta manera -en caso que le sea necesario al administrador- podremos terminar las X discriminando terminales.
[root@arch /]# ln -s $(which Xorg)  /usr/bin/X1
[root@arch /]# ln -s $(which Xorg)  /usr/bin/X2
  • Agregamos los nuevos servidores X a la configuracion del display manager que se encuentra en /opt/gnome/etc/gdm/custom.conf y lo modificamos de tal manera que nos quede algo asi (en el caso de un MultiQ de 3 puestos):

a partir de la versión Duke el custom.conf esta en:

[root@arch /]# cat /etc/gdm/custom.conf

[servers]
0=inactive
1=MultiQ1
2=MultiQ2

[server-MultiQ1]
name=MultiQ Server
command=/usr/bin/X1 -sharevts -novtswitch -layout puesto1
flexible=false

[server-MultiQ2]
name=MultiQ Server
command=/usr/bin/X2 -sharevts -novtswitch -layout puesto2
flexible=false

El servidor 0=inactive es el servidor por defecto que esta definido en el archivo de configuración /usr/share/gdm/defaults.conf. Si no lo inactivamos tendremos problemas con el primer puesto. Hacerlo de esta manera es ademas cómodo: cuando uno no quiere usar todos los puestos no tiene mas que comentar el puesto que no va a utilizar, sin importar lo que este en el archivo xorg.conf. Asi podemos, por ejemplo, comentar todos los servers y dejar solo 1 y trabajar solo con ese puesto. Esto es útil en el caso que en algún momento queramos trabajar sobre la máquina y no tengamos todos los dispositivos conectados.

Proximamente agregaré también la configuración de reglas udev para que cada usuario posea un puerto usb exclusivo para su puesto, donde el dispositivo que se conecte solo se montará con permisos para él (detecta automaticamente que es un pendrive o una unidad extraible y lo monta con determinados permisos).

También estoy preparando dos howtos mas: el primero de ltsp 5.0 en arch y luego terminal server con multipuesto, para usar una máquina vieja con varios puestos que se conecten a otra más potente y usen los recursos de ésta.

Cualquier comentario, corrección, sugerencia o lo que sea, hacerlo enviando un correo a: rblanco /at/ unq.edu.ar