Do strony głównej

2.1 Jak zrekompilować jądro

 

Spis treści


Wprowadzenie

Numeracja

Jądra Linux'a są numerowane trzyczęściowym identyfikatorem: A.B.C. Gdzie A,B i C są liczbami oznaczającymi kolejno: numer główny wersji (major version number), numer podwersji (minor version number) i numer rewizji (revision version number). Stabilne wersje posiadają parzysty numer podwersji (drugi). Obecnie najnowsze dystrybucje oznaczone są numerem 2.0.x. Wersje te są polecane każdemu, jako wolne od dziur i błędów. Jądra o drugich numerach nieparzystych (1.1.x, 1.3.x, 2.1.x) są przeznaczone dla tych, którzy chcą je testować, wprowadzać jakieś zmiany, może nawet współpracować przy ich tworzeniu. Niestabilne jądra wykorzystują niektórzy zwariowani administratorzy - na rainbow jest zainstalowane jądro z serii 2.1.x  ;-) . W wersjach tych mogą być błędy, mogą się one zawieszać i prowadzić do utraty danych, chociaż to wcale nie jest regułą.
Ostatnie stabilne jądro w czasie gdy ten dokument był tworzony to: 2.0.32
Aby dowiedzieć się: jądro o jakim numerze jest zainstalowane na komputerze przy którym siedzimy, należy wydać polecenie:

    $ uname -r


Gdzie znaleźć źródła

    Studentom Systemów Operacyjnych źródła dostarczy prawdopodobnie administrator. Dla innych najnowsze wersje stabilne i testowe dostepne są na serwerze ftp.kernel.org w katalogu /pub/linux/kernel ale lepiej ściągać je z mirrorów na przykład: ftp.icm.edu.pl/pub/linux/kernel.
    Polecam także dystrybucje Linux'a na płytach CD-ROM, powinien się w nich znajdować co najmniej jeden plik ze spakowanymi źródłami. 


Instalacja źródeł

Zdobyte źródła (zazwyczaj plik linux-x.y.z.tar.gz gdzie x, y, z są numerami wersji) należy rozpakować do katalogu /usr/src wcześniej robiąc backup poprzednich:

    # cd /usr/src

Sprawdź czy w tym katalogu jest katalog linux, jeśli tak,  zmień jego nazwę np:

    # mv linux linux-stary

Jeżeli znajduje się tu link symboliczny o nazwie linux to go usuń.

    # rm -f linux

Teraz w katalogu /usr/src rozpakuj źródła poleceniem:

# tar zxpvf linux-x.y.z.tar.gz

Po pomyślnym rozpakowaniu powinien pojawić się nowy katalog linux. Dobrym pomysłem byłoby w tym momencie zmienić jego nazwę na linux-x.y.z i zrobić symboliczne dołączenie do tego katalogu o nazwie linux. Aby to zrobić użyj polecenia:

    # mv linux linux-x.y.z
    # ln -s linux-x.y.z linux

Teraz zmień bieżący katalog na linux i przejrzyj plik README. - przeczytaj go, lub chociaż sprawdź, jaka wersja gcc i libc jest potrzebna do kompilacji.
Sprawdź posiadaną wersję gcc:

    $ gcc -v

Jeśli wersje gcc i libc na Twoim komputerze nie są wystarczające do kompilacji ( studenci w naszym Labolatorium Komputerowym prawdopodobnie nie mają tego problemu )

Sprawdź czy istnieją linki symboliczne /usr/include/asm, /usr/include/linux, /usr/include/scsi do odpowiednich katalogów w źródłach i ewentualnie je utwórz

Upewnij się że, nie masz żadnych starych plików *.o:

lub:

Różnica między make mrproper a make clean jest taka, że ten pierwszy usuwa także poprzednie pliki z zapisaną konfiguracją. Jeśli jesteś studentem Systemów Operacyjnych i chcesz kompilować własne, zmienione źródła, polecam make clean i tylko sprawdzenie konfiguracji, a nie konfigurowanie od początku.


Konfiguracja jądra

W katalogu z źródlami napisz:

lub:

lub:

make config jest prostym skryptem konfiguracyjnym, zadaje pytania na które musisz odpowiadać Y=tak/N=nie/M=moduł - polecam go tylko doświadczonym. Dla reszty przygotowano inny skrypt: make menuconfig. Są to przyjazne "okienka" w trybie tekstowym udostepniające podpowiedzi do każdej opcji. Ja używam make xconfig - podobne do poprzedniego ale pod X Window. 


Opis opcji konfiguracyjnych (make xconfig):

 

 


Jeżeli nadal nie wiesz jak ustawić jakieś opcje lub masz wątpliwości:


Moduły

Ładowalne moduły są to kawałki kodu jądra, które nie znajdują sie cały czas w pamięci, tak jak program jądra, a są tam ładowane tylko gdy są potrzebne. Jeżeli, na przykład, skonfigurowałeś obsługę stacji dyskietek jako moduł, i chciałeś ją zamontować lub z niej czytać to specjalny demon (kerneld) sprawdzi czy sterownik tego urządzenia jest w pamięci i jeśli nie, to go załaduje. Teraz możesz wykonywać wszystkie operacje do których jesteś przyzwyczajony na tym urządzeniu. Po minucie nieużywania sterownika, zostaje on usuniety z pamieci. Takie rozwiązanie przy niewielkim narzucie czasowym oszczędza nam pamięć i pozwala obsługiwać wiele urządzeń, systemów plików itp. mimo niewielkiego rozmiaru jądra. Dodatkową zaletą jest możliwość rekompilacji tylko modułów, a nie całego jądra w przypadku zmiany jakiegoś urządzenia w komputerze. Jeśli obsługujesz swoją kartę dźwiękową sterownikiem - modułem, to przy jej wymianie na inną wystarczy zrekompilować tylko moduł jej obsługi i wymienić stary.
Moduły można także ładować ręcznie za pomocą programu insmod, i usuwać - rmmod.
Wiele interesujących szczegółów na ten temat można znaleźć w Module-HOWTO.


Kompilacja jądra

Zacznij od sprawdzenia i ustawienia zależności między plikami:

# make dep

Jeżeli chcesz umieścić nowe jądro na dyskietce, włóż ją do stacji a: i napisz

# make zdisk

Jeżeli natomiast interesuje Cię jądro do instalacji na twoim dysku wydaj polecenie:

# make zImage

Może się okazać, że twoje jądro jest za duże (mi się to nigdy nie przytrafiło) wtedy trzeba napisać:

# make bzImage

Teraz masz dużo czasu na zrobienie czegoś zupełnie innego! Kompilacja potrwa co najmniej kilkanaście minut.

Jeżeli podczas konfiguracji, na którekolwiek pytanie odpowiedziałeś m (=moduł) powinieneś zainstalować moduły. Musisz zrobić backup poprzednich (gdyby coś poszło źle) - znajdują się w katalogu /lib/modules/x.y.z gdzie x, y, z jest numerem wersji modułów. Potem napisz:

# make modules

aby je skompilować i:

# make modules_install

żeby zainstalować. 

Skompilowane jądro powinno znajdować się w katalogu:

/usr/src/linux/arch/i386/boot/zImage

Najlepiej jest skopiować je w miejsce, gdzie do tej pory znajdowały się twoje jądra, najprawdopodobniej jest to katalog główny lub /boot. Zwróć uwagę aby przy kopiowaniu nie zamazać już istniejącego pliku o tej samej nazwie - może to być obecnie działające jądro (zrób backup lub jeśli używasz LILO lepiej zmień nazwę nowego pliku)!

Jeżeli używasz LILO wyedytuj plik

/etc/lilo.conf

dodaj do niego parę linii umożliwiających start nowego jądra na przykład:

image=/boot/nazwa_pliku_twojego_jądra
label=nowe_jądro
root=/dev/hdXX    - (podstaw pod XX identyfikator twojego dysku).
read-only

Dokładny opis LILO i lilo.conf znajdziesz pisząc:

$ man lilo

Koniecznie uruchom program lilo:

# lilo

Jeżeli wszystko poszło dobrze po zresetowaniu komputera powinieneś mieć możliwość wybrania nowego jądra:

LILO boot: nowe_jądro

(system wypisze LILO boot: a ty odpowiadasz etykietą którą wcześniej wprowadziłeś w pliku lilo.conf; naciśnij tabulator aby zobaczyć możliwe opcje)
Jeśli coś nie działa wróć do poprzedniej wersji jądra i zacznij kompilacje od początku...


Autor: Jarek Nowisz