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.