Archivo mensual: junio 2009

Compilando parcialmente el kernel de linux

Esta semana he estado maldiciendo un poco mi suerte con los gamepad. Después de la muerte súbita de dos cacharros, he estado haciendo experimentos con la vibración… para darme cuenta de que pocos dispositivos la soportan. Los dispositivos logitech están bastante bien soportados, pero personalmente me parecen blandurrios, y no creo que vuelva a comprar ninguno.

Así que mangoneando un poco en los fuentes del núcleo, vi que hacer la modificación para que mi gamepad estuviera soportado era fácil (al fin y al cabo, hay un fichero que casi los controla… sólo hace falta añadir mis dispositivos). El problema vino después cuando quise compilar mis cambios. Lo que yo quería hacer era:

  • Compilar únicamente los módulos modificados, o la rama correspondiente.
  • Compilar los módulos contra el kernel instalado en mi equipo… un kernel Debian de serie (así mis modificaciones podrían servir para otros equipos sin recompilar).

Los módulos que quería modificar pertenecían a la parte que lleva el HID. El procedimiento que he seguido ha sido el siguiente:

  1. Bajar las fuentes del kernel actual y descomprimirlas
  2. Ir al directorio de las fuentes
  3. Copiar el fichero de configuración del kernel actual (habitualmente en /boot; en mi caso cp /boot/config-2.6.29-2-amd64 .config ).
  4. Copiar la información de símbolos de los módulos ( cp /lib/modules/2.6.29-2/build/Module.symvers . ).
  5. Obtener la versión del núcleo y modificar Makefile para que sea igual a la del instalado.
  6. Preparar la compilación de los módulos (make prepare ;  make prepare_modules)
  7. Compilar los módulos elegidos. Se hace con make M=(modulos)

Hay que tener en cuenta que sólo los pasos 1, 2, 6 y 7 son necesarios si el kernel que se ha compilado es “propio”. Los pasos 3, 4 y 5 son necesarios para asegurarse de que los módulos correrán en el mismo kernel que tiene en ese momento la máquina. Es útil cuando se recompilan módulos en una máquina que no se puede reiniciar, o se compilan módulos para distribuir a otros equipos.

También hay que tener en cuenta que en algún lugar entre el paso 2 y el 3 se deberían haber editado/parcheado los ficheros que queremos modificar. En mi caso, las instrucciones fueron las siguientes (marco a qué paso corresponde cada una):

  • 1) apt-get install linux-source-2.6.30
  • 1) cd /usr/src
  • 1) tar -jxvf  linux-source-2.6.30.tar.bz2
  • 2) cd /usr/src/linux-source-2.6.30
  • 3) cp /boot/config-2.6.30-1-amd64 .
  • 4) cp /lib/modules/2.6.30-1/build/Modules.symvers .
  • 5) uname -r
  • 5) nano Makefile (más acerca de esto abajo)
  • 6) make prepare
  • 6) make prepare_modules
  • 7) make M=drivers/hid

Acerca de la edición del fichero Makefile:

El fichero Makefile debe ser editado para que la versión sea idéntica a la de nuestro kernel (o el módulo no se cargará). Esto es importante porque muchas distribuciones (Debian, RedHat y compañía) suelen añadir “sufijos” a sus versiones propias del kernel. El comando uname -r nos dará la versión completa del kernel. En el caso de mi Debian, uname escupió (atentos al coloreado, que es importante):

2.6.30-1-amd64

En esta versión coloreada, podemos ver los tres números principales de versión del kernel (rojo, verde y fucsia) y, sobre todo, la información extra del kernel (azul). Esta es la que varía de distribución a distribución. Al editar Makefile, veremos que comienza con las siguientes líneas:

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 30
EXTRAVERSION =
NAME = Man-Eating Seals of Antiquity

Nuestra labor será alterarlas para que la versión coincida completamente. Esto significa dejar el Makefile de esta manera:

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 30
EXTRAVERSION = -1-amd64
NAME = Man-Eating Seals of Antiquity

Con esto y un poco de suerte, la compilación parcial debería realizarse correctamente. En caso de que los módulos no carguen, dmesg nos dará una razón (probablemente algún problema con la configuración o versión). Si los módulos se compilan y se insertan bien, pero no se comportan como deberían (vamos, que las modificaciones que se les habían hecho no son buenas), para recompilar habría que repetir únicamente el paso 7.

Anuncios