CÓMO: Módulos del núcleo

Puppy tiene que comunicarse con los diversos componentes de “hardware” de la computadora, y para ello el núcleo Linux (kernel) tiene los llamados “módulos controladores” (drivers). Hay un controlador para cada componente de hardware; por ejemplo, para reproducir sonidos debe existir un controlador de sonido. Un controlador es un programa que sirve de enlace entre el sistema Puppy y el equipo en sí. Algunos controladores están incorporados en el núcleo, y otros se deben cargar aparte. Estos últimos son conocidos como módulos.

La parte “difícil” de este esquema consiste en decidir qué módulos hacen falta para una PC individual; y en segundo lugar, encontrar y cargar los módulos así identificados. Cabe señalar que para algunos componentes poco comunes, puede no existir un controlador adecuado.

Cuando Puppy arranca, se cargan varios módulos de forma automática.Usted puede ver cuáles, al examinar los archivos /etc/rc.d/rc.modules, /etc/rc.d/rc.network y /etc/rc.d/rc.local0. El primer archivo, rc.modules, ejecuta un programa llamado scanmodule, desarrollado por Antonio Gallo, de badpenguin.org. Este magnífico programita explora y encuentra los módulos requeridos para sonido, red Ethernet, PC Card (pcmcia), raid, scsi y USB, y enseguida los carga.

Sin embargo, scanmodule tiene un alcance muy limitado en la actualidad. Hay dos problemas...

1. Controladores incluídos en Puppy

El primer problema. Si usted examina el directorio /lib/modules, verá todos los módulos incluídos con Puppy. Todos terminan en ".o.gz"; por ejemplo,  el archivo "via82cxxx_audio.o.gz" es un controlador de sonido para los chips de sonido VIA Technologies 82cxxx. Para cargar este módulo y permitir que el núcleo lo utilice, use el siguiente comando:

# modprobe -v via82cxxx_audio

Notar que no hace falta introducir la extensión ".o.gz". El parámetro "-v" significa “verbalizado”, o sea, produce una salida detallada del resultado del intento de carga del módulo.

Muy bien, pero, ¿qué ocurre si no se encuentra el controlador para sus circuitos de sonido? Éste es el primer problema. No se rinda de inmediato, puede que otro de los módulos incluídos en Puppy sí trabajen con su chip de sonido, así que cabe aquí experimentar un poco.

modprobe puede rechazar la carga del módulo, lo cual es un claro indicio de que el módulo no es el indicado. También, puede ser que cargue, pero que sencillamente no funcione. Entonces, lo puede remover así:

# modprobe -r via82cxxx_audio

Para ver una lista de todos los módulos cargados, escriba esto:

# lsmod

Si no logra encontrar un módulo adecuado, hay más aún para elegir. Por ejemplo, en una de las páginas web de descarga de Puppy, como ftp://ibiblio.org/pub/Linux/distributions/puppylinux/, mirando en el directorio de la última versión de Puppy, encontrará un archivo llamado "modules-ALL-xxx.tar.gz" (donde xxx es la fecha de lanzamiento). Este archivo contiene el conjunto completo de módulos. No entraron todos en Puppy por limitaciones de tamaño.

Digamos que descargó el archivo "modules-ALL-xxx.tar.gz", y halló el módulo que necesitaba. ¿Cómo lo carga en Puppy? No lo copie en /lib/modules, ya que, antes de arrancar Puppy, ese directorio estaba en el archivo image.gz en el dispositivo de arranque.

Una solución temporal consiste en colocar el módulo en el directorio /root y escribir:

# insmod /root/name-of-module.o

¡Aquí sí tiene que poner el nombre completo del módulo, incluyendo la extensión ".o" (o ".o.gz" si es un archivo comprimido)! Al menos, sabrá si funciona. Por si acaso, tenga cuidado de no cargar el mismo módulo, más de una vez. Retire cada módulo, después de probarlo, con:

# rmmod name-of-module.o

2. detección automática de controladores con scanmodule

scanmodule es ejecutado por /etc/rc.d/rc.modules durante el arranque (es decir, cuando Puppy se inicia por primera vez, al encender la PC). Este programa intenta averiguar qué módulos hacen falta y luego los carga. Sin embargo, scanmodule recurre a una base de datos de hardware, ubicada en /lib/libhardware. Examine este directorio. Encontrará archivos de texto simple, como por ejemplo, "soundcard.db" (la base de datos de controladores de sonido).

Estos archivos de base de datos relacionan cada dispositivo a un controlador compatible. Por supuesto, el controlador debe estar en /lib/modules. Si examina el archivo "soundcard.db", encontrará una línea de texto referida al controlador "via82cxxx_audio".

Pero, algunos de los controladores en /lib/modules no figuran en estos archivos de base de datos. Hay herramientas en Puppy que permiten explorar qué ha sido cargado y qué ha quedado afuera:

Investigar el bus PCI

He organizado los programas de Antonio para ejecutar una serie de pruebas. Vaya al botón “Inicio” del sistema y seleccione “Panel de Control”, luego “Detección de Hardware”. Presione el botón "Query-PCI". Luego de una breve pausa, obtendrá una pantalla como ésta:


La sección "parse_pci_devices" muestra todas las interfases halladas en el bus PCI, en este formato:

vendor:device (class,subclass) status [vendorName-deviceName] className kernelModule

La parte relevante está en la última columna, que describe el nombre del módulo. Si dice "null", entonces el programa de búsqueda no pudo hallar un módulo compatible en la base de datos.

Otra posibilidad consiste en buscar en el directorio /lib/modules, y ver si el módulo buscado está aquí (aunque no esté mencionado en la base de datos). Puede usar el comando modprobe para averiguar si funciona.

Si tiene ganas de experimentar, puede descargar el archivo modules-ALL-xxx.tar.gz y buscar allí. Cabe notar, puede usted colocar temporalmente un módulo en un directorio tal como /root, y cargarlo así:

# insmod /root/test-module.o

Si usted puede determinar qué módulo funciona con su dispositivo en particular, envíe un mensaje al Foro de discusión (Puppy Discussion Forum), posiblemente en la sección HOWTO, y así yo podré introducir la información en la base de datos, e incorporar el módulo. Los datos que necesito son, principalmente, el par numérico de identificación del chip (por ejemplo, 1106:3058 en el caso del sonido en la ilustración anterior) y el módulo controlador que le corresponde. Notar, soy reacio a colocar módulos en Puppy para dispositivos inusuales, ya que eso engordaría demasiado al sistema.

Averiguar qué módulos han sido correctamente cargados

El programa “Panel de Control/Detección de hardware” tiene otros botones útiles. Uno de ellos es “Modules”. Mostrará una pantalla como ésta:


Esta ventana muestra los módulos que concuerdan con la base de datos, descubiertos por scanmodule. Si la columna de la derecha dice "running", significa que el módulo fue cargado con éxito (por scanmodule, al arrancar Puppy).

Si, por ejemplo, usted tiene una tarjeta Ethernet, pero no figura en esta ventana, significa que su dispositivo Ethernet no figura en la base de datos.

Cuando Puppy arranca, si el programa scanmodule de Antonio no puede hallar un controlador para un dispositivo en particular, por ejemplo, una tarjeta de red, entonces aparece un mensaje de error, con instrucciones para enviarme un correo electrónico. Sin embargo, le ruego que se ABSTENGA de hacerlo. Por desgracia, mi buzón anda saturado.
Incluso si scanmodule reporta una falla, una detección posterior durante el arranque de Puppy puede ubicar exitosamente el módulo correcto a cargar. RECUERDE, el programa de Antonio es solamente la primera etapa de detección de hardware durante el arranque. Por ejemplo, si usted ha ejecutado el Asistente de Red, usted puede ubicar el controlador correcto Ethernet, el cual será cargado al arranque, incluso si el programa de Antonio hubiera fallado.


Personalizar rc.local0

Aparte de la detección automática de scanmodule, el archivo /etc/rc.d/rc.local0 carga algunos módulos adicionales. Estos módulos son cargados a pedido, no son detectados automáticamente, y será necesario editar el archivo para efectuar cambios.
Notar que este archivo está ubicado en el directorio /root/.etc/rc.d, o sea que está en el dispositivo principal de almacenamiento (home). Si lo modifica, los cambios se mantendrán. Pero, si actualiza a Puppy, y el archivo rc.local0 ha sido actualizado, entonces la versión con sus cambios será remplazada por la versión más nueva. De hecho, permítame decirlo con claridad:

Para Puppy a partir de la versión 0.9.9 en adelante, al arrancar una nueva versión de Puppy (por ejemplo, un “live-CD”), Puppy automáticamente remplazará los archivos del directorio /root con versiones más nuevas, provenientes del CD.


Por tanto, haga copias de respaldo de los archivos que haya modificado.

Más módulos de red

Además de scanmodule y del archivo rc.local0, hay otras formas de cargar módulos controladores de red.
Notar que la secuencia exacta de ejecución de los archivos "rc." está explicada (en inglés) en el archivo /etc/rc.d/README.txt.

Por ejemplo, para efectuar una conexión telefónica al internet, los módulos "ppp" son cargados al momento de efectuar la llamada. Essta operación es ejecutada por el programa pppd. Si ejecuta el programa lsmod durante la conexión, podrá ver estos módulos adicionales.

Desde el botón “Inicio” del sistema, haga clic en “Configuración”, y encontrará un “Asistente de Cortafuegos Linux”, el cual instala un cortafuegos (firewall). Se introduce una línea en el archivo /etc/rc.d/rc.local, que iniciará el cortafuegos la próxima vez que inicie Puppy. Esta instalación crea un listado de instrucciones (script) llamado /etc/rc.d/rc.firewall*, el cual carga todo un conjunto de módulos. De nuevo, use lsmod para verlos.

El Asistente de Red le permite probar módulos y seleccionar el que funcione, para que sea cargado al arranque de forma automática.

PCMCIA (PC Card) es un trabajo en progreso. Por ahora, parece que Puppy cargará los módulos correspondientes por separado, usando un “script” llamado /etc/rc.d/rc.pcmcia, que será cargado al arranque.


Aporte los suyos

Usted puede compilar sus propios módulos para Puppy. Vea esta dirección en Internet (en inglés):

http://www.goosee.com/puppy/development/compilekernel.htm



(c) Copyright 2003,2004,2005 Barry Kauler