Problema

En sistemas Ubuntu que usan controladores propietarios (NVIDIA) o módulos externos (v4l2loopback), una actualización del kernel puede dejar el arranque inutilizable. El síntoma típico es Kernel Panic con el mensaje:

VFS: Unable to mount root fs on unknown-block(0,0)

Este error indica que el initrd generado para el nuevo kernel no contiene los módulos críticos (por ejemplo, nvidia.ko, v4l2loopback.ko). Cuando DKMS no logra compilar esos módulos contra la nueva versión del kernel, mkinitramfs los omite y el sistema no puede montar la raíz.

El problema no es exclusivo de una versión concreta; ocurre siempre que:

  • El kernel se recompila con una versión de GCC o de pahole distinta a la usada para construir el árbol del kernel.
  • DKMS falla por cambios en la API interna (funciones como v4l2_fh_add que ahora requieren más argumentos).
  • Los paquetes de cabecera (linux-headers-$(uname -r)) no están instalados o están desalineados.

Causa

1. Incompatibilidad de compilador / herramientas de depuración

El kernel se construyó con gcc-13 y pahole 125. Si el entorno de compilación usa una versión diferente de pahole (por ejemplo, 0), DKMS aborta y los módulos no se generan.

2. Cambios en la API del kernel

Entre versiones menores de kernel (p. ej. 7.0.0‑108029 → 7.0.0‑110030) algunas funciones internas cambian su firma. Los fuentes de v4l2loopback 0.12.7 todavía esperan la firma antigua de v4l2_fh_add/v4l2_fh_del, provocando errores de “too few arguments”.

3. Cabeceras faltantes o desalineadas

DKMS necesita los paquetes linux-headers-$(uname -r). Si se actualiza el kernel pero no se instalan las cabeceras correspondientes, la compilación falla.

4. Dependencias rotas de NVIDIA

Los controladores NVIDIA se construyen mediante DKMS. Si la versión del driver (580.126.09) no reconoce los cambios de la nueva rama del kernel, la compilación termina en error y el módulo nvidia.ko falta en el initramfs.

Solución

El objetivo es volver a un estado donde mkinitramfs pueda incluir todos los módulos críticos. El proceso se divide en tres fases:

  1. Restaurar un kernel funcional (opcional pero recomendado para evitar bloqueos).
  2. Reparar el entorno DKMS: instalar cabeceras, alinear versiones de herramientas y, si es necesario, actualizar los fuentes de los módulos problemáticos.
  3. Regenerar el initramfs y probar el arranque.

Paso 1 – Arrancar con un kernel anterior

Si el sistema no arranca, use el menú de GRUB:

  1. Seleccione “Advanced options for Ubuntu”.
  2. Elija la entrada que termina en -generic sin el número de versión más reciente.
  3. Inicie sesión y continúe con los pasos siguientes.

Paso 2 – Alinear herramientas y dependencias

# 1. Asegurarse de que las cabeceras coincidan con el kernel activo
sudo apt update
sudo apt install --reinstall linux-headers-$(uname -r) dkms

# 2. Verificar la versión de pahole; instalar la versión usada por el kernel
sudo apt install dwarfdump  # dwarfdump incluye pahole 125 en Ubuntu 24.04
pahole --version          # debe devolver 125

# 3. Forzar la recompilación de todos los módulos DKMS
sudo dkms autoinstall

Si v4l2loopback sigue fallando, la causa es la firma de la API. La solución práctica es actualizar a una versión del código fuente que soporte el kernel actual. La rama master de v4l2loopback ya incluye los cambios.

# 4. Descargar y compilar la última versión de v4l2loopback
git clone https://github.com/umlaeute/v4l2loopback.git
cd v4l2loopback
git checkout master
make
sudo make install
sudo depmod -a

Para NVIDIA, la versión 580.126.09 suele compilar sin problemas, pero si persiste el error:

# 5. Eliminar el driver actual y reinstalar la última versión del repositorio Ubuntu
sudo apt purge '^nvidia-.*'
sudo ubuntu-drivers autoinstall

Paso 3 – Regenerar initramfs y actualizar GRUB

# 6. Regenerar el initramfs del kernel activo
sudo update-initramfs -c -k $(uname -r)

# 7. Actualizar la configuración de GRUB
sudo update-grub

Reinicie y verifique que el sistema arranca sin panic.

Cuándo aplicar esta solución

Aplica cuando:

  • Aparezca “Kernel Panic: VFS: Unable to mount root fs on unknown‑block(0,0)” después de una actualización de kernel.
  • Los logs de dkms muestren fallos de compilación para módulos externos (NVIDIA, v4l2loopback, VirtualBox, etc.).
  • mkinitramfs informe que ciertos módulos no fueron incluidos.

No aplica si:

  • El panic ocurre antes de cargar el kernel (p.ej., problema de BIOS/UEFI).
  • No se usan módulos DKMS (solo módulos del kernel estándar).

Código

# Restaurar cabeceras y DKMS alineados
sudo apt update
sudo apt install --reinstall linux-headers-$(uname -r) dkms dwarfdump

# Forzar recompilación de todos los módulos DKMS
sudo dkms autoinstall

# Si v4l2loopback falla, compilar la última versión desde Git
git clone https://github.com/umlaeute/v4l2loopback.git
cd v4l2loopback
make && sudo make install
sudo depmod -a

# Reinstalar driver NVIDIA (opcional)
sudo apt purge '^nvidia-.*'
sudo ubuntu-drivers autoinstall

# Regenerar initramfs y actualizar GRUB
sudo update-initramfs -c -k $(uname -r)
sudo update-grub

Verificación

  1. Compilación DKMS: dkms status debe listar los módulos con installed y sin errores.
  2. Initramfs: lsinitramfs /boot/initrd.img-$(uname -r) | grep -E 'nvidia|v4l2loopback' debe mostrar los archivos .ko.
  3. Arranque limpio: Después del reboot, dmesg | grep -i panic no debe contener entradas de panic.
  4. Funcionamiento de los controladores:
    • NVIDIA: nvidia-smi muestra la GPU y la versión del driver.
    • v4l2loopback: modinfo v4l2loopback confirma que el módulo está cargado.

Notas adicionales

  • Mantener versiones de herramientas: Cuando actualice el kernel, verifique que gcc, pahole y binutils coincidan con los usados para compilar el árbol del kernel. En Ubuntu LTS, los paquetes oficiales suelen estar alineados.
  • Uso de apt-mark hold: Si necesita evitar que el kernel se actualice automáticamente y cause roturas repetidas, marque el paquete linux-image-generic como hold: sudo apt-mark hold linux-image-generic.
  • Backups de initramfs: Antes de actualizar, copie el initramfs actual (cp /boot/initrd.img-$(uname -r) ~/backup-initrd.img). Permite volver rápidamente con sudo update-initramfs -c -k <versión> si algo falla.
  • Módulos de terceros: Para cualquier módulo DKMS que falle, el patrón es el mismo: instalar cabeceras, alinear herramientas, recompilar o actualizar el código fuente. La mayoría de los proyectos en GitHub ya tienen una rama compatible con kernels recientes.