Solución al error "unable to locate package linux-headers"

Author
Por Darío Rivera
Publicado el en Ubuntu

Un error no tan común en Ubuntu que suele presentarse cuando se intenta instalar los headers de Linux y el manejador de paquetes no es capaz de encontrar dichos archivos de instalación es el siguiente:

Unable to locate package linux-headers

Este error se presenta al instalar los headers de la versión actual del kernel o de cualquier otra versión que tengas instalada después de haber ejecutado un comando similar al siguiente:

sudo apt install linux-headers-$(uname -r)

Solución

El error "Unable to locate package linux-headers" puede ser causado por varios motivos y la solución depende de cual haya sido ese motivo específico por el cual obtuviste el error. A continuación veremos diferentes soluciones para algunas de las causas más comunes.

Disclaimer: Los procedimientos mencionados en este post pueden implicar ciertos riesgos para el correcto funcionamiento de tu sistema operativo. Por lo tanto, se recomienda que sigas los pasos con precaución y bajo tu propia responsabilidad. Asegúrate de tener una copia de seguridad actualizada de todos los datos importantes antes de continuar.

Actualización parcial del sistema operativo

Si eres de aquellos que les gusta tener la última versión del sistema operativo o del Kernel de Linux tienes una alta probabilidad de ver este error en tu terminal. Asumiendo que esto sucedió en estas circunstancias vamos a realizar el siguiente procedimiento.

Lo que vamos a hacer a continuación es actualizar la lista de paquetes disponibles y posteriormente vamos a actualizar cada uno de los paquetes en nuestro sistema. Para esto, puedes ejecutar los siguientes comandos:

apt update -y && apt upgrade && apt dist-upgrade
apt autoremove && apt autoclean -y

Después de esto, puedes lanzar los siguientes comandos para instalar los headers y los modulos extra del kernel.

apt update -y && apt upgrade && apt dist-upgrade
apt autoremove && apt autoclean -y
apt install linux-headers-$(uname -r)
apt-get install linux-modules-extra-$(uname -r)

Si todo ha salido bien, puedes correr el siguiente comando para actualizar el ramdisk inicial.

update-initramfs -u -k $(uname -r)

Chroot con versión diferente del kernel

Si estás iniciando tu sistema desde un Live USB puede ser que la versión del kernel del sistema live sea diferente a la de tu sistema operativo. Siempre es recomendable utilizar un live usb con la misma versión del sistema operativo instalado, pero en hay ocasiones en las que tu sabes, no hay muchas opciones.

Para verificar la versión del kernel cargada en tu sistema live debes haber ingresado previamente con chroot. Después de eso puedes ejecutar el siguiente comando:

root@ubuntu:/# uname -r
6.2.14-060214-generic

Ahora bien, para ver la versión real del kernel utilizada por tu sistema puedes ejecutar el siguiente comando el cual te mostrará cada una de las versiones del kernel instaladas.

root@ubuntu:/# dpkg -l | tail -n +6 | grep -E 'linux-image-[0-9]+' | grep ii
ii  linux-image-5.19.0-40-generic  5.19.0-40.41  amd64  Signed kernel image generic
ii  linux-image-6.2.0-20-generic   6.2.0-20.20   amd64  Signed kernel image generic

Si ninguna de estas versiones coincide con la versión cargada significa que el kernel del sistema live podría ser diferente al de tu sistema. Esto también dependerá de que particiones montaste y cómo lo hiciste antes de entrar con chroot. Si montaste la partición /proc del usb live en /mnt o algo similar entonces es segura esta afirmación. Lo importante, es que como las versiones son diferentes el siguiente comando no funcionará correctamente.

apt install linux-headers-$(uname -r)

En este caso deberás buscar con tu gestor de paquetes alguna versión del kernel adecuada para tu sistema. Esto lo puedes hacer con el siguiente comando:

apt search "linux-headers" | grep "generic"

Esto te mostrará una salida similar a la siguiente:

linux-headers-6.2.0-20-generic/lunar,now 6.2.0-20.20 amd64 [installed]
linux-headers-6.2.14-060214-generic/now 6.2.14-060214.202305010032 amd64
linux-headers-generic/lunar,now 6.2.0.20.20 amd64
linux-headers-generic-hwe-22.04/lunar,now 6.2.0.20.20 amd64
linux-headers-generic-hwe-22.04-edge/lunar 6.2.0.20.20 amd64

Observa con detenimiento las versiones que están instaladas con el texto <="" span="">, esto coincidirá con uno de los comandos ejecutados anteriormente para ver las versiones instaladas del kernel. Si tu versión no está instalada, en mi caso la 6.2.14-060214-generic, deberás instalar esa versión específica del kernel así:

export UNAME=6.2.14-060214-generic
apt install linux-headers-$UNAME
apt-get install linux-modules-extra-$UNAME

Si todo ha salido bien, puedes correr el siguiente comando para actualizar el ramdisk inicial.

update-initramfs -u -k $UNAME

HWE

HWE (Hardware Enablement) es una función de Ubuntu que proporciona soporte para hardware nuevo en versiones anteriores del kernel de Ubuntu a través de la retroportación de controladores y otras mejoras del kernel desde versiones más nuevas. Esto permite que las versiones LTS (Long Term Support) de Ubuntu tengan soporte de hardware actualizado durante el ciclo de vida de la versión LTS.

Este método de hecho es una alternativa a la anterior solución y consisten en dejarle el trabajo al metapaquete HWE. Para averiguar que version debes instalar del metapaquete puedes ejecuta el siguiente comando:

apt search "linux-headers" | grep "generic-hwe"

Obtendras una salida similar a la siguiente

linux-headers-generic-hwe-22.04/lunar,now 6.2.0.20.20 amd64
linux-headers-generic-hwe-22.04-edge/lunar 6.2.0.20.20 amd64

De esta forma solo debes instalar los headers con HWE para la versión adecuada de tu sistema operativo, digamos la v22.04 así:

apt install linux-headers-generic-hwe-22.04

Si todo ha salido bien, puedes correr el siguiente comando para actualizar el ramdisk inicial.

update-initramfs -u -k all

Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.