lunes, 22 de septiembre de 2008

El escritorio que no cubría la pantalla

NOTA: Actualizado con todos los datos y capturas de pantalla.

Hoy me tocó arreglar el sistema X-Window de un portátil, un Toshiba Satellite U300 13H. Ya lo había hecho una vez, pero no recordaba cómo. El caso es que el escritorio no cubría toda la pantalla: la barra del escritorio no tocaba el fondo ni llegaba completamente a la derecha.



Y claro, fueron unas cuantas horas tratando de averiguar lo que pasaba, en realidad de recordarlo, trasteando con el siempre servicial xrandr que acudió en mi ayuda y me dijo lo que pasaba: La tarjeta gráfica se confundía y pensaba que estaban activas a la vez la salida LDVS y la salida TV. Y trataba de mostrarlas ambas en el monitor. Como la salida TV tiene menos resolución que la LDVS, pues ahí estaba el problema:

crab:~> xrandr
Screen 0: minimum 320 x 200, current 1280 x 800, maximum 1280 x 1280
VGA disconnected (normal left inverted right)
LVDS connected 1280x800+0+0 (normal left inverted right) 286mm x 179mm
1280x800 59.9*+ 60.0
1280x768 60.0
1024x768 60.0
800x600 60.3
640x480 59.9
TV connected 1024x768+0+0 (normal left inverted right) 0mm x 0mm
1024x768 30.0*
800x600 30.0
848x480 30.0
640x480 30.0

La solución ya la había hallado, no recuerdo ahora dónde, cuando instalé este portátil por primera vez, cuando se compró. Esta vez, me lié con la opción Option "Enable" "false" cuando no es correcta, y la solución al final me la dió esta entrada de una bitácora que se llama, curiosamente, No pienso arreglar tu ordenador. Tenía que haber usado Option "Ignore" "true".

Para explicarlo un poco mejor, el fichero xorg.conf lleva una sección donde se configura el dispositivo (la tarjeta de vídeo), otra donde se configuran los monitores (porque puede haber varios), y otra donde se junta todo creando una "pantalla".

La solución es configurar dos monitores:
Section "Monitor"
Identifier "Configured Monitor"
Option "DPMS"
EndSection

Section "Monitor"
Identifier "Disabled Monitor"
Option "Ignore" "true"
EndSection

y configurar la tarjeta para que ponga sus salidas en esos dos monitores, sacando así la molesta salida TV al monitor deshabilitado:

Section "Device"
Identifier "Intel Corporation Mobile GM965/GL960 Integrated Graphic
s Controller"
Driver "intel"
BusID "PCI:0:2:0"
Option "Monitor-LVDS" "Configured Monitor"
Option "Monitor-TV" "Disabled Monitor"
EndSection

miércoles, 17 de septiembre de 2008

Diseños de teclado (II)

Siguiendo con lo escrito en "Diseños de teclado", esta vez he tenido que hacer algo semejante: que un teclado estadounidense pueda ser utilizado para escribir normalmente en castellano.

Gracias a la documentación que menciono allí [1] [2] [3] no tuve muchos problemas para conseguirlo. El modelo de teclado a utilizar era, evidentemente, el teclado estadounidense us, lo que, así solo, significa la variante basic, es decir us(basic). Pero el teclado us tiene otra variante, la internacional us(intl), que permite cosas como que las teclas con acentos se consideren teclas muertas: teclas que necesitan que se pulse otra después, como en el teclado castellano es normal.

Pero no quería poner el teclado us(intl) tal cual, porque redefine demasiadas teclas.

La solución ha sido elegir la variante de teclado compuesta us+us(intl), que utiliza como base el us(basic) y allí donde éste no llega le añade el us(intl).

Así, la sección correspondiente del fichero /etc/X11/xorg.conf la he modificado de

Section "InputDevice"

# keyboard added by rhpxl
Identifier "Keyboard0"
Driver "kbd"
Option "XkbModel" "pc105"
Option "XkbLayout" "us"
EndSection

a
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbModel" "pc105"
Option "XkbLayout" "us+us(intl)"
EndSection

lunes, 1 de septiembre de 2008

El estrangulador del procesador

Los procesadores modernos (me refiero a la familia de los x86) tienen una característica muy interesante: el estrangulador (throttling) del procesador.

Muchas veces hemos oído hablar de características de los procesadores para portátiles como la de bajar la frecuencia de trabajo cuando se utiliza la batería, para que dure más. Pero el caso es que hay otras características que nos ayudan a hacer lo mismo, y mejor. Se trata de los estados de throttling del procesador, que fuerzan al mismo, independientemente de lo cargado que se encuentre, a <<echarse a dormir>> parte del tiempo. Estos estados se identifican con la letra T. El Intel Centrino Duo T2400 de mi portátil, por ejemplo, tiene 8 de estos estados de estrangulamiento, desde el T0 hasta el T7. Cuando está en el estado T0 el procesador no descansa: siempre está ejecutando algo, aunque sea el <<ciclo idle>>, y por lo mismo además siempre está gastando energía. En el estado T4, por ejemplo, el procesador estará dormido el 50% del tiempo: todas las operaciones que el usuario (o el sistema) trate de hacer, incluso a la máxima frecuencia, tardarán el doble de lo que tardarían en el estado T0.

Hoy en día, con núcleos Linux como el 2.6.26 que tengo funcionando, con las implementaciones modernas de ACPI, el estrangulador no es la vía preferida para cambiar la capacidad (ni el consumo) del procesador. Para eso están los cambios de frecuencia (los estados P del procesador), que son lo que normalmente podemos cambiar con herramientas de usuario como KPowersave. Otro día hablaré más profundamente sobre los estados P, los estados T, los estados S, los estados C, los estados G e incluso los estados D.

Antiguamente, cuando no se podía cambiar la frecuencia de los procesadores, los estados T eran la única manera de hacer que gastaran menos. Como expliqué arriba, esto se consigue poniendo el procesador a dormir por cortos períodos de tiempo, que en mi caso pueden llegar al 88% del tiempo total, dejando sólo el 12% del tiempo para ejecutar realmente instrucciones. Hoy, normalmente no se cambian estos estados salvo en caso de emergencia térmica: si el procesador está sobrecalentado por exceso de trabajo (y una ventilación o disipación deficiente), el sistema puede estrangular el procesador para obligarle a gastar menos energía (y así generar menos calor) incluso bajo las demandas más altas por parte del usuario.

Pero se pueden cambiar a mano para ver sus efectos.

Los núcleos Linux de hoy en día están cambiando sus interfaces ACPI del tradicional /proc al nuevo /sys, pero este cambio todavía no ha finalizado y nos las tenemos que ver con ambos. Para los estados T, en particular, vamos a requerir trastear con los ficheros de /proc/acpi/processor/. En este directorio veremos que hay un directorio por cada núcleo de procesador: /proc/acpi/processor/CPU0/, /proc/acpi/processor/CPU1/, etc. Utilicemos /proc/acpi/processor/CPU0/ como ejemplo. En su interior veremos varios ficheros, de los cuales nos va a interesar, en este caso, /proc/acpi/processor/CPU0/throttling. Este fichero nos indica qué estados de estrangulamiento soporta nuestro procesador (8 en el ejemplo inferior), qué tiempo duerme el procesador en cada uno de ellos y qué estado está en uso actualmente:

$ cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
state available: T0 to T7
states:
*T0: 100%
T1: 87%
T2: 75%
T3: 62%
T4: 50%
T5: 37%
T6: 25%
T7: 12%


En este ejemplo vemos que el sistema tiene 8 estados de estrangulamiento (state count), numerados de T0 a T7 (state available y la lista states), los tiempos de procesador activo de cada uno, del 100% activo (0% durmiendo) del T0 al 12% activo (88% durmiendo) del T7 (la lista states) y que el estado actual es el T0 (active state y el * en la lista states).

Se puede cambiar el estado a mano, siendo el superusuario, mediante una sencilla orden típica de /proc:

# echo 4 > /proc/acpi/processor/CPU0/throttling
o bien
# echo T4 > /proc/acpi/processor/CPU0/throttling
Si estás tratando de subirlo y no funciona, es que tu máquina está demasiado caliente y el sistema obliga al estrangulador a bajar el consumo para generar menos calor. Recuerda que cada watio gastado es un watio de calor que hay que sacar del sistema. Si sacas menos calor del que generas, el sistema se calienta y puede quemarse.

Un ejemplo: poner mi portátil sobre una esterilla aislante y poner la máquina a calcular hashes para el aMule pone la máquina en T7 independientemente de lo que yo haga. Simplemente levantarla 1cm de la esterilla aislante con unas pinzas de la ropa lleva al sistema a T4 casi inmediatamente y a T0 en unos 30 segundos. Y además en T0 el sistema responde mejor ;)