Índex
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