Multiterminales usando Xephyr

Ultima actualización: 19 de Diciembre de 2005

Traducción por Jorge Alberto García González, correo en jorge.garcia.gonzalez@gmail.com.
Web http://www.shellinvaders.com.mx o http://kbradero.senshiken.com

Original del C3SL en http://www.c3sl.ufpr.br/multiterminal/howtos/howto-xephyr-en.htm

Sistema Operativo:

Debian Sarge

Instroducción:

Xephyr es un servidor X que corre dentro de otro servidor X. Xephyr es al mismo tiempo un cliente X y un servidor X. Xephyr es un cliente de un servidor X real, pero tambien es un servidor que tiene sus propios clientes. Xephyr es normalmente usado para permitir trabajar en dos o mas escritorios al mismo tiempo , sin embargo, hemos hechos modificaciones en su código para hacer posible que Xephyr implemente un sistema multiterminal.

El sistema trabaja en la siguiente manera. Unicamente un servidor X "real" está corriendo, ,configurado para usar varios screens o pantallas, de las cuales cada una será asociada a una tarjeta de video . Despues del inicio de X, un Xephyr estará corriendo dentro de cada pantalla. Cada usuario usará un Xephyr, en una forma transparente

El Xephyr origina obtiene los eventos de los dispositivos de entrada de su servidor X padre . Sin embargo, para permitir Xephyr sea usada en la multiterminal modificamos su codigo fuente para que leyera directamente desde la interface de eventos del kernel ,saltandoce al servidor X.

La mejor ventaja de esto es la posibilidad de tener miltiterminales con cualquier combinacion de tarjetas de video , siempre y cuando esta sea soportada por el servidor X. . Ademas de esto, Xephyr tiene varias ventajas sobre Xnest: Xephyr tiene soporte, es mas rapido que Xnest, y soporta la implementacion de extensionaes mas facilmente .

Evdev y Udev:

Asegurate de que tu kernel este compilado con la opcion evdev .

Ademas instala udev, el cual provee de un directorio /dev dinamico, actualizado de acuerdo a los dispositivos conectados:

apt-get install udev

Udev requiere un kernel 2.6.12 o mayor.

Dispositivos de entrada

Ahora, necesitas checar si tus dispositivos de entrada (ratones y teclados) han sido correctamente detectados por el kernel. Al hacer esto , analiza el archivo /proc/bus/input/devices, el cual muestra los detalles sobre los dispositivos de entrada detectados por el kernel .

Un ejemplo de este archivo es mostrado abajo. Unicamente dos campos son de nuestro interes: el nombre de cada dispositivo, encontrado en las lineas que inician con “N: Name=”, y el nombre del archivo relacionado con cada dispositivo, encontrado en las lineas que inician con “H: Handlers”.

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
H: Handlers=kbd event0
B: EV=120013
B: KEY=4 2000000 3802078 f840d001 f2ffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7

I: Bus=0011 Vendor=0002 Product=0005 Version=0000
N: Name="ImPS/2 Generic Wheel Mouse"
P: Phys=isa0060/serio1/input0
H: Handlers=mouse0 event1
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103

I: Bus=0003 Vendor=0a81 Product=0101 Version=0110
N: Name="CHESEN USB Keyboard"
P: Phys=usb-0000:00:10.2-1/input0
H: Handlers=kbd event2
B: EV=120003
B: KEY=10000 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: LED=7

I: Bus=0003 Vendor=0a81 Product=0101 Version=0110
N: Name="CHESEN USB Keyboard"
P: Phys=usb-0000:00:10.2-1/input1
H: Handlers=kbd event3
B: EV=3
B: KEY=1f 0 20000 3878 d801d101 1e0000 0 0 0

I: Bus=0003 Vendor=04fc Product=0013 Version=06b0
N: Name="USB OpticalWheel Mouse"
P: Phys=usb-0000:00:10.2-2/input0
H: Handlers=mouse1 event4
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103

La informacion necesaria esta remarcada. Nota que el archivo parece indicar la presencia de 3 teclados, el sistema en cuestion solo tiene dos. Pero esto pasa debido a que muchos teclados USB tienen teclas especiales (para control multimedia o de acceso a internet) los caules son detectados por el kernel como teclados adecionales, siendo aquellos cuya direccion fisica termine con “input1”. Necesitar configurar unicamente los teclados primarios, los cuales son los que terminan en su direccion fisica con “input0”.

El ejemplo dado abajo muestra la presencia de 2 teclados "primarios" , relacionados a los archivos /dev/input/event0 y /dev/input/event2, respectivamente, y 2 ratones, relacionados a los archivos /dev/input/event1 y /dev/input/event4, respectivamente.

Instalacion de XOrg

En este COMO describiremos los pasos necesarios para configurar multiterminales usando XOrg , pero tambien es posible usar XFree86, con pocos cambios. Para instalar XOrg, en un Debian Sarge, has lo siguiente:

  1. Crea un backup y borrar los archivos /etc/init.d/xfree-common.
  2. Agrega los siguientes lineas /etc/apt/sources.list:
    deb http://people.debian.org/~nobse/xorg-x11/ sarge main
    deb-src http://people.debian.org/~nobse/xorg-x11/ sarge main
    
  3. Instala el paquete xserver-xorg :
    apt-get update
    apt-get install xserver-xorg
    apt-get upgrade
    

Download el Xephyr modificado

  1. Download el binario de Xephyr aqui. Descomprimelo dentro del directorio /usr/local. Los parches estan en aqui
  2. Download el wrapper script, necesario para correr Xephyr: Xephyr.sh. El script debe ser copiado a /usr/sbin.

Configuracion de X(XOrg)

xorg.conf

Para configurar una multiterminal con N terminales, edita el archivo /etc/X11/xorg.conf, y has lo siguiente:

  1. Crea un layout con N screens .
    Section "ServerLayout"
    	Identifier	"Layout"
    	Screen		"Default Screen 1"
    	Screen		"Default Screen 2"	Below	"Default Screen 1"
    	Screen		"Default Screen 3"	Below	"Default Screen 2"
    	.
    	.
    	Screen		"Default Screen N"	Below	"Default Screen N-1"
    	InputDevice	"Generic Keyboard 1"
    EndSection
    
  2. Crea una seccion Device para cada tarjeta de video:
    Section "Device"
    	Identifier	"Video Card 1"
    	Driver		"sis"	
    	BusID		"PCI:0:5:0"	
    	Screen		0	
    EndSection	
    	#
    	# Cambia el driver de la tarjeta de video y el  BusID de acuerdo a tu  hardware.
    	#
    	# El BusID identifica tu tarjeta de video. Para obtener el  BusIDs de tu tarjeta de video,
    	#usa el comando "lscpi | grep VGA".
    	# Beware: el comando  lscpi muestra la direccion en    hexadecimal, mientras que  X espera numeros decimales.
    	#El comando  "echo $((0xHEX_NUMBER))" es tu amigo 
    	.
    	.
    	.
    Section "Device"
    	Identifier	"Video Card N"
    	Driver		"sis"
    	BusID		"PCI:0:6:0"
    	Screen		0	
    EndSection
    
  3. Crea la seccion Monitor .
    Section "Monitor"
    	Identifier	"Monitor 1"
    	HorizSync	30-71
    	VertRefresh	50-160
    	Option		"DPMS"
    EndSection			
    	.
    	.
    	.		
    Section "Monitor"
    	Identifier	"Monitor N"
    	HorizSync	30-71
    	VertRefresh	50-160
    	Option		"DPMS"
    EndSection
    
  4. Crea la seccion Screen
    Section "Screen"
    	Identifier	"Screen 1"
    	Device		"Video Card 1"
    	Monitor		"Monitor 1"
    	DefaultDepth	24	
    	SubSection "Display"
    		Depth		24
    		Modes		"1024x768" "800x600" "640x480"
    	EndSubSection
    EndSection
    	.
    	.
    	.
    Section "Screen"
    	Identifier	"Screen N"
    	Device		"Video Card N"
    	Monitor		"Monitor N"
    	DefaultDepth	24	
    	SubSection "Display"
    		Depth		24
    		Modes		"1024x768" "800x600" "640x480"
    	EndSubSection
    EndSection
    
  5. Xorg.conf debe tener unicamente una seccion teclado, como esto:
    Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
    EndSection
    

    La seccion de mouse puede ser eliminada, lo cual es recomendado, pero debes agregar la opcion AllowMouseOpenFail en la seccion ServerFlags, como se muestra abajo , de otra manera el servidor X no iniciara.

  6. Asegurate de tener lo siguiente en la seccion ServerFlags:
    Section "ServerFlags"
           ...
    	# These options keep the X Server from entering in power saving mode:
            Option    "BlankTime"    "0"
            Option    "StandbyTime"  "0"
            Option    "SuspendTime"  "0"
            Option    "OffTime"      "0"
    	
    	# Allow the server to start without mouse
    	Option "AllowMouseOpenFail"  "yes"
    
    	# Disable VT Switching
    	Option    "DontVTSwitch" "yes"
    	
    	# This disallows the use of the Ctrl+Alt+Backspace sequence
    	Option    "DontZap"       "yes"
           ...
    EndSection
    

Configuracion de XKB

Para permitir a Xephyr usar las extensiones de XKB , tu debes descomprimir el archivo xkb-evdev.tar.gz dentro del directorio /etc/X11. Despues de esto, es necesario crear un archivo XKB por cada Xephyr. La configuracion de XKB para el primer Xephyr debe ser puesta como /usr/X11R6/lib/X11/xkb/X1-config.keyboard, para el segundo Xephyr como /usr/X11R6/lib/X11/xkb/X2-config.keyboard, y asi sucesivamente. Puedes ver un ejemplo de un archivo de configuracion XKB abajo.
rules = "evdev"
model = "pc105"
layout = "us"

Configuracion de GDM:

El ultimo paso para configurar el login manager para iniciar el servidor X principal y correr los wrapper scripts que abrirar al Xephyr. Solo explicaremos como hacer esto en GDM, pero para otros managers, como XDM y KDM, pueden ser configurados de formas similar.

gdm.conf

Edita el archivo /etc/X11/gdm.conf en la seccion [servers] , agregando lo siguiente:

	[servers]
	0=Hardware
	# Hardware is the main X server
	
	1=Xephyr1
	2=Xephyr2
	3=Xephyr3
	.
	.
	N=XephyrN

	[server-Hardware]
	name=Hardware
	command=/usr/X11R6/bin/X
	handled=false	
	flexible=false

	[server-Xephyr1]
	name=Xephyr1
	command=/usr/sbin/Xephyr.sh -display :0.0 -xauthority /var/lib/gdm/:0.Xauth -geometry 1024x768+0+0
	-keyboard /dev/input/event0 -mouse /dev/input/event1,5 -use-evdev -dpi 92
	handled=true
	flexible=false
	#
	# The options -keyboard and -mouse identify, respectively, to which keyboard and mouse Xephyr will be associated, 
	#as seen in the file /proc/bus/input/devices. If the mouse option finishes with ",5", as in
	#the example, the mouse wheel will be activated.
	#
	# Xephyr.sh is the wrapper that runs Xephyr server.
	.
	.
	.
	[server-XephyrN]
	name=XephyrN
	command=/usr/sbin/Xephyr -display :0.(N-1) -xauthority /var/lib/gdm/:0.Xauth -geometry 1024x768+0+0
	-keyboard /dev/input/eventXX -mouse /dev/input/eventYY[,5] -use-evdev -dpi 92
	handled=true
	flexible=false