Soporte dinamico para modulos del kernel

Supongo que hubiera sido conveniente poner esto en la sección de tutoriales, pero creo que en esta ocasión es mas comentario/opinión que tutorial para la generación de un modulo en especial.

Hace un tiempo recibí en prestamo una computadora EXO (Classmate) cuya distribución “oficial” era bastante peculiar. Para ser una distro orientada a la educación  no tenía ningun software educativo (?!). Y cualquier distribución estandar de GNU/Linux puede ser instalado, pero la conexión wifi no funciona de forma estable.

Leí que existía un controlador para esta placa, y lo instalé. Todo funcionaba bien, pero me preguntaba como haría para instalar el mismo software en varias maquinas sin tener que hacerlo de forma manual.

Ya trabajando con el sistema operativo, se me presentó la actualización del sistema (y el kernel). Al hacerlo, el wifi dejó de funcionar, esto se daba porque el modulo se compiló para esa versión especifica del kernel, al actualizarlo el modulo no se cargaba con el kernel.

Leyendo un poco el como solucionar el problema, leí un artículo sobre dkms, e indagué un poco más. Y el sistema es muy interesante. Trabaja compilando el código fuente del módulo cada vez que se actualiza el kernel, así al instalar uno nuevo, el modulo no deja de funcionar.

La ventaja de este método, ademas de lo observado es que trabaja directamente sobre el código fuente del modulo, no asi con modulos precompilados como los demás que vienen con nuestro kernel.

Vamos a la parte práctica. Mi placa wifi es Realtek 8192SE, y el módulo soportado esta disponible en la web del fabricante. Además del codigo fuente del módulo, trae además el firmware (no libre) de la placa. Este detalle es relevante, ya que el sistema DKMS solo compila el kernel y lo ubica en árbol del kernel actual instalado, pero no así el firmware.

Lo primero es ubicar el código fuente de acuerdo a ciertos parámetros. Debe ubicarse en un carpeta en /usr/src/[nombre_del_módulo]-[versión_del_módulo]

mkdir /usr/src/rtl8192se-0005.1230.2011

En este directorio deberá encontrarse el archivo de configuración del sistema dkms.conf, con el cual guiaremos la instalacion.

Mi configuración refleja la instalación de varios modulos

PACKAGE_NAME="rtl8192se"
PACKAGE_VERSION="0005.1230.2011"
# Este es el primer modulo que debe compilarse e instalarse
BUILT_MODULE_NAME[0]="rtlwifi"
DEST_MODULE_LOCATION[0]="/kernel/drivers/net/wireless/"
# Este es el segundo modulos, pero es compilado en un directorio diferente
BUILT_MODULE_NAME[1]="rtl8192se"
BUILT_MODULE_LOCATION[1]="rtl8192se/"
DEST_MODULE_LOCATION[1]="/kernel/drivers/net/wireless/rtl8192se"
# Instalación del firmware, y borrado luego de la desinstalación 
POST_INSTALL="install.sh $source_tree/$PACKAGE_NAME-$PACKAGE_VERSION"
POST_REMOVE="remove.sh"

El script de instalación recibe como parámetro el lugar donde se encuentra el código fuente, y debe notarse que se usa como nombres de variables. Esto se recomienda buena práctica ya que se puede configurar para usar un directorio alternativo.

El script de instalacion es bastante simple, pero corrobora la existencia previa, para no copiarlo todas las veces que se compila

#!/bin/bash
$FIRM_DIR=$1/firmware/rtlwifi
# Corroborar que el firmware no este presente
if [ ! -d /lib/firmware/rtlwifi ]
then
    # Si no existe, copiarlo
    cp -a $FIRM_DIR /lib/firmware/
fi

El script de borrado del firmware es un comando simple

#!/bin/bash
rm -R /lib/firmware/rtlwifi

Una vez que estan hechos los archivos, se procede a la compilación del modulo. Pero antes se requiere la instalación de las cabeceras del kernel actual

# Debian/Ubuntu/Mint
apt-get install kernel-headers dkms
# Red Hat/Fedora/Centos
yum install kernel-headers dkms

Una vez instalado el sistema DKMS los comandos para generar los paquetes instalables de los mismos.

dkms add -m rtl8192se -v 0005.1230.2011
dkms build -m rtl8192se -v 0005.1230.2011
# Deb package
dkms mkdeb -m rtl8192se -v 0005.1230.2011
# RPM package
dkms mkrpm -m rtl8192se -v 0005.1230.2011

Los paquetes instalables pueden luego publicarse en repositorios.

La página de man del dkms tiene muchas mas opciones disponibles para los módulos que son compilados con características específicas. Incluyendo cambiar el nombre al instalarlo, la compilación solo para cierta versiones del kernel, etc.

El sistema en si es bastante rápido y estable. En el caso de Fedora, el kernel al utilizar la opción AUTO_INSTALL, verifica en cada booteo la presencia del módulo, lo cual agrega 30 segundos (o más) al proceso de inicio.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *