Recientemente he adquirido un switch KVM en eBay (acepto insultos). Estos aparatitos, a grandes rasgos, permiten que dos o más PCs compartan un solo monitor, teclado y ratón.
Lo primero que advierten en su publicidad es que son 100% compatibles con Linux, algo por otro lado comprensible puesto que son dispositivos de concepto y funcionamiento muy básicos (si dejamos aparte las "hotkeys" de las que disponen algunos modelos). Pero, a la hora de la verdad, hay algunos "peros".
Uno de los problemas más frecuentes llega a la hora de establecer las resoluciones de pantalla que el monitor admite. Tras la "última gran reforma" de Xorg.conf, el servidor las toma directamente de la información I2C/DDC que el propio monitor suministra, habiendo tomado el archivo /etc/X11/xorg.conf un papel secundario en este asunto.
Pero, desgraciadamente, algunos switches KVM impiden que el monitor y la tarjeta gráfica se comuniquen como es debido. Cuando están por medio, el driver de la tarjeta no puede leer los valores EDID del monitor y, ante la duda, prefiere no arriesgarse a "quemarlo" y toma los valores que todo aparato admite por viejuno que sea: normalmente, unos preciosos (para gente con problemas de vista) 640x480/800x600 de resolución y unos no menos espléndidos (para provocar problemas de vista en la gente) 60 hertzios de refresco vertical. Y ya no hay forma de cambiarlos, por mucho que reiniciemos las X, generemos nuevos xorg.conf con X -configure o maldigamos al dios que nos hizo plantearnos dejar Windows :P
Bien, no queda más remedio que proporcionar esa información nosotros mismos, lo que implica editar el xorg.conf a mano. Como en los viejos tiempos.
Lo primero que deberíamos hacer es conectar el monitor directamente a la tarjeta gráfica, sin switch de por medio (si lo hemos tirado por la ventana, es hora de bajar e intentar recuperarlo: aún hay esperanza). Arrancamos el sistema, incluido el entorno gráfico, y nos hacemos una copia del archivo /var/log/Xorg.0.log (el cero puede variar, si tenemos más tarjetas), colocándola en un lugar a mano. No es estrictamente necesario, pero nos puede ahorrar algún reinicio si algo no sale bien.
Lo que vamos a hacer ahora es encontrar en ese "log" los valores EDID que el monitor ha comunicado a la gráfica, en un arranque "normal". Para ello, buscaremos un patrón asociado a los monitores: el hertzio.
$ grep -i hz Xorg.0.log | headLo "empipo" al comando head porque la información que nos interesa suele estar al principio: el sincronismo horizontal y el refresco vertical mínimos y máximos soportados por nuestro monitor. Es una línea como ésta:
(II) NV(0): Ranges: V min: 50 V max: 160 Hz, H min: 30 H max: 71 kHz, PixClock max 110 MHzApuntamos esta información en algún sitio, bien usando el socorrido portapapeles, bien a lápiz/papel, pluma/papiro, cincel/piedra o bien incluso usando nuestra memoria, para los más dotados. En el ejemplo, el sincronismo horizontal es 30-71 y el refresco vertical es 50-160 (no es necesario especificar las unidades, ya que el servidor gráfico toma las correctas por defecto).
A continuación, buscamos las resoluciones de pantalla que queremos usar. Supongamos que son dos: 1024x768 y 1280x800.
$ grep 1024 Xorg.0.log | grep -i modeline
$ grep 1280 Xorg.0.log | grep -i modelineComo se puede ver, nos interesa la información referente a las "modelines", que luego tendremos que incluir a mano en el xorg.conf. Una línea de este listado tiene este estilo:
(II) NV(0): Modeline "1024x768"x84.9 94.50 1024 1096 1200 1376 768 771 775 809 -hsync +vsync (68.7 kHz)
(II) NV(0): Modeline "1280x1024"x59.9 109.00 1280 1368 1496 1712 1024 1027 1034 1063 -hsync +vsync (63.7 kHz)Normalmente, aparecen unas cuantas líneas por cada resolución. ¿Cuál escoger? Inmediatamente tras las comillas, figura el refresco vertical (en los ejemplos, 84.9 y 59.9, lo que en la práctica es 85 y 60). Lo lógico es que, de todas las modelines, elijamos la que mayor refresco proporcione (en monitores CRT) o la que se ajuste al valor recomendado por el fabricante (en monitores LCD-TFT).
Así pues, acabamos teniendo apuntadas una línea "ranges" y otras tantas "modelines" como resoluciones queramos tener disponibles. Ya podemos cerrar el archivo Xorg.0.log.
Ahora, como root (o con sudo), abriremos el archivo /etc/X11/xorg.conf y buscaremos la sección "monitor" (vuestros nombres variarán respecto a este ejemplo):
Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor Vendor"
ModelName "Monitor Model"
EndSectionIntroducimos "dentro" de ella la información que tenemos apuntada, de la siguiente forma:
Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor Vendor"
ModelName "Monitor Model"
HorizSync 30-71
VertRefresh 50-160
ModeLine "1024x768" 94.50 1024 1096 1200 1376 768 771 775 809
ModeLine "1280x1024" 109.00 1280 1368 1496 1712 1024 1027 1034 1063
EndSection- En HorizSync, tecleamos los dos valores apuntados, separados por un guión.
- En VertRefresh, lo mismo.
- Por último, las Modelines las copiamos tal cual, pero eliminando el refresco vertical, el -hsync y todo lo que venga después. Es decir, sólo tenemos que escribir la resolución en pixels (entre comillas), la velocidad del reloj (un valor que suele tener dos decimales) y ocho cifras enteras, separadas por espacios.
Acabada la sección del monitor, bajamos a la de "screen":
Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
SubSection "Display"
Viewport 0 0
Depth 1
EndSubSection
SubSection "Display"
Viewport 0 0
Depth 4
EndSubSection
SubSection "Display"
Viewport 0 0
Depth 8
EndSubSection
SubSection "Display"
Viewport 0 0
Depth 15
EndSubSection
SubSection "Display"
Viewport 0 0
Depth 16
EndSubSection
EndSection
Vemos que hay seis diferentes subsecciones, cada una con una "depth" diferente (la paleta de colores). Hoy en día no hay muchas razones para usar otra que no sea la de 24 bits (salvo juegos antiguos), así que nos limitamos a introducir lo siguiente sólo en ella:
SubSection "Display"
Viewport 0 0
Depth 24
Modes "1280x800" "1024x768"
EndSubSectionEs decir, una línea "Modes" seguida de la resolución o resoluciones, entrecomilladas, que vamos a emplear. Efectivamente, una por cada "modeline".
Guardamos los cambios del xorg.conf y reiniciamos las X con nuestro método favorito (recomendado CTRL+ALT+retroceso, que desahoga mucho). Después de comprobar que todo está bien, ya podemos apagar el sistema, liarnos a enchufar los cables del puñetero switch, arrancar, comprobar de nuevo que admite las resoluciones, configurar el xorg.conf del otro o de los otros PCs (por fortuna, medio trabajo estará hecho) y, finalmente, disfrutar de todos ellos con un solo monitor, teclado y ratón.
Nota: switches baratos de eBay aparte, este método también es válido para cualesquiera otras circunstancias en las que la tarjeta gráfica no detecte las capacidades del monitor.
Esta entrada ha sido posible gracias al manual de Xorg.conf y a la ayuda de los chicos de FreeBSD (http://www.freebsd.org/doc/es/books/handbook/x-config.html).

Curioso, no había visto esta entrada hasta este momento.
Ahora que lo mencionas -sí, la Navidad ya pasó- siempre me tenía mosca un sistema Debian con gdm, bajo kvm D-Link ps2, en que la ventana de entrada de ese gestor la resolución se establecía en 800x600. Bastaba con presionar Ctrl+Alt+Retroceso para que, por arte de magia, se resolviera el problema.
A título informativo y al margen de lo especifado, los teclados usb con smartcard no funcionan bajo kvm.
Saludos
Me da a mí que todo dispositivo que se salga un poco de lo normal tiene todas las cartas para dar problemas con estos aparatos.