
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:

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

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

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

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:

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

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:

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

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.

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

kernel 6.5

kernel 6.4

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.