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:
Sabiendo esto vamos a buscar el paquete linux-source, que no proporcionará las fuentes del kernel de
Voy a instalar la versión del kernel correspondiente, mi caso la 6.1.55
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
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:
- 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.
- A continuación, el comando identifica las diferencias entre los dos archivos de configuración.
- 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
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:
- Primero, el comando enumera todos los dispositivos de hardware conectados a su máquina.
- 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.
- Finalmente, el comando actualiza el archivo de configuración del núcleo para habilitar solo los módulos necesarios.
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.
3. Primera compilación
Antes de empezar a compilar tendremos que asegurarnos de que contamos con los paquetes necesarios para poder realizar el proceso.
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
Este proceso puede tardar un buen rato, al finalizar se crearán varios ficheros .deb que instalaremos para poder arrancar con ellos.
Podemos ver cuanto espacio ocupa:
Ahora lo instalaremos:
dpkg -i linux-image-6.1.55_6.1.55-1_amd64.deb
Si hacemos un:
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á.
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
- Primero, el comando genera un archivo de configuración temporal.
- A continuación, el comando abre una interfaz gráfica de usuario que permite al usuario configurar el kernel.
- Finalmente, el comando guarda la configuración del kernel en el archivo
.config
.
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
Podemos ver que se ha reducido en gran medida, pasaremos a compilarlo y comprobamos que arranca el sistema.
Podemos ver los nuevos fichero que se han generado, compararemos el tamaño de los dos kernels el anterior y el nuevo.
5. Comprobación
Vamos a comprobar que el kernel funciona:
-
En primer lugar intentamos arrancar con el, podemos comprobar que el sistema arranca
-
Ahora vemos que la tarjeta de red inalámbrica no se encuentra disponible (porque hemos desactivado el modulo)
He hecho un uname -r
para corroborar la versión
del kernel que se está utilizando:
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.
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:
Veremos una prueba de que arranca y funciona correctamente: