Saltar a contenido

Compilación de un kernel Linux a medida

En esta práctica vamos a ver como compilar un kernel de linux a medida para adaptarlo a nuestras necesidades.


1. Obtener el código fuente del kernel

En primer lugar tendremos que saber la versión del kernel que estamos usando, para ello hacemos un

uname -r.

En mi caso estoy con esta versión:

Escenario

Sabiendo esto vamos a buscar el paquete linux-source, que no proporcionará las fuentes del kernel de

Escenario

Voy a instalar la versión del kernel correspondiente, mi caso la 6.1.55

Escenario

Por defecto se nos descargará un archivo comprimido en el directorio /usr/src, de aquí lo he movido a un directorio que he creado que será donde trabaje con el kernel

Escenario

Extraeremos el contenido del archivo comprimido, el cual nos generará un directorio.

Una vez descomprimido tendremos que configurarlo, indicándole las características de nuestra máquina para que se ajuste a nuestras necesidades. Para ello usaremos la herramienta make. Make es un comando que cuenta con varias opciones, podemos verlas todas si hacemos un make help:

Una de ellas es oldconfig, que es utilizado para actualizar el archivo de configuración del kernel de Linux con las nuevas opciones que se han agregado en la última versión del kernel.

El comando make oldconfig funciona de la siguiente manera:

  1. Primero, el comando compara el archivo de configuración del kernel actual con el archivo de configuración predeterminado de la última versión del kernel.
  2. A continuación, el comando identifica las diferencias entre los dos archivos de configuración.
  3. Finalmente, el comando le pregunta al usuario si desea habilitar o deshabilitar las nuevas opciones.

2. Crear el fichero .config

Para aplicar esto, que he explicado anteriormente copiaremos el archivo de configuración del kernel que actualmente estamos utilizando al directorio de trabajo con el nombre .config. Este archivo se encuentra típicamente en el directorio /boot

cp /boot/config-6.1.0-13-amd64 .config

Una vez que tenemos el archivo con la configuración del kernel que emplea nuestra máquina, ejecutamos el comando make oldconfig para restaurar dicha configuración.

Una vez generado el fichero .config podremos ver cuantos módulos del núcleo se usan dinámicamente y cuantos estáticamente

Escenario

Los módulos estáticos (y) siempre estarán cargados en memoria mientras que los dinámicos (m) se cargan cuando son necesarios.

Para hacer una primera aproximación y reducir el número de estos módulos podemos usar la opción localmodconfig de make.

El comando make localmodconfig es un comando utilizado para configurar el núcleo de Linux para una máquina específica. Por defecto, el núcleo de Linux incluye soporte para todos los dispositivos de hardware, pero este comando puede utilizarse para reducir el tamaño del núcleo y optimizarlo para su máquina.

El comando make localmodconfig funciona de la siguiente manera:

  1. Primero, el comando enumera todos los dispositivos de hardware conectados a su máquina.
  2. A continuación, el comando consulta el archivo de configuración del núcleo para determinar qué módulos de soporte se requieren para cada dispositivo.
  3. Finalmente, el comando actualiza el archivo de configuración del núcleo para habilitar solo los módulos necesarios.

Escenario

Durante el proceso tendremos la opción de incluir o descartar varios módulos. En mi caso los descartaré todos. Al terminar el proceso podremos comprobar que los módulos se han reducido bastante.

Escenario

3. Primera compilación

Antes de empezar a compilar tendremos que asegurarnos de que contamos con los paquetes necesarios para poder realizar el proceso.

Escenario

Comenzaremos la compilación con el siguientecomando:

make -j 11 binded-pkg

Con -j estamos especificando el número de núcleos que usaremos para la compilación, en mi caso tengo 12 así que usare 11. Esto podemos verlo con nproc

Escenario

Este proceso puede tardar un buen rato, al finalizar se crearán varios ficheros .deb que instalaremos para poder arrancar con ellos.

Escenario

Podemos ver cuanto espacio ocupa:

Escenario

Ahora lo instalaremos:

dpkg -i linux-image-6.1.55_6.1.55-1_amd64.deb

Si hacemos un:

Escenario

Podremos encontrarlo junto al resto de kernels y si reiniciamos podremos arrancar perfectamente. A partir de aquí volveremos a arrancar con el kernel original

4. Reducción del kernel

Para proseguir con la siguiente compilación empezaremos borrando los ficheros residuales generados de la anterior. Para ello usaremos make clean, el fichero .config se mantendrá.

Escenario

Con el objetivo de incrementar la seguridad, antes de llevar a cabo la reducción, efectuaremos una copia del archivo .config. Esto se realiza porque dicho archivo se modifica durante el proceso. En el caso de que eliminemos algún módulo esencial y el kernel deje de funcionar correctamente, tendremos la posibilidad de regresar a un estado anterior y volver a realizar pruebas.

4.1 Usando xconfig

Ya hemos visto algunas de las utilidades del comando make, la que usaremos ahora será la que utilicemos para reducir aún mas el kernel, ya que esta herramienta nos permite hacerlo de forma manual y gráficamente:

El comando make xconfig es un comando utilizado para configurar el kernel de Linux utilizando una interfaz gráfica de usuario.

Funciona de la siguiente manera

  1. Primero, el comando genera un archivo de configuración temporal.
  2. A continuación, el comando abre una interfaz gráfica de usuario que permite al usuario configurar el kernel.
  3. Finalmente, el comando guarda la configuración del kernel en el archivo .config.

Escenario

En esta reducción he quitado:

  • Modulos relacionados con tarjeta de sonido
  • Todos los módulos relacionados con AMD (mi procesador es intel)
  • Módulos relacionados con la tarjeta de red inalámbrica
  • Todo lo relacionado con virtualización.
  • Todo lo relacionado con soporte para servidores
  • Todo lo relacionado con tarjetas graficas dedicadas.

Una vez hayamos terminado de quitar los módulos podremos guardar los cambios y se escribiran en el fichero .config. Esto pisará el config de antes, por lo que será importante guardarlo como comentamos anteriormente. Una vez hecha la reducción podemos ver en cuantos módulos hemos dejado el kernel

Escenario

Podemos ver que se ha reducido en gran medida, pasaremos a compilarlo y comprobamos que arranca el sistema.

Escenario

Podemos ver los nuevos fichero que se han generado, compararemos el tamaño de los dos kernels el anterior y el nuevo.

Escenario

5. Comprobación

Vamos a comprobar que el kernel funciona:

  1. En primer lugar intentamos arrancar con el, podemos comprobar que el sistema arranca

  2. Ahora vemos que la tarjeta de red inalámbrica no se encuentra disponible (porque hemos desactivado el modulo)

Escenario

He hecho un uname -r para corroborar la versión del kernel que se está utilizando:

Escenario

Como podemos ver no se encuentra la tarjeta wlp que es la correspondiente a la interfaz de red

Ahora veremos que no podemos arrancar las máquinas virtuales, porque lo hemos desabilitado.

Escenario

La cantidad de módulos totales en las que he dejado el kernel ha sido: 1668 estáticos y 235 dinámicos. En total 1903

NOTA: Al final terminé quitando mas módulos:

  • Los de la camara integrada del portatil
  • Los de los leds del teclado
  • Los de la interfaz gráfica
  • Algunos mas relacionados con virtualización y con AMD

Los módulos quedaron en:

Escenario

Veremos una prueba de que arranca y funciona correctamente:

Escenario