Gestión de Módulos del Kernel Linux

Los módulos del kernel Linux son fragmentos de código que pueden cargarse y descargarse dinámicamente en el kernel sin necesidad de reiniciar el sistema, permitiendo extender las capacidades del kernel con soporte para nuevo hardware, sistemas de archivos o funcionalidades de red. La gestión correcta de módulos es esencial para el soporte de hardware, la personalización del kernel y la resolución de problemas de controladores. Esta guía cubre el uso de modprobe, la gestión de parámetros, la lista negra de módulos, DKMS para módulos externos y la solución de problemas comunes.

Requisitos Previos

  • Cualquier distribución Linux con kernel 4.x o superior
  • Acceso root o privilegios sudo
  • Cabeceras del kernel (para compilar módulos externos)
# Verificar versión del kernel actual
uname -r

# Instalar cabeceras del kernel (necesario para módulos DKMS)
apt install linux-headers-$(uname -r)   # Ubuntu/Debian
dnf install kernel-devel-$(uname -r)    # CentOS/Rocky

Comandos Básicos de Módulos

# Listar módulos cargados actualmente
lsmod
# Formato: Nombre  Tamaño  Usuarios  Dependencias

# Listar módulos con más detalle
lsmod | head -20
lsmod | wc -l  # Total de módulos cargados

# Buscar un módulo específico
lsmod | grep "nombre-modulo"
lsmod | grep -i "usb\|nvidia\|network"

# Ver información detallada de un módulo
modinfo nombre_modulo
modinfo e1000e  # Ejemplo: controlador de red Intel

# Información útil de modinfo:
# filename:  ruta del archivo .ko
# description: descripción del módulo
# author: autor
# license: licencia (GPL, MIT, etc.)
# parm: parámetros aceptados
# depends: módulos de los que depende
# alias: alias del hardware (para auto-carga)

# Cargar un módulo manualmente (sin dependencias)
insmod /path/to/modulo.ko

# Descargar un módulo
rmmod nombre_modulo
# Si tiene procesos usando el módulo, forzar (usar con precaución)
rmmod -f nombre_modulo

Gestión con modprobe

modprobe es la herramienta preferida para cargar/descargar módulos, ya que gestiona las dependencias automáticamente:

# Cargar un módulo (con sus dependencias automáticamente)
modprobe nombre_modulo
modprobe e1000e          # Cargar controlador de red Intel

# Descargar un módulo y sus dependencias no utilizadas
modprobe -r nombre_modulo
modprobe -r e1000e

# Simular carga/descarga sin ejecutar realmente (dry-run)
modprobe --dry-run nombre_modulo
modprobe -n nombre_modulo  # Equivalente

# Ver qué módulos se cargarían (con dependencias)
modprobe --show-depends nombre_modulo

# Cargar todos los módulos listados en un archivo
modprobe -a modulo1 modulo2 modulo3

# Recargar la base de datos de módulos (tras instalar nuevos)
depmod -a
depmod -a $(uname -r)  # Para un kernel específico

# Ver la base de datos de dependencias
cat /lib/modules/$(uname -r)/modules.dep | head -20

Parámetros de Módulos

Muchos módulos aceptan parámetros que modifican su comportamiento:

# Ver parámetros disponibles de un módulo
modinfo nombre_modulo | grep "^parm:"
modinfo e1000e | grep "^parm:"

# Cargar un módulo con parámetros
modprobe nombre_modulo parametro=valor
modprobe iwlwifi power_save=1  # Activar ahorro de energía WiFi

# Ver parámetros actuales de un módulo cargado
ls /sys/module/nombre_modulo/parameters/
cat /sys/module/e1000e/parameters/

# Cambiar un parámetro en caliente (si el módulo lo permite)
echo 1 > /sys/module/nombre_modulo/parameters/parametro

# Parámetros persistentes mediante archivo de configuración
cat > /etc/modprobe.d/ajustes.conf << 'EOF'
# Configuración persistente de parámetros de módulos

# Aumentar velocidad del controlador de USB
options usbcore initial_descriptor_timeout=5000

# Activar ahorro de energía WiFi
options iwlwifi power_save=1

# Desactivar hardware offload en controlador de red (debug)
options e1000e SmartPowerDownEnable=0
EOF

Parámetros de Módulos Comunes

# Ver y ajustar parámetros del módulo de red en tiempo real
# Para un controlador de red cargado
ls /sys/module/e1000e/parameters/
cat /sys/module/e1000e/parameters/InterruptThrottleRate

# Módulo drm (gráficos)
modinfo drm | grep parm
# Ajustar nivel de debug gráfico
# options drm debug=1

# Módulo loop (dispositivos de bucle para ISO)
cat /proc/sys/vm/max_map_count
# Aumentar límite de dispositivos loop
echo "options loop max_loop=64" > /etc/modprobe.d/loop.conf
modprobe -r loop && modprobe loop

# Intel PCIe ASPM (gestión de energía)
# echo "options pcie_aspm policy=powersave" > /etc/modprobe.d/pcie.conf

Lista Negra de Módulos

La lista negra previene la carga automática de módulos problemáticos o innecesarios:

# Ver módulos en lista negra actuales
ls /etc/modprobe.d/
cat /etc/modprobe.d/blacklist*.conf 2>/dev/null

# Añadir un módulo a la lista negra
cat > /etc/modprobe.d/mi-blacklist.conf << 'EOF'
# Lista negra de módulos no deseados

# Deshabilitar el controlador gráfico nouveau (para instalar NVIDIA propietario)
blacklist nouveau
blacklist lbm-nouveau

# Deshabilitar el altavoz interno (beep molesto)
blacklist pcspkr
blacklist snd_pcsp

# Deshabilitar módulo Bluetooth si no se usa
blacklist btusb
blacklist bluetooth
EOF

# Actualizar initramfs para que el blacklist aplique durante el arranque
update-initramfs -u    # Ubuntu/Debian
dracut --force         # CentOS/Rocky

# La lista negra solo previene la carga automática
# Para evitar carga INCLUSO manual, usar 'install' en lugar de 'blacklist'
cat >> /etc/modprobe.d/mi-blacklist.conf << 'EOF'
# Prevenir instalación completa del módulo (más fuerte que blacklist)
install nouveau /bin/true
EOF

Carga Automática de Módulos

Módulos que se Cargan en el Arranque

# Módulos cargados automáticamente durante el arranque
# Ubuntu/Debian: /etc/modules
cat /etc/modules

# Añadir módulos para carga automática al arranque
cat >> /etc/modules << 'EOF'
# Módulos a cargar en cada arranque
dm_mod          # Device mapper
loop            # Soporte de dispositivos loop
nfs             # Soporte NFS
EOF

# CentOS/Rocky Linux: /etc/modules-load.d/
cat > /etc/modules-load.d/custom.conf << 'EOF'
# Módulos a cargar en el arranque
dm_mod
loop
nfs
ip_tables
EOF

# Verificar que se cargan correctamente
systemctl status systemd-modules-load.service
journalctl -u systemd-modules-load.service

Detección Automática de Hardware

# Cómo Linux detecta qué módulo cargar para un dispositivo
# Ver los IDs del hardware detectado
lspci -v | head -50          # Dispositivos PCI
lsusb -v 2>/dev/null | head -30  # Dispositivos USB

# Ver qué módulo maneja un dispositivo PCI
lspci -k | head -30
# Muestra: "Kernel driver in use:" y "Kernel modules:"

# Buscar el módulo para un ID de hardware específico
modprobe --show-depends $(lspci -k | grep -A3 "Network" | grep "Kernel modules" | awk '{print $NF}')

# Ver la tabla de alias (ID hardware -> módulo)
cat /lib/modules/$(uname -r)/modules.alias | grep "1234:5678"  # Bus ID ejemplo

DKMS: Módulos Fuera del Árbol

DKMS (Dynamic Kernel Module Support) permite instalar y mantener módulos del kernel que no forman parte del árbol oficial del kernel, recompilándolos automáticamente cuando se actualiza el kernel:

Instalar y Usar DKMS

# Instalar DKMS
apt install dkms            # Ubuntu/Debian
dnf install dkms            # CentOS/Rocky

# Ver módulos DKMS instalados
dkms status

# Ejemplo: instalar el módulo NVIDIA con DKMS
apt install nvidia-dkms     # Ubuntu (instala automáticamente con DKMS)

# Ver estado de compilación
dkms status nvidia

# Reconstruir manualmente un módulo DKMS
dkms build -m modulo -v version -k $(uname -r)
dkms install -m modulo -v version -k $(uname -r)

Crear un Módulo DKMS Personalizado

# Estructura de un módulo con DKMS
# /usr/src/mi-modulo-1.0/
mkdir -p /usr/src/mi-modulo-1.0

# Crear el Makefile básico del módulo
cat > /usr/src/mi-modulo-1.0/Makefile << 'EOF'
obj-m += mi-modulo.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
EOF

# Crear el archivo de configuración DKMS
cat > /usr/src/mi-modulo-1.0/dkms.conf << 'EOF'
PACKAGE_NAME="mi-modulo"
PACKAGE_VERSION="1.0"
BUILT_MODULE_NAME[0]="mi-modulo"
DEST_MODULE_LOCATION[0]="/updates"
AUTOINSTALL="yes"
EOF

# Registrar el módulo en DKMS
dkms add -m mi-modulo -v 1.0

# Compilar para el kernel actual
dkms build -m mi-modulo -v 1.0

# Instalar
dkms install -m mi-modulo -v 1.0

# Verificar
dkms status
modprobe mi-modulo
lsmod | grep mi-modulo

DKMS Mantenimiento

# Eliminar un módulo DKMS
dkms remove -m modulo -v version --all

# Recompilar para todos los kernels instalados
dkms autoinstall

# Ver los kernels disponibles para compilar
dkms status --verbose

# Si falla la compilación, ver el log
cat /var/lib/dkms/mi-modulo/1.0/build/make.log

Solución de Problemas

Error "modprobe: FATAL: Module not found in directory":

# El módulo no existe para el kernel actual
# Buscar el módulo
find /lib/modules/$(uname -r) -name "*.ko" | grep nombre_modulo
# Actualizar base de datos de módulos
depmod -a
# Si el módulo es de DKMS, verificar que compiló correctamente
dkms status

Módulo cargado pero el hardware no funciona:

# Ver mensajes del kernel relacionados con el hardware
dmesg | grep -i "nombre_modulo\|error\|fail" | tail -20
journalctl -k | grep -i nombre_modulo
# Verificar que el dispositivo fue detectado
lspci -v | grep -A5 "Nombre del dispositivo"
lsusb -v | grep -A5 "idProduct"

Error al descargar módulo "Module is in use":

# Ver qué procesos usan el módulo
lsof | grep nombre_modulo
fuser -v /dev/nombre_dispositivo
# Ver módulos que dependen del módulo objetivo
lsmod | grep nombre_modulo  # Ver columna "Used by"
# Descargar primero los módulos dependientes
modprobe -r modulo_dependiente
modprobe -r modulo_objetivo

DKMS falla al compilar tras actualización del kernel:

# Verificar que las cabeceras del nuevo kernel están instaladas
apt install linux-headers-$(uname -r)  # Ubuntu
dnf install kernel-devel-$(uname -r)   # CentOS/Rocky
# Recompilar manualmente
dkms autoinstall -k $(uname -r)
# Ver el error específico
cat /var/lib/dkms/*/build/make.log | tail -50

Conclusión

La gestión de módulos del kernel es una habilidad fundamental para la administración de sistemas Linux, desde la instalación de controladores de hardware hasta la personalización del comportamiento del kernel para casos de uso específicos. El uso de modprobe para carga con resolución de dependencias, la configuración persistente en /etc/modprobe.d/, la lista negra de módulos problemáticos y DKMS para módulos externos constituyen el conjunto completo de herramientas para gestionar eficazmente los módulos en entornos de producción.