img

Objetivo:

Al ser Linux un kernel libre, es posible descargar el código fuente, configurarlo y comprimirlo. Además, esta tarea a priori compleja, es más sencilla de lo que parece gracias a las herramientas disponibles.

En este artículo compilaremos un kernel completamente funcional que reconozca todo el hardware básico del equipo y que sea a la vez lo más pequeño posible, es decir que incluya un vmlinuz lo más pequeño posible y que incorpore sólo los módulos imprescindibles.

El hardware básico incluye como mínimo el teclado, la interfaz de red y la consola gráfica (texto).

Pasos Previos:

Para este artículo, he usado el Kernel 6.6.3 (el más reciente en el momento que se realizó esto.)

Los Kernel puedes encontrarlos en su página: www.kernel.org

Si te falla a la hora de compilar, ve a la parte de errores de más abajo de esta página.

Empezamos!

Partiendo de tenerlo ya descargado y descomprimido, lo primero que he hecho ha sido un make oldconfig, que lo he sacado de make help | less para ver los targets.

make oldconfig

Cuando termina muestra esta cantidad:

Imagen del Post

Luego para reducir aún más el número de módulos, he hecho un make localmodconfig que comprueba la configuración del equipo y modifica el .config, es reducir el numero de modulos teniendo en cuenta la config de nuestra maquina en el archivo .config. Por otro lado, le he indicado que compile usando 7 cores (tengo 8 en la máquina donde lo hice).

make localmodconfig

Imagen del Post

Y para poder compilarlo como un paquete debian, y se pueda instalar correctamente (en los targets de compilación aparece):

time make -j 7 bindeb-pkg

Imagen del Post

Una vez que el proceso termine y se construya el paquete .deb mostrará lo siguiente:

Imagen del Post

Nota: si te falla este paso, ve a la sección de Solución de Errores de más abajo. En este punto hice un cambio de kernel como se ve en las imágenes, para continuar.

Cuando el proceso termina, tambien genera una serie de archivos deb en el directorio padre:

Imagen del Post

El siguiente paso es instalar todos los paquetes .deb generados. Y para ello he usado dpkg:

dpkg -i *.deb

Imagen del Post

Aquí termina y de paso enseño el kernel actual de la máquina antes del reinicio para que se reflejen los cambios. Como se ve es 6.1.0-13:

Imagen del Post

Luego de reiniciar el equipo, durante el arranque del grub en avanzado, se ve como aparece el nuevo kernel listo para usar.

Imagen del Post

El kernel nuevo arranca sin problemas, ya dentro del equipo he hecho un uname -r para que se vea que el kernel ha sido actualizado.

Imagen del Post

Y hasta aquí, como compilar un kernel a medida. Si que es verdad que esto es una forma muy por encima, y que hay métodos mejores y mas eficientes de ir revisando módulo a módulo del kernel como usar por ejemplo xconfig, esto es a modo de introducción.

Solución de Errores:

Si como me paso a mí, te empieza a dar problemas a la hora de compilar como por ejemplo estos errores en distintos kernels:

kernel 6.6

Imagen del Post

kernel 6.5

Imagen del Post

kernel 6.4

Imagen del Post

Este error ocurre porque si os fijais en la captura, el directorio donde se intenta compilar es linux-source-6.4, y el directorio no debe tener caracteres especiales como guiones, por eso es lo que da ese error. Para que no pase de nuevo, se puede renombrar el directorio con mv quitando los guiones, o como yo, que he pasado todos los archivos al directorio padre, es decir, al directorio superior, que en mi caso es /home/debian/kernel.

Hay otros posibles fallos, que suelen ser errores comunes como falta de dependencias. En otros casos el paquete dwarves suele ayudar ya que es una ayuda de depuración para compiladores.