Debian: Recompilar el Kernel de Linux

Els kernels de Debian contenen moltíssimes funcionalitats i drivers perquè puguin funcionar correctament a qualsevol mena de hardware.
Alguns usuaris prefereixen recompilar el kernel per incloure només el que ells necessiten. D’aquesta manera, optimitzen la memòria i perquè reduint el nombre de drivers, redueixen el risc de tenir problemes de seguretat.

Pots trobar informació relacionada amb el kernel de Debian a Debian Linux Kernel Handbook.

Prerequisits

Linux conté tot el que necessites per recompilar el kernel. No obstant això, necessites instal·lar tres eines:

  • build-essential: té totes les eines necessàries per construir paquets.
  • libncurses5-dev: necessari per configurar correctament el kernel.
  • fakeroot: permet crear paquets de Debian sense necessitar permisos d’administrador.

Obtenir el codi font

Com que el codi font del kernel de Linux està disponible com a paquet, pots aconseguir-lo instal·lant el paquet linux-source-version. La comanda apt-cache search ^linux-source et permet obtenir tot el llistat de les últimes versions del kernel.

Per aquest exemple, suposaré que tens la 4.9:

nadki@debian:~$ sudo apt install linux-source-4.9
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  bc libreadline7
Suggested packages:
  libncurses-dev | ncurses-dev libqt4-dev
The following NEW packages will be installed:
  bc libreadline7 linux-source-4.9
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 95.4 MB of archives.
After this operation, 95.8 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

[...]

nadki@debian:~$ ls /usr/src
linux-config-4.9  linux-patch-4.9-rt.patch.xz  linux-source-4.9.tar.xz

El fitxer .tar.xz és un arxiu comprimit que conté el codi font del kernel. Has d’extreure’n el contingut a un nou directori, no directament a /usr/src/, sinó a ~/kernel/, ja que no cal que tinguin permisos especials per compilar-lo.

nadki@debian:~$ mkdir ~/kernel; cd ~/kernel

nadki@debian:~/kernel$ tar -xaf /usr/src/linux-source-4.9.tar.xz

Configurar

Ara toca configurar el kernel segons les teves necessitats. El sistema està instal·lat a /boot. Si vols reconfigurar tot des de zero, és suficient com que facis una còpia de /boot/config-version. La versió ha de ser la mateixa que la del kernel actual, la pots trobar amb la comanda uname -r.

Engantxa la copia a la carpeta .config:

nadki@debian:~$ cp /boot/config-4.9.0-kali1-amd64 ~/kernel/linux-source-4.9/.config

Alternativament, com que el kernel ofereix configuracions per defecte a arch/arch/configs/*_defconfig, pots posar la configuració que has seleccionat a on correspon amb la comanda make x86_64_defconfig o make i386_defconfig, segons l’arquitectura del teu ordinador.

Ara ja pots passar al següent apartat si vols. Si vols fer canvis o decideixes reconfigurar-ho tot, hauràs d’invertir temps configurant el kernel. Hi ha diverses interfícies dedicades que pots utilitzar amb la comanda make.

make menuconfig compila i executa la interfície de configuració del kernel, que et permet navegar a través de totes les opcions que té el kernel. Pots canviar el valor amb la tecla espai, validar l’opció escollida amb enter i tancar amb exit.

Altres interfícies tenen característiques similars, però les interfícies són més modernes, com make xconfig o make gconfig.

Si vols utilitzar un .config generat per una versió antiga del kernel, has d’executar make oldconfig que et permet adaptar la configuració antiga a la nova. Si vols utilitzar el valor per defecte a totes les noves opcions, pots utilitzar make olddefconfig. Amb make oldnoconfig farà que els valors a les preguntes siguin tots negatius.

Compilar

Si ja has compilat un kernel al mateix directori i vols recompilar-lo des de zero, hauràs d’executar la comanda make clean per eliminar els fitxers ja compilats. make distclean elimina encara més fitxers, incloent-hi el fitxer .config, així que assegura’t de fer una còpia de seguretat primer.

Una vegada tinguis preparada tota la configuració del kernel, simplement executa make deb-pkg, que generarà 5 paquets de Debian en format .deb:

  • linux-image-version: conté l’imatge del kernel i mòduls associats
  • linux-headers-version: conté les capçaleres necessàries per compilar les mòduls externs
  • linux-firmware-image-version: conté els fitxers del firmware necessaris per a alguns drivers
  • linux-image-version-dbg: conté els símbols de debug de la imatge del kernel i els seus mòduls
  • linux-libc-dev: conté les capçaleres necessàries per a algunes llibreries, com GNU’s C (glibc).

La versió es defineix concatenant la versió upstream (definida per les variables VERSION, PATCHLEVEL, SUBLEVEL, i EXTRAVERSION del Makefile), el paràmetre de configuració LOCALVERSION i la variable d’entorn LOCALVERSION. La versió del paquet utilitza el mateix string afegint al final el valor de la revisió, que és incremental i s’emmagatzema a version. Sobreescrivint la variable global KDEB_PKGVERSION pots indicar manualment la versió:

nadki@debian:~$ make deb-pkg LOCALVERSION=-custom KDEB_PKGVERSION=$(make kernelversion)-1

[...]

nadki@debian:~$ ls ../*.deb
../linux-headers-4.9.0-kali1-custom_4.9.2-1_amd64.deb
../linux-image-4.9.0-kali1-custom_4.9.2-1_amd64.deb
../linux-image-4.9.0-kali1-custom-dbg_4.9.2-1_amd64.deb
../linux-libc-dev_4.9.2-1_amd64.deb

L’últim pas que queda per compilar el kernel és instal·lar els paquets amb dpkg -i FITXER.deb. És obligatori que instal·lis el paquet linux-image. Només has d’instal·lar linux-headers si tens algun mòdul extern que vols compilar. Els altres paquets no acostumen a ser necessaris.

Exemple: recompil·lar el Kernel

Aquest exemple veuràs com recompilar el kernel per afegir-hi una eina anomenada likwid i una actualització de Kernel GCC.

Primer, instal·la likwid:

kali@kali:~$ sudo apt-get install likwid

# Busca quin processador tens
kali@kali:~$ likwid-topology -g | head

# Executa un benchmark al socket 0
kali@kali:~$ likwid-bench -t copy -w S0:100kB:1

Pots trobar l’optimització de la CPU del kernel aquí: enllaç. Has d’instal·lar les dependències:

kali@kali:~$ sudo apt install build-essential libncurses5-dev fakeroot

# Busca la versió actual de linux-source
kali@kali:~$ apt-cache search ^linux-source

kali@kali:~$ sudo apt install linux-source-5.10

Extreu el codi font del kernel i copia la configuració actual:

kali@kali:~$ mkdir ~/kernel; cd ~/kernel

kali@kali:~/kernel$ sudo tar -xaf /usr/src/linux-source-5.10.tar.xz

kali@kali:~/kernel$ sudo cp /boot/config-5.10.0-kali7-amd64 ~/kernel/linux-source-5.10/.config

Executa menuconfig a la versió no actualitzada del kernel:

kali@kali:~/kernel$ cd linux-source-5.10

kali@kali:~/kernel/linux-source-5.10$ sudo make menuconfig

Comprova les opcions del fitxer config. Guarda i descarrega i instal·la l’actualització:

kali@kali:~/kernel/linux-source-5.10$ cd ~/kernel

kali@kali:~/kernel$ wget https://raw.githubusercontent.com/graysky2/kernel_compiler_patch/master/more-uarches-for-kernel-5.8%2B.patch

kali@kali:~/kernel$ cd linux-source-5.10/

kali@kali:~/kernel/linux-source-5.10$ sudo patch -p1 < ../more-uarches-for-kernel-5.8+.patch

kali@kali:~/kernel/linux-source-5.10$ sudo make menuconfig

Torna a anar al fitxer de configuració i revisa les opcions. Escull el tipus de CPU i guarda el fitxer. Ara només queda compilar el kernel:

kali@kali:~/kernel/linux-source-5.10$ export CONCURRENCY_LEVEL=5 #Número de CPUs que tens +1

kali@kali:~/kernel/linux-source-5.10$ sudo make deb-pkg LOCALVERSION=-custom KDEB_PKGVERSION=$(make kernelversion)-1

Finalment, crea una nova branca:

# Busca el processador que tens
kali@kali:~/kernel/linux-source-5.10$ likwid-topology -g | head

# Executa un benchmark al socket 0
kali@kali:~/kernel/linux-source-5.10$ likwid-bench -t copy -w S0:100kB:1

Deixa un comentari