Módulos del Kernel en Linux

Los módulos  son utilizados para ampliar las funcionalidades del Kernel de Linux, la mayoría de los módulos son distribuidos con el Kernel, pero disponemos de mecanismos para añadir nuevos o eliminar los que no necesitemos.

Los módulos compilados con el Kernel son ficheros con la extensión «.ko» y guardados en /lib/modules/[versión kernel] y cada Kernel compilado tiene sus módulos por separado.

Se puede definir que se carguen módulos cuando se está iniciando el sistema utilizando el archivo de configuración  /etc/modules o en el fichero /etc/modules-load.d/modules.conf dependiendo de la distribución.

Algunos módulos dependen de otros, esta relación se define en el fichero modules.dep que está almacenado en /lib/modules/[versión kernel]

modules.dep

Si se compilan módulos fuera de los que vienen en el standard del Kernel cuando actualicemos el Kernel deberemos volver a compilarlos. Hay una solución que es usar DKMS  Dynamic Kernel Module Support que provee una forma de registrar los módulos y proveer información para que cuando se compilen e instalen en un nuevo Kernel, a través del comando dkms añadir o quitar módulos de la estructura de fuentes del Kernel.

Comandos básicos para el manejo de los módulos:

  • lsmod: Lista los módulos que actualmente están cargados en el Kernel, también podemos consultar en fichero /proc/modules
  • insmod: Instala un módulo en el Kernel actual, aunque es preferible el uso del comando modrpobe ya que este comando tiene varias limitaciones como es el de generar un error si el módulo a instalar depende de otros módulos.
  • rmmod: Elimina los módulos si no están relacionados con otros módulos en el Kernel.
  • modprobe: Al igual que insmod y rmmod se utiliza para instalar y desinstalar módulos en el Kernel activo, pero tiene la ventaja de cargar módulos simples, módulos con prerrequisitos o incluso los módulos existentes en un directorio.
  • modinfo: Nos muestra información de un módulo en concreto.
  • depmod: Crea la lista de dependencia de los módulos (modules.dep)

Por último tenemos el proceso de carga de módulos Kmod que es un thread del propio Kernel, anteriormente se utilizaba el servicio Kerneld. Cuando el Kernel necesita un módulo, Kmod se despierta y ejecuta modprobe mediante execve().