Compilación de un Kernel linux a medida
Para empezar a compilar el kernel debemos crear un directorio donde trabajaremos, y además, saber cual es la versión de nuestra máquina.
Creamos el directorio con mkdir kernel
y comprobamos la versión con uname -r
.
Es necesario instalar la paquetería que contiene el compilador en C, make y herramientas que nos permitan modificar la configuración, para ello instalamos:
apt install linux-source build-essentials qtbase5-dev
Una vez lo tenemos todo, dentro del directorio kernel
, se descomprime el fichero .tar.xz
del kernel descargado de la siguiente url:
tar xf ~/Descargas/linux-6.0.9.tar.xz
Listamos el contenido del directorio resultado de la compresión:
nazare@ThousandSunny ~/kernel$ ls linux-6.0.9
arch CREDITS fs ipc lib mm scripts usr
block crypto include Kbuild LICENSES net security virt
certs Documentation init Kconfig MAINTAINERS README sound
COPYING drivers io_uring kernel Makefile samples tools
Podemos comprobar con el comando du -sh
el tamaño del directorio:
nazare@ThousandSunny ~/kernel$ du -sh linux-6.0.9
1,4G linux-6.0.9
Dentro del directorio podemos usar el comando make help
, este nos aportará ayuda dando información de las diferentes opciones que se pueden usar en la compilación.
Acto seguido realizamos make oldconfig
, el cual lee o compara el archivo de configuración antiguo. Este nos realizará varias preguntas donde nos dice las opciones que hay por defecto y si queremos o no mantenerlas en el .config.
Después realizaremos make localyesconfig
, con esto solo configura los módulos en uso en el momento de la creación del fichero de configuración convirtiendo los módulos dinámicos en estáticos. Se pueden comprobar los componentes estáticos y dinámicos con los comandos:
egrep '=y' .config | wc -l
egrep '=m' .config | wc -l
En principio cuenta con:
nazare@ThousandSunny ~/kernel/linux-6.0.9$ egrep '=y' .config | wc -l
1930
nazare@ThousandSunny ~/kernel/linux-6.0.9$ egrep '=m' .config | wc -l
3
Se realiza una primera compilación de prueba para asegurar su funcionamiento, con esto vemos en este caso la falta de un paquete:
nazare@ThousandSunny ~/kernel/linux-6.0.9$ time make -j $(nproc) bindeb-pkg
SYNC include/config/auto.conf.cmd
UPD include/config/kernel.release
sh ./scripts/package/mkdebian
dpkg-buildpackage -r"fakeroot -u" -a$(cat debian/arch) -b -nc -uc
dpkg-buildpackage: información: paquete fuente linux-upstream
dpkg-buildpackage: información: versión de las fuentes 6.0.9-1
dpkg-buildpackage: información: distribución de las fuentes bullseye
dpkg-buildpackage: información: fuentes modificadas por nazare <nazare@ThousandSunny>
dpkg-buildpackage: información: arquitectura del sistema amd64
dpkg-source --before-build .
dpkg-checkbuilddeps: fallo: Unmet build dependencies: libelf-dev:native
dpkg-buildpackage: aviso: Las dependencias y conflictos de construcción no están satisfechas, interrumpiendo
dpkg-buildpackage: aviso: (Use la opción «-d» para anularlo.)
make[1]: *** [scripts/Makefile.package:83: bindeb-pkg] Error 3
make: *** [Makefile:1558: bindeb-pkg] Error 2
make -j $(nproc) bindeb-pkg 1,51s user 0,53s system 99% cpu 2,050 total
Por lo que solo habría que instalarlo:
sudo apt install libelf-dev
Lo siguiente será volver a ejecutar la compilación:
time make -j $(nproc) bindeb-pkg
Tras realizar la compilación aparecen en el directorio kernel
los ficheros .deb
generados, para llevar un orden se edita el Makefile añadiendo EXTRAVERSION = -v1
:
nazare@ThousandSunny ~/kernel$ ls -la
total 24728
drwxr-xr-x 3 nazare nazare 259 nov 16 23:42 .
drwxr-xr-x 30 nazare nazare 4096 nov 17 00:20 ..
-rw-r--r-- 1 nazare nazare 203668 nov 16 23:09 1.config
drwxr-xr-x 26 nazare nazare 4096 nov 17 00:10 linux-6.0.9
-rw-r--r-- 1 nazare nazare 8561460 nov 16 23:42 linux-headers-6.0.9_6.0.9-1_amd64.deb
-rw-r--r-- 1 nazare nazare 15260368 nov 16 23:42 linux-image-6.0.9_6.0.9-1_amd64.deb
-rw-r--r-- 1 nazare nazare 1266496 nov 16 23:42 linux-libc-dev_6.0.9-1_amd64.deb
-rw-r--r-- 1 nazare nazare 5218 nov 16 23:42 linux-upstream_6.0.9-1_amd64.buildinfo
-rw-r--r-- 1 nazare nazare 1774 nov 16 23:42 linux-upstream_6.0.9-1_amd64.changes
Siempre que queramos realizar la instalación se usará el comando:
sudo dpkg -i linux-image...
Y para desinstalar:
sudo dpkg -P linux-image...
Hay que eliminarlo del GRUB ejecutando el comando update-grub
.
Tras esta prueba se va a ir editando el fichero .config, por lo que va a ser necesario mantener una copia del original la cual se ha guardado en el directorio kernel
.
Para editar .config se usa el comando make xconfig
con el que se nos abrirá una ventana como la siguiente donde podremos seleccionar los módulos que queramos dejar estáticos (✓), dinámicos (·) o directamente sin marcar que no se añadirán a la compilación:
Se vuelven a comprobar los módulos:
nazare@ThousandSunny ~/kernel/linux-6.0.9$ egrep '=y' .config | wc -l
1865
nazare@ThousandSunny ~/kernel/linux-6.0.9$ egrep '=m' .config | wc -l
26
Una vez editado se realiza la compilación y la instalación del nuevo kernel, desde el GRUB seleccionamos el nuevo kernel (aunque por defecto se inicia en la primera opción al encender la máquina). Al entrar, abrimos una terminal y se comprueba la ejecución del comando lsmod
, la versión con uname -r
y el funcionamiento de la red con un ping
:
Volvemos a nuestro kernel y en caso de querer seguir reduciendo se vuelve a repetir el proceso. Hay que tener en cuenta que despues de cada compilación hay que realizar un make clean
.
Comprobamos el tamaño del fichero .deb
:
nazare@ThousandSunny ~/kernel$ ls -lh | egrep linux-image-6.0.9-v2
-rw-r--r-- 1 nazare nazare 15M nov 17 02:08 linux-image-6.0.9-v2_6.0.9-v2-4_amd64.deb
Ficheros .config
Pincha aquí para ver los ficheros .config.