Compilarea unui kernel Linux

Fiecare distributie are unelte specifice pentru a compila un kernel din surse. Voi incerca sa descriu aici compilarea unui kernel in Ubuntu/Debian . Vom folosi sursele nemodificate de pe www.kernel.org, vom aplica diferite patch-uri si vom genera pachetele deb pe care le putem da prietenilor s.a.m.d.


NOTA : In tutorial voi folosi aptitude cand este nevoie de instalarea unor pachete. Intrucat acesta nu se mai gaseste implicit in Ubuntu 10.10 inlocuiti aptitude cu apt-get, sau mai simplu, instalati aptitude.

Cod:

sudo apt-get install aptitude
Pentru inceput este nevoie de cateva unelte pentru procesul de compilare :


Cod:

sudo aptitude install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential
Apoi  ne autentificam ca root si putem incepe:

Cod:

sudo su -
cd /usr/src
Compilarea kernelului Linux se face in /usr/src , de aceea am navigat catre acel folder dupa autentificarea ca root.

Sa presupunem ca dorim sa compilam kernelul 2.6.36.1. Ca patch vom folosi patchsetul CK creat de Con Kolivas. Acesta include printre altele si un alt scheduler, BFS.

Se descarca sursele kernelului de pe www.kernel.org :

Cod:

wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.1.tar.bz2
Se descarca si patchsetul CK :

Cod:

wget -c http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.36/2.6.36-ck2/patch-2.6.36-ck2.bz2
NOTA : - cine doreste poate sa foloseasca patchul minune de 200 de linii. De asemenea se pot aplica si mai multe patchuri. Eu folosesc patchsetul CK in acest tutorial deoarece este mai simplu.

Avem sursele, avem patch-ul, deci sa incepem :

Cod:

tar zxvf linux-2.6.36.1.tar.bz2
ln -s linux-2.6.36.1 linux
cd /usr/src/linux
Am dezarhivat kernelul, am creat un symlink numit linux si am intrat in sursele kernelului. Acum sa aplicam patch-ul :

Cod:

bzip2 -dc /usr/src/patch-2.6.36-ck2.bz2|patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.36-ck2.bz2|patch -p1
Prima linie verifica daca patchul se poate aplica fara nicio eroare. Astfel nu riscati sa stricati sursele daca ati descarcat un patch gresit. Putin probabil, dar e bine sa fim precauti. A doua linie aplica patch-ul asupra surselor kernelului.

Acum vine partea cea mai dificila si anume configurarea noului kernel. Pentru inceput ar fi bine sa folositi configuratia kernelului pe care il rulati deja.

Cod:

cp /boot/config-`uname -r` ./.config
Apoi rulam :

Cod:

make menuconfig
Aceasta ne va aduce in fata meniul de configurare al noului kernel. Navigati pana la Load an Alternate Configuration File si alegeti .config . Dupa aceea puteti naviga prin optiuni si sa va costumizati kernelul dupa cum doriti. Puteti adauga suport pentru diferite componente, in caz ca kernelul cu care vine distributia le suporta, sau puteti elimina suportul pentru componentele pe care nu le aveti.

NOTADe asemenea puteti sa compilati un kernel super usor, care sa contina doar modulele pe care le folositi. Va rezulta un kernel cu 70-80 de module. Compilarea lui va dura extrem de putin si va fi foarte rapid. Se va instala mult mai repede decat un kernel obisnuit deoarece ramdiskul creat va contine putine module si va ocupa foarte putin spatiu pe disc.
In contrast kernelul cu care vine Ubuntu implicit contine cam 2600-2700 de module pe care probabil nu le veti folosi niciodata. Este un lucru bun insa, deoarece ei incearca sa acopere cat mai multe configuratii posibile folosind un singur kernel.

Dupa ce ati terminat de configurat kernelul, alegeti Exit si raspundeti cu Yes la intrebarea
Do you wish to save your new kernel configuration?

Apoi se poate incepe compilarea :

Cod:

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
Dupa --append-to-version puteti pune orice doriti pentru a identifica noul kernel, dar trebuie sa inceapa cu un minus (-) si sa nu contina spatii. Poate fi nickul de pe forum, etc. Veti avea kernel 2.6.36.1-nick .

Acum trebuie sa aveti rabdare, compilarea unui kernel poate dura cateva ore in functie de viteza procesorului si de configuratia aleasa. Dupa terminarea compilarii in /usr/src se vor gasi doua pachete deb. Unul va contine kernelul, iar celalalt va contine headerele necesare compilarii de module pentru kernel (gen vbox, nvidia).

Se instaleaza cele doua pachete :

Cod:

sudo dpkg -i linux*deb
Grub ar trebui sa detecteze noul kernel si sa genereze grub.cfg in consecinta, dar pentru orice eventualitate rulati si un :

Cod:

sudo update-grub
La reboot veti putea alege intre vechiul kernel, si noul kernel proaspat compilat. Daca totul este in regula puteti dezinstala vechiul kernel. Puteti chiar sa oferiti cele doua pachete deb si altor utilizatori sa beneficieze de munca voastra.
Sursa