Jump to content
PingLord

Kernel ( Ce este Kernelul si Recompilarea de Kernel )

Recommended Posts

Compilare Kernel

Introducere, necesitate compilare

Kernelul sistemului de operare Linux reprezinta componenta cea mai importanta a acestuia. Toata functionalitatea sistemului este realizata de kernel.

Dintre cele mai importante functii ale kernelului Linux amintim:

• alocarea resurselor diferitelor procese (o parte din RAM, o parte din CPU etc);

• contine drivere pentru toate dispozitivele hardware de la placa de baza, placa video, placa de sunet, placa de retea, monitor, tastatura etc;

• lucrul cu sistemele de fisiere;

• orice operatie de creare, stergere, citire, modificare fisier sau director este realizata de o functie din Kernel;

• firewall & routing;

• QoS;

Un upgrade de kernel se poate face in 2 moduri:

1. Folosind o versiune de kernel direct compilata pentru o anumita distributie si arhitectura.

In acest caz noul kernel se instaleaza dintr-un fisier RPM sau DEB.

Aceasta metoda are numeroase dezavantaje printre care cele mai importante sunt:

• kernelul este compilat pentru o arhitectura generica. Acesta nu este optimizat special pentru tipul nostru de procesor, placa de baza etc. Astfel performantele vor fi mai scazute;

• facilitatile oferite sunt generice si anume acesta include facilitati necesare majoritatii utilizatorilor;

Exemplu: poate include suport pentru RAID, iar serverul nostru nu foloseste RAID, nu va include suport pentru un firewall la nivel de aplicatie, iar necesitatile serverului nostru presupun folosirea unui astfel de firewall, nu va include driver pentru o anumita placa de retea wireless pe care o folosim daca aceasta este putin mai "deosebita" etc;

• kernelul cuprinde multe optiuni nefolositoare in cazul nostru particular;

Exemplu: va cuprinde drivere pentru majoritatea placilor de baza, a placilor de retea, diferite aplicatii pe care nu le folosim niciodata etc;

• dupa aparitia unei noi versiuni de kernel dureaza o perioada de timp pana cand apare forma sa compilata ca RPM sau DEB. In acest fel exista un "vulnerability window" in care nu suntem protejati impotriva ultimelor vulnerabilitati sau pur si simplu kernelul nostru nu acopera diferite buguri;

2. Compiland direct sursele kernelului

Aceasta este metoda preferata in cele mai multe cazuri.

Dorim sa compilam un nou kernel in urmatoarele conditii:

a) vrem sa includem drivere pentru hardware nou aparut sau pentru hardwareul ale carui drivere nu sunt incluse in versiunea standard de kernel care vine cu distributia;

B) includerea de optiuni pentru diferite aplicatii sau servicii (QoS - HTB, firewall la nivel de aplicatie, criptografie, LVM, RAID etc);

c) vrem sa acoperim diferite bug-uri sau probleme de securitate. In medie apare o noua versiune de kernel la circa 2 saptamani. Aceasta acopera bug-urile din versiunea trecuta descoperite intre timp;

d) dorim un "fine tuning" al kernelului exact pentru configuratia hardware a serverului nostru (tipul nostru de procesor in special);

Indiferent de distributia de Linux folosita, kernelul este acelasi. Acesta este marca inregistrata a lui Linus Torvalds, iar dezvoltarea sa este supravegheata si avizata de acesta.

Structura Kernel Linux

Un kernel se poate gasi in 2 forme:

1. Modular

Un kernel modular se caracterizeaza prin faptul ca intreaga sa functionalitate nu este inclusa in acesta ci in alte fisiere numite module si care se pot incarca/descarca in/din kernel in timp ce acesta este incarcat in RAM si ruleaza.

Exemplu: Kernelul nu include suport pentru ipv6 sau pentru ntfs. Suportul pentru ipv6 sau ntfs se gaseste in fisiere separate numite module. Acestea se pot incarca in kernel in momentul in care avem nevoie de respectiva functionalitate respectiv dorim sa folosim ipv6 sau sau sa montam o partitie ntfs.

2. Nemodular

Un kernel nemodular se caracterizeaza prin faptul ca intreaga sa functionalitate este inclusa in acesta. Nu se pot incarca/descarca module din kernelul care ruleaza.

IMPORTANT !!

Kernelul de Linux este reprezentat fizic printr-un SINGUR fisier care se gaseste de obicei /boot sub numele de /boot/vmlinuz-versiune

Acesta reprezinta imaginea compilata si compresata a kernelului care se incarca in RAM la butare si doar la butare.

Fiecare optiune pe care kernelul o ofera poate fi compilata ca parte integranta a kernelului sau ca modul.

LKM (Loadable Kernel Modules) sunt fisiere binare care contin cod folosit pentru a extinde functionalitatea kernelului care ruleaza (the base kernel). Acestea se compileaza odata cu kernelul.

Comenzi folosite pentru listare/incarcare/descarcare module din kernel:

lsmod - listeaza modulele incarcate in memorie

Pentru a incarca/descarca module in/din kernel se foloseste comanda modprobe (fisierul de configurare este /etc/modprobe.conf)

modprobe nume_modul - incarca un modul

-l = listeaza toate modulele disponibile (nu neaparat incarcate in kernel)

-r module_name = descarca un modul din kernel

Exemplu: modprobe ip6_tunnel

Modulele se gasesc fizic pe hard disk in /lib/modules intr-un director cu numele kernelului si intr-o categorie anume.

Compilarea Kernelului

De cele mai multe ori compilarea kernelului se realizeaza cu ajutorul unui ghid de compilare. Exista mai multe astfel de ghiduri si anume pasi care trebuie urmati pentru compilarea kernelului. Toate acestea au in comun aceiasi pasi importanti.

Ghidul asta de compilare este testat cu succes pe mai multe distributii Linux.In exemplul urmator am folosit Fedora.

Etapa 1:

Download ultima versiune de kernel de la www.kernel.org,decomprimarea si dezarhivarea sa intr-un director la alegere.Dupa decomprimarea arhivei ne mutam in directorul nou creat.

!!!! Toate comenzile se vor executa in directorul care contine sursele kernelului.Pana la ultima etapa si anume restartarea PC-ului / Serverului ramanem in acest director.

EXEMPLU:


cd /home/pinglord

wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.12.tar.bz2
tar -xjvf linux-2.6.25.12.tar.bz2

tar -xjvf linux-2.6.25.12.tar.bz2

Etapa 2

Kernelul foloseste un fisier de configurare numit .config. Acesta se numeste "kernel configuration starting point".

La acest pas copiem fisierul de configurare .config al kernelului care ruleaza in directorul cu sursele kernelului abia downloadat si care se doreste a fi compilat.

Fisierul .config pentru kernelul care ruleaza se gaseste cel mai probabil in directorul /usr/src/kernels/VERSIUNE_KERNEL_CARE_RULEAZA sau in directorul /boot

Pe Fedora Core 9 fisierul de configurare al kernelului care ruleaza este /boot/config-2.6.25-14.fc9.i686 pentru versiunea 2.6.25.14

Compilarea unui nou kernel presupune pornirea de la o baza de facilitati si anume cele oferite de kernelul care ruleaza. Practic pentru noul kernel adaugam facilitati noi sau renuntam la facilitati in raport cu "running kernel". Acesta este motivul pentru care avem nevoie de .config al kernelului care ruleaza.

Daca .config nu exista in directoarele specificate mai sus, se poate downloada un kernel in format RPM pentru distributia si arhitectura respectiva si i se foloseste fisierul .config.

Fisierul de configurare al kernelului este format din optiunile care vor fi incluse in kernel, una pe cate o linie urmate de y (yes) daca se compileaza in imaginea kernelui sau m daca se compileaza ca modul.

Exemplu :



cp /boot/config-2.6.25-14.fc9.i686 /home/pinglord/linux-2.6.25.12
cd /home/pinglord/linux-2.6.25.12
mv config-2.6.25-14.fc9.i686 .config

Etapa 3

Executam comanda:


make oldconfig

Rularea comenzii determina aparitia unei interfete text care foloseste fisierul de configurare de la kernelul vechi ( .config) pe care il modifica astfel incat sa introduca noile optiuni din kernelul nou care se compileaza, in vechiul fisier de configurare.

Etapa 4

Executam comanda :

make menuconfig

Comanda make gconfig reprezinta o alternativa grafica la make menuconfig

Rularea comenzii determina aparitia unei interfete text sau grafice pentru a alege optiunile ce vor fi incluse in kernel la compilare.

IMPORTANT!

Acesta este momentul in care trebuie sa adaugam optiunile pe care le dorim in kernel, sa le scoatem pe cele in plus etc. Pentru compilarea kernelului in cele mai optime conditii este nevoie de o cunoastere foarte buna a hardware-ului hostului.

Etapa 5

Executam comanda:

make

Se poate executa si cu parametru -j daca exista procesor capabil.Cititi manualul de la make pentru optiunea -j

Etapa 6

Executam:


cp System.map /boot/System.map-2.6.25.12

ln -sf /boot/System.map-2.6.25.12 /boot/System.map

Un simbol reprezinta un nume de variabila sau un nume de functie.

System.map reprezinta un tabel cu echivalenta dintre numele simbolurilor si adresele acestora din memorie si este folosit de kernel.

Etapa 7

Executam

make modules_install

Comanda de mai sus instaleaza modulele.

Etapa 8

Executam :

cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.25.12

In functie de arhitectura directorul x86 poate sa fie i386.

bzImage vine de la "big zImage" - Imaginea kernelului comprimata cu algoritmul zlib

Cu toate ca numele nu este important, prin conventie se foloseste denumirea de vmlinuz sau bzImage pentru imaginea binara comprimata a kernelului.

Intreg kernelul se gaseste intr-un singur fisier si anume fisierul bzImage sau vmlinuz. Sursele kernelului nu mai sunt necesare si pot fi sterse.

Etapa 9

Executam :

/sbin/mkinitrd /boot/initrd-2.6.25.12.img 2.6.25.12 /CODE]pentru RedHad/Fedora/SuSE

sau

[CODE]mkinitramfs -o /boot/initrt-2.6.25.12.img 2.6.25.12

pentru Ubuntu/Kubuntu/etc

Exemplu: Se doreste suport pentru RAID, LVM sau SATA sau pentru alte functionalitati low level. Comanda de mai sus creaza un RAM Disk care contine modulele necesare la butarea sistemului.

Primul argument al comenzii mkinitrd este fisierul de tip RAM Disk care se va crea. Al doilea argument si anume 2.6.25.12 este numele directorului din /lib/modules in care se gasesc modulele noului kernel. Automat in fata argumentului 2 se pune /lib/modules/

Etapa 10

Se modifica bootloaderul si anume grub.conf pentru a adauga noul kernel.

Daca se foloseste Grub2 se ruleaza:

 update-grub2 

Kernelul compilat nu este inca folosit de sistem. Acesta va fi folosit doar dupa restartarea calculatorului si alegerea sa din lista de kernele din meniul Grub. Referirea la vechiul kernel din fisierul de configurare al Grub-ului NU se sterge !

Posibilitatea ca sistemul sa nu mai buteze datorita unei erori sau datorita lipsei unei optiuni incluse in kernel este destul de mare. Este extrem de important sa nu stergem vechiul kernel (cel butabil) pentru a buta cu el in caz de nevoie.

Eroarea fatala care poate sa apara este KERNEL PANIC.

  • Upvote 6
Link to comment
Share on other sites

Etapele 5,6,7,8 pot fi inlocuite de o simpla comanda:


make bzImage modules modules_install install

Nota pentru punctul 9: Daca se compileaza direct in kernel suport pentru file system cat si pentru device-urile prezente pe sistem, nu mai este nevoie de initrd

Felicitari pentru articol

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...