Problema

En muchas distribuciones basadas en Debian (Ubuntu, Linux Mint, etc.) los comandos apt y dpkg pueden fallar de forma catastrófica cuando un módulo DKMS no logra compilarse para el kernel activo. El síntoma típico es:

  • dpkg --configure -a se queda atascado.
  • Cada intento de sudo apt install … termina con dpkg: error processing package … (--configure): installed … package post‑installation script subprocess returned error exit status 11.
  • Los logs muestran rutas como /var/lib/dkms/<module>/… y mensajes de “bad exit status” o “module build failed”.

El problema no es exclusivo de un paquete concreto; cualquier operación que requiera configurar paquetes dependientes del kernel (headers, image, generic‑hwe) se ve bloqueada. El resultado es un sistema que no puede instalar actualizaciones, ni siquiera parches de seguridad.

Causa

Los fallos de DKMS aparecen cuando el proceso de recompilación automática de un módulo encuentra:

  1. Fuentes incompatibles con la versión del kernel actual (cambios en la API, encabezados faltantes, etc.).
  2. Dependencias rotas: paquetes como linux-headers-$(uname -r) no están configurados, lo que impide que make encuentre los archivos de desarrollo.
  3. Scripts de post‑instalación defectuosos que abortan con código 11 cuando DKMS devuelve error.
  4. Rutas de configuración personalizadas (por ejemplo, módulos instalados manualmente en /var/lib/dkms/nintendo/...) que permanecen aunque el usuario ya no los necesite.
  5. Permisos o espacio insuficiente en /var/lib/dkms o en el directorio de compilación (/tmp), provocando fallos de make.

En la práctica, el escenario más frecuente es que un módulo instalado para una necesidad puntual (controlador de joystick, tarjeta Wi‑Fi, etc.) quede registrado en DKMS y, tras una actualización del kernel, la recompilación falle. Como DKMS está enlazado a los scripts de linux-headers y linux-image, el gestor de paquetes detiene toda la transacción.

Solución

La estrategia general consiste en aislar o eliminar el módulo problemático, asegurarse de que los encabezados del kernel estén configurados y, finalmente, volver a ejecutar la configuración pendiente de dpkg. Se pueden seguir dos rutas:

1. Desinstalar el módulo DKMS que falla

# 1. Identificar el nombre exacto del módulo que aparece en los logs
dkms status

# 2. Eliminar la versión problemática (ejemplo: nintendo 3.2)
sudo dkms remove -m nintendo -v 3.2 --all

# 3. Borrar los archivos residuales
sudo rm -rf /var/lib/dkms/nintendo

2. Forzar la recompilación con encabezados correctos

# 1. Instalar/reinstalar los headers del kernel activo
sudo apt-get install --reinstall linux-headers-$(uname -r)

# 2. Intentar recompilar todos los módulos DKMS pendientes
sudo dkms autoinstall

# 3. Reconfigurar los paquetes rotos
sudo dpkg --configure -a

Si el módulo sigue fallando pero no es esencial, simplemente deshabilítalo:

# Renombrar el script que invoca DKMS en la fase de post‑instalación
sudo mv /etc/kernel/postinst.d/dkms /etc/kernel/postinst.d/dkms.disabled

Esto permite que apt continúe sin intentar compilar el módulo problemático. Posteriormente, se puede volver a habilitar el script y solucionar el módulo de forma aislada.

3. Limpieza de paquetes rotos y actualización completa

sudo apt-get -f install          # Corrige dependencias rotas
sudo apt-get update
sudo apt-get upgrade

Si después de los pasos anteriores el gestor sigue marcando errores, una reinstalación completa del meta‑paquete linux-generic-hwe-24.04 (o la variante correspondiente) suele resolver conflictos de dependencias:

sudo apt-get install --reinstall linux-generic-hwe-24.04

Cuándo aplicar esta solución

Aplica cuando:

  • Los logs de dpkg o apt mencionan explícitamente rutas bajo /var/lib/dkms/ y un “bad exit status” al compilar módulos.
  • La salida de dkms status muestra módulos en estado “installed” o “failed” para el kernel actual.
  • sudo apt-get -f install no logra reparar la situación.

No aplica si:

  • El error proviene de paquetes que no usan DKMS (por ejemplo, problemas de dependencias de Python o Java).
  • Los logs indican fallos de red, falta de espacio en disco o errores de permisos fuera de /var/lib/dkms.

Código

# Paso 1: listar módulos DKMS y buscar el que falla
dkms status

# Paso 2: eliminar el módulo problemático (reemplaza <module> y <version>)
sudo dkms remove -m <module> -v <version> --all
sudo rm -rf /var/lib/dkms/<module>

# Paso 3: reinstalar encabezados del kernel activo
sudo apt-get install --reinstall linux-headers-$(uname -r)

# Paso 4: forzar recompilación de los módulos restantes
sudo dkms autoinstall

# Paso 5: reconfigurar paquetes pendientes
sudo dpkg --configure -a

# Paso 6: reparar dependencias y actualizar
sudo apt-get -f install
sudo apt-get update && sudo apt-get upgrade

Verificación

  1. Ejecuta sudo dpkg --configure -a. La salida debe terminar sin errores.
  2. Revisa dkms status. Todos los módulos deben aparecer como “installed” o “removed”, sin estados “failed”.
  3. Corre sudo apt install <cualquier-paquete> (por ejemplo, curl). La instalación debe completarse sin interrupciones.
  4. Confirma que el kernel actual arranca sin mensajes de DKMS en dmesg o en los logs de journalctl -b.

Notas adicionales

  • Respaldar antes de borrar: si el módulo podría ser necesario en el futuro, copia su carpeta a /tmp antes de eliminarla.
  • Espacio en /tmp: durante la compilación DKMS usa /tmp como directorio de trabajo. Asegúrate de que haya al menos 1 GB libre.
  • Módulos de terceros: muchos controladores de hardware (por ejemplo, controladores de joystick, tarjetas Wi‑Fi USB) se instalan vía DKMS. Si no los usas, es más seguro desinstalarlos después de una actualización mayor del kernel.
  • Kernel múltiple: si mantienes varios kernels instalados, repite la reinstalación de headers para cada versión que necesites (p.ej., linux-headers-6.17.0-29-generic).
  • Automatización: para servidores donde DKMS no es requerido, considera desactivar el script dkms en /etc/kernel/postinst.d/ para evitar bloqueos futuros.

Con este enfoque, puedes recuperar la capacidad de usar apt y dpkg sin necesidad de reinstalar todo el sistema, manteniendo el entorno limpio y listo para futuras actualizaciones.