Cómo compilar el kernel de Linux en Ubuntu

Compilar el kernel de Linux en Ubuntu

Las razones para compilar el kernel de Linux en Ubuntu, y en general, son más para optimizar su rendimiento cuando lo tenemos funcionando como servidor, aunque también lo es para adicionarle o activarle características.

Un kernel genérico intenta funcionar en miles de tipos de computadores con miles de opciones de hardware. Entonces, podemos contemplar la opción de compilar el kernel de Linux para retirar de su núcleo el soporte a hardware innecesario para nuestros propósitos, sobre todo en servidores. Así que el soporte a hardware tales como cámaras web, bluetooth, tablets digitalizadoras y accesorios de ese tipo, pueden ser perfectamente removibles de Linux en su fase de compilación. Aquí las tres razones más comunes:

  • Mayor rapidez en el arranque del sistema. Dado que el kernel sólo tiene que probar el hardware que realmente está en el sistema el tiempo que necesitará para arrancar se reducirá visiblemente.
  • Menor uso de memoria. Generalmente un kernel personalizado utiliza menos memoria que un kernel genérico, lo cual es importante ya que el kernel debe encontrarse siempre en memoria real. Por ésta razón un kernel personalizado puede ser de gran utilidad en sistemas con una cantidad limitada de memoria RAM.
  • Hacer funcionar hardware específico. Un kernel personalizado le permite añadir al sistema dispositivos como tarjetas de sonido, que no están incluidas en el kernel genérico.

Compilar el kernel para optimizar el sistema


Este ejercicio práctico surge de la necesidad de optimizar en un 2% el rendimiento de la red de un servidor Linux, ejercicio que profundiza aún más la optimización de su subsistema de red con la teoría aquí descrita. Entonces he usado el kernel de Linux 6.8.0 que viene con la distro Ubuntu 24.04 server para este ejemplo.

Para ser breve, porque este tema es bien extenso, decimos que en Linux tenemos dos sistemas que gestionan el tiempo de ejecución de los procesos: el scheduler y el System Timer Tick. El scheduler asigna el tiempo de ejecución y la prioridad de los procesos. Con el System Timer Tick por el contrario se controla, y de ser necesario, se pone en espera al proceso si cumplió con el presupuesto de tiempo que le asignó el scheduler.

En el hardware moderno de los equipos tenemos un chip llamado Platform Controller Hub (PCH), que contiene un circuito auxiliar llamado ‘temporizador de eventos de alta precisión (HPET)’ que es un generador de pulsos, y Linux usa esos pulsos como interrupción para controlar el tiempo presupuestado a los procesos en ejecución.

Así que Linux cuenta con un recurso llamado Timer Frecuency, que define el periodo de los pulsos que genera HPET. Ese Timer Frecuency programa la duración de ese periodo por medio de un parámetro llamado HZ. Como el Kernel no se puede interrumpir asimismo, durante el proceso de booteo del sistema, Linux programa a ese HPET con el valor de HZ para definir el tiempo de esos pulsos, y así se define la fecuencia con que Linux entra (interrumpe) a medir los tiempos de los procesos. Un valor de HZ en 1000 hace que Linux interrumpa con más frecuencia, y un valor de HZ en 100 hace que interrumpa con menos frecuencia.

Cómo compilar el kernel de Linux en Ubuntu

Como un servidor que maneja enrutamiento de paquetes de red y filtrado web debe estar enfocado en el procesamiento de esos paquetes, entones fijamos el valor de HZ en 100 para que los paquetes fluyan sin tanta interrupción (un valor de 1000 en HZ se acopla más a sistemas con un uso más amplio en el espacio de usuario, por los navegadores, ofimática, bluetooth, wifi, etc).

Compilar el kernel de Linux en Ubuntu


Recomiendo este método para un kernel de Ubuntu, porque modifica su configuración mediante el sistema de empaquetado propio de esta distro. Entonces comenzamos:

1- Habilitar repositorios del código fuente de Linux. Eso lo hacemos adicionando el texto deb-src en los tipos de repositorios.:

sudo nano /etc/apt/sources.list.d/ubuntu.sources

Actualizamos: sudo apt update

2- Instalar dependencias:

sudo apt build-dep -y linux linux-image-unsigned-$(uname -r)
sudo apt install -y fakeroot llvm libncurses-dev dwarves

3- Creamos un directorio de trabajo:

mkdir -p ~/kernel-build
cd ~/kernel-build

4- Descargamos el código fuente del kernel:

apt source linux-image-unsigned-$(uname -r)

5- Entramos al directorio linux-6.8.0 y ejecutamos:

chmod a+x debian/scripts/* 
chmod a+x debian/scripts/misc/* 
fakeroot debian/rules clean

6- Para que nuestro kernel no se llame 6.8.0-generic (para evitar conflictos y confusiones), podemos diferenciarlo cambiandole el número ABI:

nano debian.master/changelog

En la primera línea cambiamos el número ABI, por ejemplo:

linux (6.8.0-138.138) noble; urgency=medium (antes)
linux (6.8.0-999.138) noble; urgency=medium (ahora)

7- Ejecutamos el siguiente comando para entrar al menú de configuración del kernel para la modificación de HZ:

fakeroot debian/rules editconfigs

Cómo compilar el kernel de Linux en Ubuntu

En dicho menú buscamos el submenú de Processor type and features y luego entramos en Timer frecuency … 

Seleccionamos 100 para HZ, guardamos y salimos:

Cómo compilar el kernel de Linux en Ubuntu

Y ahora sí, a compilar!

fakeroot debian/rules clean
fakeroot debian/rules binary
play-sharp-fill

Este proceso toma su tiempo. Dependiendo de la máquina y de los módulos que hayamos activado, o desactivado, puede tomar minutos ó hasta horas. Para este caso en mi máquina con AMD Ryzen 5 y RAM  de 16 GB, el proceso tomó 2 horas.

Al final del proceso de compilanción (sin errores), instalamos los paquetes generados:

cd ..
ls *.deb
sudo dpkg -i linux-headers-6.8.0-999*.deb linux-image-unsigned-7.0.0-999-generic*.deb linux-modules-7.0.0-999-generic*.deb

Reiniciamos, y listo.

sudo init 6

Felicitaciones! Ya tenemos nuestro kernel de Linux compilado.

Aquí puedes ver cómo convertir a Linux en un router.

Convertir a Linux en un router

Recomendaciones


El éxito de la compilación del kernel depende mucho del buen estado del hardware, sobre todo de la RAM.

Para esta tarea recomiendo una RAM de al menos 8 GB y en buen estado, swap de 8 GB y al menos 40 GB de espacio libre en el almacenamiento interno, porque el proceso genera objetos compilados, símbolos de depuración, documentación, temporales, variantes y artefactos del kernel que pueden llegar a ocupar todo ese espacio.

También debemos validar que nuestra máquina tenga conectividad a https://launchpad.net/

La compilación de Linux puede tomar horas de ciclos, según la configuración del hardware que tengamos. Con un Intel i7 de octava generación puede llevar más de 5 horas. Por eso su creador, el señor Linus Tolvards, compila a Linux en una máquina con procesador AMD Ryzen Threadripper de 32 núcleos y 64 hilos, y memoria RAM de 64 GB con ECC.

Comparte esto en
Publicado en GNU Linux.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *