Kompilacja jądra Linuksa

Informacje podstawowe

Co to jest jądro systemu?

Jądro systemu zapewnia współpracę między aplikacjami a sprzętem komputerowym. Odpowiada za wykorzystanie pamięci operacyjnej, współdzielenie procesora, zapis i odczyt z pamięci masowych (dyski twarde, cdrom-y) itp. W przypadku Linuksa jądro systemu jest tworzone przez wspólnotę programistów skupioną wokół twórcy, czyli Linusa Torvaldsa.

Co to są moduły?

Jądro Linuksa składa się z części monolitycznej oraz modułów. Moduły są to fragmenty wykonywalnego kodu zapewniające obsługę funkcjonalną pewnych elementów sytemu (np. drukarka, karta sieciowa, obsługa protokołu PPP), które ze względów praktycznych nie muszą być cały czas w jądrze systemu. Zyskujemy przez to oszczędności wynikające z faktu małej ilości nadmiarowego (czyli niepotrzebnego) kodu obniżającego szybkość działania jądra. Przykład: jeżeli mamy połączenie do Internetu realizowane przez modem nie ma sensu trzymać w jądrze cały czas sposobu obsługi protokołu PPP. Wystarczy go załadować w potrzebnym momencie, czyli rozpoczynania połączenia a następnie, po zakończonym połączeniu, usunąć.

Wersje jąder

Każde jądro ma numer w postaci x.y.z, gdzie x to numer wersji, y – podwersji a z numer poprawki. W chwili obecnej wszyscy używamy wersji 2. Do jąder z serii 2.6.x panowała zasada, iż numer parzysty określa wersję produkcyjną (czyli 2.0.x, 2.2.x i 2.4.0) jądra natomiast nieparzysty (czyli 2.1.x, 2.3.x, 2.5.x) wersję rozwojową (tzw. developerską). Od wersji 2.6.0 zasada ta została zmieniona. Wynikało to z faktu potrzeby znacznie szybszego włączania do kodu jądra nowych funkcjonalności. Od tej wersji dużo poprawek włączano po prostu do kolejnych wydań jąder. Ma to jednak pewną wadę, nowy kod poprawiający coś lub wnoszący nową funkcjonalność często zawierał błędy psujące jego stabilność.

Linus postanowił rozwiązać ten problem następująco: Od chwili wydania jądra 2.6.12 nowe jądra będą dzielić się na "poprawkowe" oraz "rozwojowe". Będziemy mogli je rozpoznać po parzystym ( jądro "poprawkowe") lub nieparzystym (jądro "rozwojowe") ostatnim numerze wersji. Oczywiście w przypadku ostatnich zaleca się większość uwagę przy ich używaniu…

Najnowsza stabilna wersja jądra to 6 (czyli jądra oznaczane 2.6.x) Można jednak spotkać instalacje pracujące na jądrach 2.2.x a nawet 2.0.x. Wynika to z faktu iż wielu administratorów działa zgodnie z zasadą po co poprawiać już coś co dobrze działa. Inna sprawa to fakt, że do niektórych urządzeń nie ma sterowników w nowych wersjach jąder (nie są już wspierane) albo koszt pracy potrzebny do uaktualnienia jądra (i zapewne całego systemu) do no nowszej wersji nie przekłada się na zyski w funkcjonalności…

Pakiety z plikami nagłówkowymi jądra

Niektóre aplikacje odwołujące się w swoim działaniu bezpośrednio do jądra systemu potrzebują informacje o tym jak ono działa (np. Vmware do emulacji wirtualnego komputera). W tym celu wymagają kodu jądra (a dokładniej jego plików nagłówkowych, gdzie zdefiniowane są nazwy funkcji i zmiennych) aby określić co jest dostępne. Ponieważ całe jądro jest zbyt duże i zbyteczne w tym przypadku (a zajmuje ponad kilkaset megabajtów) stworzono pakiety z samymi plikami nagłówkowymi. Tak więc czasem wystarczy zainstalować sam ten pakiet a nie całe jądro…

?atki na jądro

Linus Torvalds ma decydujące zdanie w temacie wprowadzania wszelkich modyfikacji i znaczących poprawek w kod jądra. Nie wszyscy się z nim zgadzają i powstają tzw. łatki (ang. patch) na jądro pisane przez niezależnych programistów a mające rozszerzyć lub poprawić funkcjonalność jądra. Za przykład mogą tutaj służyć łatki grsecurity (poprawiająca bezpieczeństwo systemu) czy xfs wprowadzająca obsługę systemu plików XFS.

Gałęzie jąder

Oprócz łatek na jądro istnieją również osobne gałęzie (różnica między gałęzią jądra a łatką jest w wielkości i ilości usprawnień) prowadzone przez niezależnych developerów. Najsłynniejsza gałąź wersji 2.4 należała do Alana Coksa. Ceniona była za dopracowanie szczegółów i innowacyjność. Większość jego poprawek wchodziła później do głównej gałęzi jądra. Jego łatki można pobrać ze strony: www.kernel.org/pub/linux/kernel/people/alan

Alan rozpoczął ostatnio wspieranie również jąder 2.6 (od wersji 2.6.8 są dostępne jego łątki). Można je pobrać z tego samego adresu.

Jądra czyste a rozprowadzane przez twórców dystrybucji

Jeżeli chcemy samodzielnie skompilować jądro systemu mamy do wyboru dwie drogi zdobycia jego kodu. Możemy skorzystać z jąder udostępnionych przez Linusa Torvaldsa albo dostarczanych przez twórców dystrybucji. Pierwsza opcja dostarcza nam "czysty" kod jądra, natomiast dystrybutorzy przeważnie dostarczają go z wieloma łatkami, dzięki czemu nie musimy się zbytnio męczyć z jego łataniem. Może jednak się zdarzyć (tak czasem bywało z jądrami dostarczanymi z dystrybucją Mandrake), że w wyniku nałożenia zbyt dużej ilości łatek jądro nie chce się skompilować.

Uaktualnienie: W przypadku jąder rozprowadzanych z Mandrake 9.1 (wersja pakietu kernel-source-2.4.21-0.13mdk) jeżeli skompilujemy jądro bez zmiany domyślnych ustawień to się skompiluje. W przeciwnym wypadku jądro nie skompiluje się poprawnie.

Zdobycie źródeł jądra

Jeżeli chcemy skorzystać z jądra dostarczanego przez Linusa Torvaldsa należy pobrać jego najnowszą wersje z strony www.kernel.org i rozpakować je w katalogu /usr/src/. W przypadku chęci skorzystania z wersji dystrybucyjnych wystarczy zainstalować którąś z paczek o nazwie kernel-source-wersja_jądra.

Po zdobyciu kodu jądra należy wykonać (jeżeli nie dokonał tego skrypt instalacyjny pakietu) link symboliczny /usr/src/linux do katalogu z wersją jądra, z którą chcemy pracować. Pozwoli on niektórym programom na dostęp do aktualnej wersji źródeł systemu (np. konfiguratorowi KDE). Wykona to polecenie:

ln -s /usr/src/linux-2.4.x  /usr/linux/linux

gdzie x to numer poprawki.

Następnie przechodzimy do katalogu /usr/src/linux. Wszystko co jest niżej opisane, jeżeli nie jest to jawnie określone wykonujemy w tym katalogu.

Nałożenie łatki na jądro

Nałożenie łątki na jądro jest bardzo proste. Należy przegrać do katalogu z kodem jądra plik łatki, rozpakować go a następnie wydać polecenie:

patch -p1        <    plik_z_łatką

Kompilacja jądra

Konfiguracja parametrów jądra


Konfigurator wywołany poleceniem make config
Najstarszym konfiguratorem (na szczęście już rzadko używanym) jest konsolowy skrypt wywoływany poleceniem make config. W tym przypadku konfiguracja parametrów polega na odpowiadaniu na kolejne pytania. Niewygoda jego użytkowania polega na potrzebie odpowiadaniu na kilkadziesiąt czy ponad sto pytań. Na dłuższą metę jest to nie do wytrzymania.

Konfigurator wywołany poleceniem make menuconfig

W przypadku pracy w trybie konsoli najlepiej użyć polecenia make menuconfig, które wywoła interfejs graficzny w trybie konsolowym (patrz obrazek obok). Tutaj już nie musimy odpowiadać na poszczególne pytania. Możemy jedynie zaznaczać lub odznaczać te opcje, które nas interesują.

Przy każdym elemencie znajduje się znak graficzny określający jako co można go włączyć do jądra. Jeżeli jest to [ ] (czyli nawias kwadratowy) element może być jedynie włączony na stałe do jądra. Jeżeli natomiast mamy < > (nawiasy trójkątne) to dany element może być również modułem. Elementy które włączamy do jądra na stałe zaznaczamy przy pomocy spacji aż do uzyskania przy nim symbolu gwiazdki, jeżeli natomiast ma to być moduł to musimy uzyskać dużą literę M. Elementy nie włączane do jądra powinny mieć pole puste.


Konfigurator wywołany poleceniem make xconfig

Gdy korzystamy z środowiska graficznego lepiej skorzystać z make xconfig, otworzy to nam graficzny panel konfiguracyjny dla środowiska X-Window.

Użytkownicy KDE mogą skorzystać z konfiguratora dostępnego w ich środowisku. Znajdziemy go w Panelu Sterowania KDE w sekcji System (należy jednak wtedy pracować w środowisku jako administrator, gdyż w innym przypadku nie będziemy mieli niezbędnych praw by zapisać nowe ustawienia konfiguracyjne).

Procedura kompilacji

Gdy dokonamy już konfiguracji jądra wydajemy polecenie:

make dep

Ma to na celu określenie zależności (powiązania) między plikami. Kolejne polecenie:

make clean

Wyczyści źródła z wszelkich śmieci pozostałych z poprzednich kompilacji. A komenda

make zImage

Pozwoli skompilować jądro. Lepiej jednak utworzyć je komendą

make bzImage

Gdyż pozwoli to nam otrzymać skompresowane jądro. Mamy więc już skompilowane jądro, które znajduje się w pliku /usr/src/linux/arch/i386/boot/zImage lub jeśli użyliśmy polecenia bzImage w pliku /usr/src/linux/arch/i386/boot/bzImage. Teraz powinniśmy skompilować moduły. Robimy to poleceniem

make modules

A następnie zainstalować je do katalogu /lib/modules/numer.wersji:

make modules_install

Ważne, aby przed wydaniem polecenia make modules_install usunąć z katalogu /lib/modules/numer-wersji poprzednio skompilowane moduły. Czynność tę musimy wykonać tylko w wypadku, gdy kompilujemy jądro o numerze wersji takim samym jak skompilowane wcześniej. Przykładowo jeśli mamy już jądro 2.4.18 i kompilujemy jądro o takiej samej wersji usuwamy katalog /lib/modules/2.4.18. Uchroni nas to przed nadpisywaniem modułów oraz komunikatem Unresolved symbol

Instalacja nowego jądra

Teraz pora na instalacje jądra. Czynność jest bardzo prosta, wydajemy polecenie:

make install

I nowe jądro zostaje dodane do katalogu /boot, utworzony jest wpis w /etc/lilo.conf dla niego oraz utworzone inne potrzebne pliki.

Wspomaganie procesu kompilacji jądra

ccache

Program ccache pozwala cachować wyniki kompilacji programów dzięki czemu kolejne kompilacje tych samych elementów są znacznie szybsze. Program znajduje się w pakietach Debiana.

narzędzia dystrybucyjne wspomagające kompilację jądra

Debian

Debian posiada specjalne narzędzie pozwalające wykonać proces kompilacji jądra (po wyborze opcji) przy pomocy jednego polecenia i stworzyć z takiego jądra pakiet. Następnie ten pakiet jest po prostu instalowany. Dalej już tylko restart komputera i uruchomienie systemu z nowym jądrem… Więcej o tym narzędziu znajdziesz w części poświęconej Debianowi.

W Internecie

Dodaj komentarz