02 febrero 2009

Compilación de módulos de Linux como externos

Puede ocurrir que a nuestro Linux le falte algún módulo que si esté integrado con el núcleo a nivel de código fuente, pero que nuestra distribución no lo incluya compilado. Es el caso del Linux de Debian para la NSLU2; no incluye los módulos del subsistema de infrarrojos IrDA.

Una solución es compilar todo el núcleo a nuestro gusto. Pero también podemos compilar únicamente los módulos extras que necesitemos. En Debian y con el subsistema IrDA podríamos hacerlo de la siguiente manera:

Partimos del sistema con Debian instalado y los paquetes necesarios para realizar una compilación, como gcc, make y compañía. Utilizamos como shell bash. Entonces, lo 1º que hacemos es instalar las fuentes de linux, en este caso linux-source-2.6.18 y extraer su contenido a un directorio de trabajo:
$ su
# apt-get install linux-source-2.6.18
# exit
$ mkdir src
$ cd src
$ tar jxvf /usr/src/linux-source-2.6.18.tar.bz2
$ cd linux-source-2.6.18/

Al árbol de Linux recién extraído le damos la configuración de nuestro sistema y añadimos la de los módulos adicionales que queremos incluir, en este caso los de IrDA. Estos están dentro de la opción 'Networking'. Todo lo que necesitemos lo activamos dejándolo con la marca 'M' o '*' según proceda. También guardamos en la variable de entorno CONFIG_PATH el path del fichero de configuración resultante.
$ cp /boot/config-`uname -r` .config
$ make menuconfig
$ export CONFIG_PATH=$PWD

Creamos el siguiente Makefile y lo grabamos con nombre Makefile.alt:
include $(CONFIG_PATH)/.config
include ./Makefile
export

KVERSION = $(shell uname -r)

all:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

install:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) \
    modules_install

clean:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
¡Ojo! el espaciado previo a cada make en ese fichero debe ser un tabulador, como en todo Makefile.

Entonces copiamos el Makefile.alt al directorio del módulo a compilar y lanzamos la compilación. Por último instalamos los módulos compilados. Solo se compilarán e instalarán los módulos que hayamos marcado con el make menuconfig:
$ cp Makefile.alt net/irda/
$ cd net/irda/
$ make -f Makefile.alt
$ su
# make -f Makefile.alt install
# exit

Y eso es todo. El último paso lo podemos repetir en tantos subdirectorios como sea necesario. Por ejemplo, para tener los drivers específicos de los dispositivos de infrarrojos deberíamos lanzar el make también en drivers/net/irda.

No he encontrado un método más ortodoxo para hacer esto. Al menos de esta manera se utilizan los Makefile y configuración propios de nuestro núcleo, con lo que nos aseguramos de que los resultados sean coherentes. También es un método bastante sencillo que no requiere tocar ningún fichero del los fuentes de Linux. Espero resulte útil.

No hay comentarios: