Apuntes de Linux - Configuración de intel i915 en Arch Linux

Uno de los episodios más tediosos desde la migración de mi bien querido debian 5 GNU/Linux "Lenny" en adelante, más concretamente con su versión 6, fué el quebradero constante de la configuración del chipset gráfico intel integrado en el Compaq Evo D510 que utilizo habitualmente. Si bien podía haber cogido y configurado cualquier otro dispositivo de video echando mano del "cajón desastre" dónde se encuentra mucho material informático a la espera de ser reciclado de una manera u otra; ya que en otras distribuciones que había usado anteriormente funcionaba a las mil maravillas, pero de un tiempo a esta parte la lucha constante entre los usuarios y algunos chipset de intel viene siendo más que notoria.

Jugando con la configuración de xorg intentando encontrar el antiguo i810 usado en Etch, Lenny y en versiones antiguas de Slackware al levantar el servidor X11 este termina de manera inesperada con el consiguiente error.

Paso 1.

Abrimos un intérprete de comandos y escribimos lo siguiente:

sáb feb 9 23:56:17 CET 2013
23:56:17 ------:~ > lspci |grep VGA
00:02.0 VGA compatible controller: Intel Corporation 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device (rev 01)
0:01:35 -------:~ >

Con esta salida en el terminal ya lo tenemos identificado y comenzaremos la configuración.

Paso 2.

A continuación vamos a realizar la instalación de los siguientes paquetes ejecutando pacman como root:

pacman -S mesa mesa-demos libglapi libva libva-driver-intel xorg-server xorg-server-common intel-dri xf86-video-intel xf86-video-vesa xf86-video-fbdev xf86-input-evdev libegl libgles libgl

De estar ya instalados en su última versión los reinstalariamos sin problema alguno.

Paso 3.

Realizaremos un downgrade de estos mismos paquetes ya que en la última versión de xorg y del módulo de intel con esta gráfica no funciona correctamente.

Renombramos el fichero '/etc/pacman.d/mirrorlist' para poderlo utilizar con los mirror actuales posteriormente:

0:10:15 ------:~ > cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-back

Editamos el fichero '/etc/pacman.d/mirrorlist' con cualquier herramienta de edición de texto plano dejándolo de esta manera:

0:10:13 ------:~ > more /etc/pacman.d/mirrorlist-x-2
Server = http://arm.konnichi.com/2012/09/16/$repo/os/$arch

Una de las ventajas que tiene Arch Linux es que guardan en sus servidores "snapshots" que podemos reutilizar desde el año 2009 por si alguna de las actualizaciones casi diarias provoca demasiados errores, y así podamos restaurar mediante una fecha aproximada el grupo de paquetes que funcionó correctamente.

Paso 4.

Ejecutamos en un terminal como root la orden y sincronizamos las bases de datos de pacman:

0:10:15 ------:~ > pacman -Syy

Una vez realizado esto realizamos el downgrade de los paquetes con la orden:

0:10:15 ------:~ > pacman -Sf mesa mesa-demos libglapi libva libva-driver-intel xorg-server xorg-server-common intel-dri xf86-video-intel xf86-video-vesa xf86-video-fbdev xf86-input-evdev libegl libgles libgl

Aplicaremos la opción 'f' para forzar la instalación debido a entradas duplicadas en el sistema.

Paso 5.

Editamos el fichero '/etc/pacman.conf' para no realizar la actualización de dichos paquetes la próxima vez que hagamos upgrade en el sistema. Dejando este apartado de esta manera:

# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
IgnorePkg = libglapi libgl mesa mesa-demos libegl libva libva-driver-intel xorg-server-common xf86-input-evdev xorg-server intel-dri xf86-video-intel xf86-video-vesa xf86-video-fbdev libgles
IgnoreGroup = xorg

Paso 6.

Comenzamos a crear los ficheros de configuración de xorg ubicados en la ruta '/etc/X11/xorg.conf.d/', como la mayoría del hardware utilizado es bastante genérico me limito a copiar y pegar los míos que contienen algunas variaciones en la configuración:

---
10-dri.conf

Section "dri"
Mode 0666
EndSection

---
10-evdev.conf

Section "InputClass"
Identifier "evdev pointer catchall"
MatchIsPointer "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection

Section "InputClass"
Identifier "evdev keyboard catchall"
MatchIsKeyboard "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection

Section "InputClass"
Identifier "evdev touchpad catchall"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection

Section "InputClass"
Identifier "evdev tablet catchall"
MatchIsTablet "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection

Section "InputClass"
Identifier "evdev touchscreen catchall"
MatchIsTouchscreen "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection

---
10-keyboard.conf

Section "InputClass"
Identifier "Generic Keyboard"
MatchIsKeyboard "yes"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbLayout" "es"
EndSection

---
10-quirks.conf

Section "InputClass"
Identifier "ThinkPad HDAPS accelerometer blacklist"
MatchProduct "ThinkPad HDAPS accelerometer data"
Option "Ignore" "on"
EndSection

---
10-serverlayout.conf

Section "ServerLayout"
Identifier "Layout0"
Screen "Screen0" 0 0
Option "DontVTSwitch" "no"
Option "DontZap" "no"
Option "DontZoom" "no"
Option "DisableVidModeExtension" "no"
Option "AllowNonLocalXvidtune" "no"
Option "AllowMouseOpenFail" "no"
Option "VTSysReq" "no"
Option "BlankTime" "10"
Option "StandbyTime" "10"
Option "SuspendTime" "10"
Option "OffTime" "10"
Option "Pixmap" "32"
Option "Xinerama" "no"
Option "AIGLX" "yes"
Option "DRI2" "yes"
Option "GlxVisuals" "typical"
Option "UseDefaultFontPath" "yes"
Option "IgnoreABI" "no"
EndSection

---
20-intel.conf

Section "Device"
Identifier "Intel Graphics"
Driver "intel"
# Option "Shadow" "True"
# Option "DRI" "True"
# Option "SwapbuffersWait" "False"
Option "AccelMethod" "uxa"
# Option "TearFree" "True"
EndSection

---
50-monitor.conf

Section "Monitor"
Identifier "Default Monitor"
# DisplaySize 1024 768
Gamma 4.0 4.0 4.0
Option "DPMS" "yes"
EndSection

---
50-screen.conf

Section "Screen"
Identifier "Screen0"
Device "Default Device"
Monitor "Default Monitor"
SubSection "Display"
modes "1024x768"
EndSubSection
EndSection

Paso 7.

Ahora realizaremos un downgrade también del kernel 3.7.x , esto fué un ejercicio de observación al comprobar que tras una de las actualizaciones del núcleo del sistema empeoró sustancialmente el rendimiento y generando tras una carga de trabajo importante de la GPU el siguiente mensaje de error:

X Error of failed request: BadAlloc (insufficient resources for operation)

Volveremos a editar el fichero '/etc/pacman.d/mirrorlist' incluyendo la línea referente al kernel 3.6.x que instalaremos seguidamente sustituyendo al 3.7.x :

0:54:24 ------:~ > more /etc/pacman.d/mirrorlist-back
#Server = http://arm.konnichi.com/2012/09/16/$repo/os/$arch
Server = http://arm.konnichi.com/2013/01/15/$repo/os/$arch

Una vez hecho esto en el intérprete de comandos y como root ejecutamos la orden:

pacman -Syy && pacman -S linux linux-headers

Si tenemos instalados los paquetes lirc, virtualbox, virtualbox-host-modules y virtualbox-guest-modules hemos de realizar la desinstalación antes de downgradear el kernel. Para reinstalarlos posteriormente con una versión acorde entre los módulos y el núcleo.

Restauramos el fichero que contenía los mirror actualizados de los repositorios de pacman. ('/etc/pacman.d/mirrorlist') y editamos de nuevo el fichero '/etc/pacman.conf' incluyendo los nuevos paquetes a excluir. En este caso linux y linux-headers.

# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
IgnorePkg = libglapi libgl mesa mesa-demos libegl libva libva-driver-intel xorg-server-common xf86-input-evdev xorg-server intel-dri xf86-video-intel xf86-video-vesa xf86-video-fbdev libgles linux virtualbox virtualbox-guest-modules virtualbox-host-modules linux-headers
IgnoreGroup = xorg

NOTA.- En este caso incluyo virtualbox y sus dependencias tras realizar el downgrade también para su correcto funcionamiento.

Ejecutaremos como root en un terminal:

[root@------ ----]# pacman -Syu
:: Sincronizando las bases de datos de paquetes...
core está actualizado
extra está actualizado
community está actualizado
archlinuxfr está actualizado
:: Iniciando actualización completa del sistema...
atención: intel-dri: ignorando la actualización del paquete (8.0.4-3 => 9.0.2-1)
atención: libegl: ignorando la actualización del paquete (8.0.4-3 => 9.0.2-1)
atención: libgl: ignorando la actualización del paquete (8.0.4-3 => 9.0.2-1)
atención: libglapi: ignorando la actualización del paquete (8.0.4-3 => 9.0.2-1)
atención: libgles: ignorando la actualización del paquete (8.0.4-3 => 9.0.2-1)
atención: libva: ignorando la actualización del paquete (1.1.0-1 => 1.1.0-2)
atención: ignorando el reemplazo del paquete (libva-driver-intel-1.0.18-1 => libva-intel-driver-1.0.19-1)
atención: linux: ignorando la actualización del paquete (3.6.11-1 => 3.7.6-1)
atención: linux-headers: ignorando la actualización del paquete (3.6.11-1 => 3.7.6-1)
atención: mesa: ignorando la actualización del paquete (8.0.4-3 => 9.0.2-1)
atención: virtualbox-guest-modules: ignorando la actualización del paquete (4.2.6-3 => 4.2.6-6)
atención: virtualbox-host-modules: ignorando la actualización del paquete (4.2.6-3 => 4.2.6-6)
atención: xf86-input-evdev: ignorando la actualización del paquete (2.7.3-1 => 2.7.3-2)
atención: xf86-video-fbdev: ignorando la actualización del paquete (0.4.3-1 => 0.4.3-2)
atención: xf86-video-intel: ignorando la actualización del paquete (2.20.7-1 => 2.21.0-1)
atención: xf86-video-vesa: ignorando la actualización del paquete (2.3.2-1 => 2.3.2-2)
atención: xorg-server: ignorando la actualización del paquete (1.12.4-1 => 1.13.2-1)
atención: xorg-server-common: ignorando la actualización del paquete (1.12.4-1 => 1.13.2-1)
nada que hacer

Si recibimos estos mensajes de salida no es necesario tocar nada más a través de pacman ni sus configuraciones. Llegados a este punto reiniciaremos el sistema para poder trabajar sobre 3.6.x

Paso 8.

Una vez iniciado de nuevo editamos el fichero '/etc/mkinitcpio.conf' y dejamos editada la sección "MODULES" y "FILES" de esta manera:

# vim:set ft=sh
# MODULES
# The following modules are loaded before any boot hooks are
# run. Advanced users may wish to specify all system modules
# in this array. For instance:
# MODULES="piix ide_disk reiserfs"
MODULES="i915"

# BINARIES
# This setting includes any additional binaries a given user may
# wish into the CPIO image. This is run last, so it may be used to
# override the actual binaries included by a given hook
# BINARIES are dependency parsed, so you may safely ignore libraries
BINARIES=""

# FILES
# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way. This is useful for config files.
# Some users may wish to include modprobe.conf for custom module options
# like so:
FILES="/etc/modprobe.d/modprobe.conf"

Una vez editado el fichero creamos el initramfs ejecutando 'mkinitcpio -p linux' en un terminal como root. El paso siguiente es editar o crear el archivo '/etc/modprobe.d/modprobe.conf' incluyendo esta línea:

options i915 modeset=1

Paso 9.

Como último paso vamos a activar el KMS y pasarle las ordenes modeset=1 al kernel a través del gestor de arranque, en mi caso grub-legacy editando el fichero ubicado en la ruta '/boot/grub/grub.cfg' dejando las entradas "repo kernel" y "fallback" de esta manera:

linux /vmlinuz-linux root=UUID=1e895a03-30b3-43c7-b4fb-6a894c86a6e4 ro quiet splash i915.modeset=1

Los añadidos "quiet" (que no nuestre mensajes en el arranque) y "splash" (debido a que uso plymouth y su método de arranque gráfico).

Paso 10. (Opcional)

Para no sobrecargar en exceso el X server principal (:0) normalmente utilizo otro sistema que es lanzar mediante xinit aplicaciones como juegos y algunas más levantando un nuevo display (:1) evitando la caída del otro y los posibles errores que se puedan producir inesperadamente con un sencillo script. En el caso del juego FPS Urban Terror sería:

#!/bin/bash
DISPLAY=:1.0
xinit /usr/bin/urbanterror $* -- :1 &

Para la elaboración de este manual se ha utilizado información principalmente de la Wiki de Arch Linux :

https://wiki.archlinux.org/index.php/Intel_Graphics_(Espa%C3%B1ol)#Instalaci.C3.B3n

Espero que os haya servido de ayuda.

Saludos.