This story found at (znaleziono na stronie): http://www.linuxfan.pl/artykuly/kompilacja.php3


 

Strona główna
Katalogi stron WWWHumorInternet i okoliceKatalog plikówForum LinuxFanPowrót
  Kompilacja jądra systemu Linux


Przeciętnie każdy użytkownik Linuxa, prędzej czy póżniej stanie przed koniecznością kompilacji jądra systemu. Wprawdzie najnowsze dystrybucje dostajemy już ze spreparowanym wstępnie jądrem które będzie działać na większości komputerach i system taki możemy bez problemu używać, lecz jego jądro posiada zbyt wiele niepotrzebnych elementów nie przydatnych do naszego komputera a oznaczających zwolnienie jego pracy i pochłaniających niepotrzebnie jego zasoby. Mimo że kompilacja kernela wymaga od nas podstawowej wiedzy o systemie Linux oraz dokładnej znajomości sprzętu na którym pracujemy nie należy się zbytnio tym przejmować. W tej chwili są już dostępne narzędzia do graficznej jego konfiguracji łącznie z kompletnym systemem pomocy a i w zasobach JTZ i HOWTO też pewnie coś znajdziemy. Rozglądając się po serwisach internetowych przekonamy się że każda szanująca się strona poświęcona systemowi Linux też coś posiada w tym temacie.

By z grubsza uzmysłowić co to jest jądro i z czym to się je, na wstępie krótkie objaśnienie. Jądro to inaczej zwany kernel. Jądro to plik vmlinux znajdujący się najczęściej w katalogu /boot. Jądro to serce Linuxa które przy starcie systemu lilo czyli fachowo zwany LInux LOader - program startujący Linuxa, ładuje jako plik vmlinuz z jego odpowiednimi instrukcjami do pamięci komputera. Instrukcje o których wspomniałem to obsługa różnych procesów przez procesor, zarządzanie dostępną pamięcią w tym i partycją wymiany swap oraz kierowanie komunikacją z poszczególnymi urządzeniami podłączonymi do naszego komputera.  Tak więc cała komunikacja ze sprzętem odbywa się poprzez kernel. W związku z tym jak widać nasze jądro musi być dostosowane do naszego sprzętu, czyli posiadać wszystkie sterowniki do sprzętu jaki mamy zainstalowany na pokładzie naszego komputera.

Żródła jądra - są ogólnodostępne i w zainstalowanej dystrybucji znajdują się w katalogu /usr/src/linux. Ogólnodostępność oznacza że każdy znający się na programowaniu (żródła są prawie w całości napisane w języku C) może brać udział w jego rozwoju. W chwili pisania tego artykułu mamy już prawie gotowe jądro w wersji 2.4.0 którą to opublikował Linus Torvalds, twórca Linuxa a zarazem koordynator rozwoju jądra. Wcześniej co chwilę ukazywały się kolejne jego wersje i by nie narażać użytkowników na ryzyko niestabilnej ich pracy prowadzono ich podział na wersje stable i rozwojowe. Dla lepszego ich rozpoznania wprowadzono też ich odpowiednią numerację. Stabilne jądra mają środkową liczbę parzystą a rozwojowe nieparzystą. Po pewnym czasie testowania nowe fragmenty kodu z ich dodatkowymi możliwościami i sterownikami trafiają do następnej wersji stabilnej. Kolejna wersja stabilna jest najczęstszą przyczyną zmiany i kompilacji kernela lecz również zmiana konfiguracji komputera lub dodanie kolejnych usług może stanowić jego powód.

Moduły - Na koniec przed opisem samej kompilacji należy jeszcze wspomnieć o modułach. Są to sterowniki różnych urządzeń które nie są wkompilowane bezpośrednio w jądro. Jednak gdy zajdzie potrzeba użycia takiego sterownika zostaje on wtedy załadowany dynamicznie przez specjalny program ładujący bez przerywania pracy naszego systemu. Wszystkie moduły dostępne w naszym systemie znajdują się w katalogu /lib/modules/numer_wersji naszego jądra. Korzyść z użycia sterowników w postaci modułów jest taka że przez ich zastosowanie otrzymujemy mniejsze i szybsze jądro dzięki czemu nie trwonimy bez potrzeby zasobów naszego komputera. Jednak nie wszystkie sterowniki możemy użyć jako moduły, Linux potrzebuje część z nich jeszcze zanim zostaną one załadowane przez system, tak jest np. z obsługą dysku twardego czy systemu plików.

A oto krótkie streszczenie samego procesu kompilacji:
- Skopiowanie i rozpakowanie nowego jądra i ew. usunięcie starego.
- Konfiguracja jądra
- Kompilacja jądra
- Kompilacja i instalacja modułów
- Instalacja nowego jądra
- Aktualizacja pliku lilo.conf i system.map

Zaczynamy więc według ustalonego planu, pamiętając że pominięcie któregokolwiek punktu oznaczać będzie niepotrzebną stratę czasu.

Przygotowanie do kompilacji:

    Na płytce z LinuxPlus-a 11B/99 znalazłem jądro w wersji 2.3.31 i ono będzie żródłem naszych doświadczeń. Systemem będzie świeżo zainstalowany Red Hat 6.1 wydany też z tym samym numerem LinuxPlus. Jeśli chcemy zmienić całkowicie jądro na nową wersję należy przenieść nowe jądro do katalogu /usr/src i rozpakować. Zwrócić należy uwagę czy podczas wyboru pakietów do instalacji wybraliśmy programy i biblioteki które będą nam potrzebne do kompilacji programów, w tym i jądra. W sytuacji gdy posiadamy już w katalogu /usr/src/ stare żródła, możemy bez problemu je skasować tz. katalog /linux_numer_wersji i jego dowiązanie symboliczne katalog /linux.

Jądro wersji 2.3.21 spakowany plik linux-2.3.21.tar.bz2 zajmuje prawie 13 MB i po skopiowaniu go np. Midnight Commanderem z płytki do katalogu /usr/src rozpakowujemy komendą:

bzip2 -dc linux-2.3.21.tar.bz2 | tar xf -

w wyniku czego po kilku lub kilkunastu sekundach otrzymujemy katalog o nazwie linux i wielkości ponad 63 MB. Następnie dobrze byłoby zmienić jego nazwę tak by było wiadomo z jaką wersją jądra mamy  do czynienia komendą: mv linux linux-2.3.21 a następnie dowiązanie symboliczne tego katalogu za pomocą nieocenionego MC lub wydając komendę: ln -s linux-2.3.21 linux

Do konfiguracji jądra w zależności od zainstalowanych składników w naszym systemie mamy do wyboru trzy konfiguratory. Najwygodniejszy jest konfigurator działający w systemie X Windows a wywoływany na terminalu poleceniem make xconfig. Konfigurator ten podobnie jak następne dwa ma wbudowany system pomocy objaśniający w języku angielskim znaczenie każdej kolejnej opcji oraz wygodny system zaznaczania wybranych pozycji.

Kolejny wywoływany jest poprzez polecenie make menuconfig, pomimo że już nie taki efektowny lecz wystarczająco przejrzysty i prosty widoczny jest poniżej.

menuconfig.gif (5617 bytes)

Ostatnie polecenie wywołujemy poprzez komendę make config i podobnie jak poprzednie pod X Windows działa na terminalu lecz nie ma budowy w stylu menu lecz pojedynczych pytań z możliwością wyboru odpowiedniej pozycji. Przejście do katalogu linux i wydanie polecenia np. make xconfig rozpocznie konfiguracje naszego przyszłego jądra.

Konfiguracja jądra:

Po wywołaniu programu do konfiguracji jądra przez polecenie make xconfig lub make menuconfig a w trybie textowym make config zorientujemy się że przy każdej opcji znajduje się pole wyboru pozwalające ją włączyć lub wyłączyć. Jeśli sterownik ma możliwość konfiguracji jako moduł dodatkowo znajdziemy jeszcze jedne pole wyboru gdzie możemy zaznaczyć je literą M. Poniżej podaję najważniejsze opcje przy konfiguracji kernela.

Code maturity level options:
<*> Prompt fordevelopment and/or incomplete code/drivers

Jeśli chcemy skorzystać z nowych lub experymentalnych sterowników możemy tę opcję zaznaczyć lecz godzimy się wtedy na gorszą stabilność naszego systemu.

Loadable module support:
< > Enable loadable module support

Opcja pozwalająca skompilować jądro nie obsługujące modułów.
< > Set version information on all symbols for modules
<*> Kernel daemon support (e.g autoload of modules)

Tutaj uruchamiamy automontera modułów. Program ładuje moduły gdy są potrzebne, po czym usuwa je gdy są przez pewien czas nie używane.

General setup:
< > Kernel math emulation

Opcję tę zaznaczamy tylko przy starych procesorach bez koprocesora.
<*> Networking support
Warto zaznaczyć nawet gdy nie korzystamy z sieci ponieważ dużo programów korzysta z gniazd TCP/IP do komunikacji między procesami.
<*> PCI bios support
<*> System V IPC
<*> Kernel support a.out binares
<*> Kernel support for ELF binares
<*> Compile kernel as ELF- if your GCC is ELF-GCC(Pentium)Procesor type

Tutaj należy wybrać odpowiedni procesor.

Flopy, IDE, and other block devices:
<*> Normal floppy disk suport

Sterownika stacji dyskietek lepiej nie kompilować jako modułu.
<*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
W tym menu znajdziemy sterowniki do różnych napędów, dysków, CD-ROM-ów i innego sprzętu IDE.

Networking options:
<*> Network firewalls
< > Network aliasing
<*> TCP/IP networking
< > IP: forwarding/gatewaying
< > IP: multicasting
<*> IP: syn cookies
< > IP: firewalling
< > IP: accounting
< > IP: optimize as router not host
< > IP: tunneling

Menu te zobaczymy tylko wtedy gdy zaznaczyliśmy w General setup opcję Networking support.

SCSI support:
< > SCSI support

Tutaj wybieramy sterowniki do sprzętu SCSI. Sterowniki te należy wkompilować w jądro a nie jako moduły. Następnie należy skompilować bezpośrednio do jądra lub w formie modułu sterownik do konkretnego typu i modelu sprzętu. Domyślne ustawienia kompilują wszystkie sterowniki jako moduły.

Network device support:
<*> Network device support
<*> Dummy net driver support

Tu następuje wybór sterowników odpowiedzialnych za pracę w sieci m.in protokoły PPP, SLIP czy karty sieciowe. Zaznaczamy z powodów jak Networking support. Obsługi modemów tu nie znajdziemy ponieważ są one obsługiwane przez sterownik do portu szeregowego.

ISDN subsystem:
Wybierzemy tutaj sterowniki potrzebne do obsługi komputera podłączonego do sieci przez ISDN

CD-ROM drivers (not for SCSI or IDE/ATAPI drivers):
Wybierzemy tutaj sterownik do nietypowego napędu CD-ROM jeśli mamy taki zainstalowany w naszym komputerze.

Filesystems:
< > Quota support

System pozwalający ogramniczyć ilość miejsca dla poszczególnych użytkowników używany głównie na serwerach.
< > Minix fs support
< > Extended fs support
<*> Second extended fs support

Obsługa partycji ext2 powinna być zawsze wkompilowana w jądro.
< > Xiafs filesystem support
<*> Native language support (Needed for FAT and ISO9660)
<M> ISO9660 cdrom filesystem support
<M> DOS FAT fs support
<M> MSDOS fs support

Obsłga CD-ROM-u, Dosowego FAT 16 i Windowsowego vfat możemy skompilować jako moduły.

Character devices:
<*> Standard/generic serial support

Wybierzemy tu starowniki do naszej myszy, portu szeregowegi itd. Mysz podłączona poprzez port szeregowy nie potrzebuje dodatkowego drivera. Przy innej mysz musimy zaznaczyć opcję Mouse Support (not serial mice) i wybrać rodzaj naszej myszy.

Sound:
<*> Sound cart support
<*> MIDI interface support

Tutaj wybieramy rodzaj i parametry karty dżwiękowej.

Kernel hacking:
< > Kernel profiling support

W tym miejscu możemy załączyć dodatkową diagnostykę jądra. Opcja ta jest przeznaczona głównie dla osób które pracują nad żródłami.

Tak by z grubsza wyglądały główne opcje konfiguracyjne jądra. W przyszłości postaram się by znalazły się tu więcej opcji z ich dokładnym opisem.

Kompilacja:

Po skonfigurowaniu naszego nowego jądra przychodzi czas na właściwą kompilację. W tym celu musimy wydać kilka poleceń które po kolei w skócie opiszę.
make dep - Sprawdzanie różnych zależności
make clean -
Usuwa pozostałości po starej kompilacji jądra
make zImage -
kompiluje jądro i zapisuje w /usr/src/linux/arch/i386/boot/zImage
make modules -
Kompilacja wybranych sterowników do postaci modułów
make modules_install -
Polecenie to kopiuje nowe moduły do katalogu /lib/modules/wersja_jądra

Kompilacja przebiega w zależności od mocy naszego sprzętu od 5 minut przy lepszych procesorach i dużej ilości pamięci RAM do pól godziny i więcej na starych maszynach. W jej czasie na konsoli będziemy widzieć wszystkie komunikaty dotyczące całej kompilacji. Najczęściej jednak po make zImage otrzymujemy komunikat o zbyt dużym jądrze:

Root device is (3, 3)
Boot sector 512 bytes.
Setup is 2322 bytes.
System is 594 kB
System is too big. Try using bzImage or modules.
make[1]: *** [zImage] Error 1
make[1]: Leaving directory `/usr/src/linux/arch/i386/boot'
make: *** [zImage] Error 2

Więc postępujemy zgodnie z komunikatem i wydajemy komendę make bzImage i po dobrym jej zakończeniu otrzymamy komunikat podobny do poniższego:

Root device is (3, 3)
Boot sector 512 bytes.
Setup is 2322 bytes.
System is 594 kB
make[1]: Leaving directory `/usr/src/linux/arch/i386/boot
'


Nowo skompilowane jądro znajduje się w katalogu /usr/src/linux/arch/i386/boot/bzImage i czas najwyższy by je zainstalować w naszym systemie. By to zrobić musimy wcześniej jeszcze skompilować sterowniki które postanowiliśmy zainstalować jako moduły wydając polecenie make modules i póżniej make modules_install.
Następnie nowe jądro kopiujemy do katalogu /boot i dodajemy dodatkowy wpis do pliku konfiguracyjnego Lilo w /etc/lilo.conf tak byśmy mogli przetestować nasze nowe jądro przed ostateczną jego instalacją.

Poniżej skopiowałem mój plik lilo.conf. Jak widzimy na dysku mam zainstalowane dwa systemy. Domyślnie startuje Linux a po wpisaniu przy starcie win uruchomi się Windows.

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
default=lin

image=/boot/vmlinuz-2.2.12-20
    label=lin
    initrd=/boot/initrd-2.2.12-20.img
    read-only
    root=/dev/hda3

image=/boot/vmlinuz-2.3.21
    label=test
    read-only
    root=/dev/hda3


other=/dev/hda1
    label=win

Na czerwono zaznaczyłem dokonany dodatkowy wpis pozwalający wystartować moje nowe jądro. Po dodaniu i zapisaniu nowych parametrów w pliku lilo.conf wydajemy na konsoli komendę lilo w celu zapisania przez program nowej konfiguracji. Teraz przy starcie naszego systemu przy lilo: wpisujemy test i będziemy mogli przekonać się o działaniu naszego świeżego jądra. Jeśli zauważymy że wszystko gra możemy usunąć wpis ze starym jądrem z pliku lilo.conf oraz stare moduły z katalogu /lib/modules/stare moduły. Nie zapomnijmy też wymienić pliku system.map w katalogu /boot na ten który podczas kompilacji powstał w katalogu /usr/src/linux

Uwagi końcowe - Sama kompilacja jądra najczęściej przebiega bez zgrzytów. W ostateczności zdarza się nam zapomnieć wkompilować którejś z potrzebnej nam usługi. Najczęściej zapominamy jednak wywołać lilo po wpisach wprowadzonych w pliku lilo.conf. Drugim najczęściej spotykanym błędem jest brak aktualizacji pliku system.map. Zdarza się nam też zapomnieć zainstalować moduły dostosowane do naszego nowego jądra. Należy zwrócić też uwagę że nie każdą wersję jądra możemy zainstalować w naszym systemie. Jeśli mamy zbyt stare jądro będziemy musieli podgonić wersję instalując odpowiednie patche. Mimo że jądro jest dostarczane z obszerną dokumentacją w języku angielskim to w razie jakiś wątpliwości wystarczy tylko przejrzeć plik readme gdzie dowiemy się podstawowych rzeczy na temat instalacji i konfiguracji tego jądra.

Warto zajrzeć na http://www.jtz.org.pl/ gdzie znajdziemy plik Kernel-HOWTO po polsku opisujący opcje konfiguracyjne jądra oraz instalacje itp.  Również na Linux Sky znajdziemy text na ten temat.

 julkos@


Copyright (C) 1999-2003 LinuxFan LinuxFan Email:mailto:julkos@linuxfan.pl
.