"Después del juego es antes del juego"
Sepp Herberger

martes, 10 de febrero de 2015

Forzando la configuración correcta de las Xorg.

En mi puesto detengo 2 pc conectados a un monitor Samsung SyncMaster 933HD mediante un KVM y frecuentemente me encontraba que la autodetección de las Xorg en el arranque me ponía resoluciones indeseables, ya que solo se detectaba la resolución óptima (1360x768) para el PC seleccionado por el KVM.

Como primera solución probé a generar un xorg.conf estático, con los pasos típicos:

  • Parar el gestor de sesiones: "/etc/init.d/gdm3 stop".
  • Generar un xorg.conf: "Xorg -configure", que crea un fichero /root/xorg.conf.new con el resultado de la autodetección.
  • Copiar el xorg.conf a su sitio: "cp /root/xorg.conf.new /etc/X11/xorg.conf".
  • Editar a mano /etc/X11/xorg.conf para limpiarlo de los drivers indeseados (por defecto se meten drivers de vesa, framebuffer, modesetting... además del driver correcto de la tarjeta, en mi caso "nouveau" en ambos PC), poner la resolución de 1360x768 en la lista de resoluciones y dejarla  como resolución preferida.
  • Arrancar el gestor de sesiones: "/etc/init.d/gdm3 start"

Esto normalmente es suficiente, pero en mi caso había algo que hacía que al reiniciar el equipo sin que el monitor estuviese accesible por el KVM se seleccionase de nuevo una resolución incómoda, como 1024x768 u 800x600.

En este punto opté por generar la resolución exacta para mi monitor/tarjeta gráfica, definiendo el modo 1360x768 perfectamente y asociándolo de forma irrevocable a la salida VGA. Los pasos son los siguientes:

1) Para empezar, no viene mal preguntar al mon‎itor que resoluciones soporta. Eso lo hacemos con la orden:

# ddcprobe

Este comando no siempre funciona con los drivers del núcleo/Xorg que tengamos, pero puede aportar luz sobre las resoluciones soportadas por el monitor asi cómo, en algunas ocasiones, las tasas de refresco horizontal y vertical del mismo. Digamos que su resultado no es fiable 100% y pueden faltar resoluciones en la lista, pero no está mal ejecutarlo a ver que nos dice.

2) Una vez decidimos la resolución que queremos (1360x768 píxeles a 60hz), generamos los modelines con:

# cvt 1360 768 60

que en mi caso produce esta salida:

# 1360x768 59.80 Hz (CVT) hsync: 47.72 kHz; pclk: 84.75 MHz
Modeline "1360x768_60.00"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync

3) Ahora, usando xrandr probaremos a aplicar el modo a mano y ver si funciona. Lo primero es:

# xrandr
Screen 0: minimum 320 x 200, current 1360 x 768, maximum 4096 x 4096
VGA-1 connected 1024x768+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x768       60.0*+
   800x600        60.3     56.2
   848x480        60.0
   640x480        59.9
DVI-D-1 disconnected (normal left inverted right x axis y axis)

que nos dice las resoluciones que hay configuradas y, muy importante, como se etiquetan las salidas de vídeo de la tarjeta gráfica. En nuestro caso VGA-1 (suele ser VGA-X, DVI-X o LVDS-X, a veces sin guión). Procedemos a añadir el modeline y seleccionamos la resolución:

# xrandr --newmode "1360x768"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync
# xrandr --addmode VGA-1 1360x768
# xrandr --output VGA-1 --mode 1360x768
# xrandr
Screen 0: minimum 320 x 200, current 1360 x 768, maximum 4096 x 4096
VGA-1 connected 1360x768+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1360x768       59.8*+
   1024x768       60.0
   800x600        60.3     56.2
   848x480        60.0
   640x480        59.9
DVI-D-1 disconnected (normal left inverted right x axis y axis)

Si el monitor no explota como si hubiéramos sido objetivo de Digibomber (*)(**) y se ve bien, hemos dado con la tecla.  Si no funciona, puede ser debido a alguna incompatiblidad de xrandr con el driver de video. En mi caso con el driver "nvidia" no funcionaba y con "nouveau" si.

4) En este punto, hay dos opciones: ejecutar el xrandr en un script de inicio (por ejemplo en /etc/X11/Xsession.d) o meterlo en el xorg.conf. En mi opinión es mas conveniente la segunda . El xorg.conf (generado como vimos al comienzo del artículo y luego retocado) me ha quedado:

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0"
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

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

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection
Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Samgung"
    ModelName      "SyncMaster 933HD"
    Option         "DPMS"

    HorizSync       30-61
    VertRefresh     56-75
    Modeline       "1360x768"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync
    Option         "PreferredMode" "1360x768"
EndSection

Section "Device"
       ### Available Driver options are:-
       ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
       ### <string>: "String", <freq>: "<f> Hz/kHz/MHz",
       ### <percent>: "<f>%"
       ### [arg]: arg optional
       #Option     "NoAccel"                # [<bool>]
       # ....mas parametros.....
       #Option     "ZaphodHeads"            # <str>
    Identifier  "Card0"
    Driver      "radeon"
    BusID       "PCI:1:0:0"
        Option      "Monitor-VGA-1" "Monitor0"
EndSection

Section "Screen"
   Identifier "Screen0"
   Device     "Card0"
   Monitor    "Monitor0"
   DefaultDepth     24
   SubSection "Display"
       Viewport   0 0
       Modes      "1360x768" "1024x768" "800x600" "640x480"
       Depth     24
   EndSubSection
EndSection

Como se puede ver he limpiado bastante el xorg.conf de todos los MonitorX, DeviceX y ScreenX que genera el Xorg -configure para los distintos drivers posibles, asi como las referencias a estos en la sección ServerLayout. Yo solo quiero usar un driver y una configuración, todo lo demás es innecesario si funciona bien.

Destacar que no viene mal poner las tasas de refresco del monitor, si podemos averiguarlas:

    HorizSync       30-61
    VertRefresh     56-75

Hay varias maneras: puede que nos las de el comando dccprobe, o que estén impresas en la parte trasera en la etiqueta de marca/modelo/nº de serie. A las malas, podemos consultar las especificaciones del monitor en Internet o en el manual técnico.

Otra parte interesante es:

    Modeline       "1360x768"   84.75  1360 1432 1568 1776  768 771 781 798 -hsync +vsync
    Option         "PreferredMode" "1360x768"

además de definir el modeline, indicamos que es el preferido para dicho monitor.

La línea:

Option      "Monitor-VGA-1" "Monitor0"

es muy importante: asocia el  monitor con el conector VGA-1 (recordemos que esa el identificador del conector sacado con xrandr). Esto lo averigüé al fallarme la resolución y mirar el Xorg.0.log. En las líneas "Output" no se vinculaba bien la tarjeta gráfica con el monitor y el mode 1360x768, con esta línea se forzó esa vinculación.

En el otro PC, al usar también driver "nouveau" la configuración xorg.conf ha quedado igual. En caso de tener que usar otros driver (intel, ati, ...) habría que generar un xorg.conf similar.

Y ya está, con esto ya tenemos una resolución fija que se pondrá siempre incluso si está apagado o no está conectado el monitor.


(*) Los monitores planos no explotan. Eso podía pasar en los monitores de tubo, pero es una leyenda urbana. Todo lo más es que se quemaban por forzar las frecuencias. Eso si, hace 20 años al configurar siempre a mano las xorg sin apenas documentación cruzabas los dedos cada vez que levantabas las X. El monitor a veces hacía un ruido agudo y chirriante hasta que se estabilizaba en la frecuencia y resolución.

(**) Saludos a los fans de Cryptonomicón.

 

1 comentario:

  1. Alfonso ¿has probado si a esa resolución pandectas da el siguiente problema, que me daba a mi: el lienzo o fondo sobre el que se puede trabajar no ocupa toda la pantalla?

    ResponderEliminar