Acest post NU este destinat incepatorilor. Este destinat in special celor care vor sa stoarca si ultima picatura de performanta din sistemul lor, celor care vor sa invete, celor care au prea mult timp liber si vor sa il umple cu ceva.
In mod normal, nu ai nevoie aproape niciodata sa compilezi/recompilezi un kernel. Asta pentru ca in aproape toate cazurile distributiile Linux vin cu un kernel generic, compilat astfel incat sa acopere cat mai multe configuratii hardware posibile. Singurele motive pentru recompilarea kernelului ar fi in scop educativ, daca vrei sa inveti ceva, sau in scop de a activa un hardware exotic pe care kernelul il suporta, dar distributia ta nu l-a activat sau pentru a adauga functionalitati care nu sunt incluse in kernelul vanilla, gen BFS CPU Scheduler, BFQ I/O Scheduler, UKSM, etc.
In acest post voi incerca sa arat cum se poate compila un kernel minimalist, care sa acopere doar o singura configuratie hardware, a TA - pentru viteza, si vei invata ceva util, vei sti exact de ce are nevoie sistemul tau pentru a functiona si vei putea sa optimizezi kernelul la nivel de procesor.
Personal intotdeauna adaug in kernelul meu BFS, BFQ, UKSM si optiuni de optimizare la nivel de procesor. Asta pentru ca sistemul meu este un desktop, si am nevoie ca kernelul sa se comporte ca pentru un desktop si sa imi ofere viteza pe care o vreau.
De mentionat ca fiecare distributie are propriile metode de a compila un kernel, dar acest post nu face obiectul de a explica ceva directionat pe o anume distributie. Voi explica in mod generic care sunt pasii, iar tu, va trebui sa te documentezi si sa adaptezi in functie de distributia ta. Asta daca vrei sa obtii pachete pe care sa le reinstalezi la o eventuala reinstalare a sistemului. Altfel vei fi nevoit sa reiei procesul de fiecare data cand reinstalezi sistemul
In fine, sa incepem. In primul rand, ai nevoie de sursele kernelului. Le poti obtine de pe www.kernel.org . Le descarci si le dezarhivezi in /usr/src . Nu are rost sa specific ca trebuie sa ai drept de root pe sistem.
sudo su - cd /usr/src wget -c https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.12.20.tar.xz unxz linux-4.12.20.tar.xz tar xvf linux-4.12.20.tar ln -s linux-4.12.20 linux cd /usr/src/linux
Ai descarcat sursele, le-ai dezarhivat, ai creat un link simbolic numit linux catre aceste surse si ai intrat in directorul care contine sursele kernelului.
In acest moment poti sa adaugi diferite patch-uri pentru kernelul care urmeaza sa il compilezi asa cum l-a gandit Linus Torvalds. Sa zicem totusi ca ai un patch numit xxx.patch si vrei sa il aplici asupra surselor pe care tocmai le-ai pregatit.
Ar fi de preferat, pentru comoditate sa ai patch-urile tot in /usr/src
.
cat /usr/src/xxx.patch | patch -p1 --dry-run
Optiunea --dry-run
doar simuleaza operatiunea, astfel vei fi sigur ca nu strici sursele si ca patch-ul este compatibil cu versiunea de kernel aleasa.
Daca simularea a avut succes, poti sa aplici la propriu patch-ul:
cat /usr/src/xxx.patch | patch -p1
Acum trebuie sa configurezi kernelul ce urmeaza sa il instalezi. Este o alegere buna sa pornesti de la fisierul de configurare pe care il foloseste kernelul cu care a venit distributia ta.
Pentru asta va trebui sa il copiezi in sursele kernelului:
cp /boot/config-`uname -r` ./.config
In acest moment kernelul este configurat aproape identic cu ceea ce rulezi deja. Dar tu nu vrei asta, ci vrei un kernel minimalist care sa ruleze doar pe configuratia TA. Prin urmare va trebui sa elimini foarte multe optiuni, va trebui sa dezactivezi cateva mii de drivere de care oricum nu ai nevoie.
In primul rand, cuplezi la calculator orice hardware ai. Si aici ma refer la adaptoare bluetooth, camere web, imprimante, stickuri de memorie s.a.m.d. Astfel vei fi sigur ca driverele necesare vor fi incarcate in memorie. E posibil sa ai nevoie si de alte drivere, pe care vei fi nevoit sa le incarci manual folosind modprobe.
In al doilea rand, avand toate driverele necesare configuratiei tale incarcate in memorie, rulezi comanda:
make localmodconfig
Aceasta comanda va dezactiva automat toate miile de drivere pe care distributia ti le-a bagat pe gat. Astfel vei avea kernelul configurat doar pentru masina ta. De mentionat ca pe viitor daca schimbi adaptorul bluetooth de exemplu, va trebui sa recompilezi kernelul, pentru ca e posibil ca acesta sa nu functioneze neavand driverul necesar.
In acest moment poti sa mai tunezi din optiunile kernelului folosind comanda:
make nconfig
O sa iti apara un meniu intuitiv, iar navigand prin el vei putea activa/dezactiva optiuni si drivere pentru noul kernel. Ai grija ce dezactivezi, pentru ca s-ar putea ca noul kernel sa nu mai booteze. De obicei make localmodconfig face o treaba foarte buna , deci poti sa sari pentru moment peste acest pas, asta pana mai prinzi ceva experienta. Iti recomand totusi sa treci prin optiunile meniului de configurare si sa incerci sa le intelegi. Macar de curiozitate.
Urmatorul pas ar fi compilarea propriu-zisa a kernelului. Tasteaza urmatoarea comanda:
make -j4
Unde 4 este numarul de core-uri pe care le are procesorul tau. Daca ai un dual-core, atunci va fi -j2 , ai prins ideea. In cateva minute kernelul va fi compilat, asta pentru ca este foarte minimalist. Compilarea normala ar dura cateva ore in functie de puterea procesorului tau.
Dupa compilare, va trebui sa instalezi modulele kernelului:
make -j4 modules_install
Imaginea kernelului compilat o vei gasi in /usr/src/linux/arch/x86/boot
sub numele bzImage . Copiaza acest fisier in /boot si numeste-l linux-4.12.20 sau vmlinuz-4.12.20 . Este o idee buna sa il copiezi sub un nume similar cu cel pe care l-a ales distributia ta, pentru comoditate si pentru a fi sigur ca bootloaderul, grub, il detecteaza.
Va trebui de asemenea sa generezi si un initrd
, un fisier special care monteaza /root
si ajuta kernelul sa booteze.
Foloseste manualul distributiei pentru a afla cum faci asta. In ultima instanta va trebui sa regenerezi meniul grub pentru a boota de pe noul kernel.