www.debianusers.pl: Kompilacja jądra Linux Page 1

wersja oryginalna

Kompilacja jądra Linux

Paweł Tęcza i inni

Wstęp

Ten artykuł ma za zadanie pomóc początkującemu użytkownikowi Debiana w kompilacji jądra Linux. Po jego przeczytaniu będzie on wiedział co to jest jądro systemu operacyjnego, jakiego jądra używa Debian, czym różnią się wersje stabilne od rozwojowych Linuxa, po co kompiluje się jądro oraz jak skompilować jądro metodą tradycyjną i sposobem Debiana. Wybór metody zależy oczywiście od czytelnika. Kompilacja i instalacja sposobem Debiana ma tę zaletę, że jest prostsza i bardziej zgodna z systemem pakietów Debiana.

Spis treści

1. Co to jest jądro?

2. Wersje stabilne i rozwojowe Linuxa

3. Po co kompilować jądro?

4. Kompilacja jądra metodą tradycyjną

4.1. Konfiguracja jądra

4.2. Kompilacja jądra

4.3. Instalacja jądra

5. Kompilacja jądra sposobem Debiana

5.1. Konfiguracja jądra

5.2. Kompilacja jądra

5.3. Instalacja jądra

5.4. Inne możliwości make-kpkg

5.4.1. Tworzenie podwersji jądra

5.4.2. Nakładanie "łatek" na jądro

5.4.3. Budowa modułów

5.4.4. Dodanie do jądra wsparcia dla initrd

6. Źródło

7. Podziękowania

1. Co to jest jądro?

Jądro jest najważniejszą częścią systemu operacyjnego, jego "mózgiem", ale samo nie jest systemem operacyjnym. Zadaniem jądra jest obsługa systemu plików, zarządzanie pamięcią, przydzielanie programom czasu procesora i urzędzeń zewnętrznych. Obecnie Debian korzysta z jądra Linuxa (stąd nazwa Debian GNU/Linux), choć trwają też prace nad wykorzystaniem jądra Hurd.

2. Wersje stabilne i rozwojowe Linuxa

Pierwotna wersja jądra Linux została stworzona w 1991 r. przez fińskiego programistę -- Linusa Torvaldsa. Dziś zajmuje się on koordynacją pracy programistów z całego świata nad jego dalszym rozwojem. Spakowane źródła nowych wersji jądra można pobierać bezpośrednio od Linusa, bądź z większości serwerów z oprogramowaniem dla systemów GNU/Linux. Specjalny system numeracji pozwala odróżniać użytkownikom kolejne wersje jądra. Jeśli pobraliśmy z serwera plik linux-2.x.x.tar.gz, to pierwsza cyfra oznacza serię produkcyjną (od wielu lat równa jest 2), druga określa serię jądra, a trzecia -- numer kolejnej wersji tej serii. Parzysty numer serii jądra oznacza, że mamy do czynienia z jego wersją stabilną, a numer nieparzysty -- z wersją niestabilną, czyli wciąż rozwijaną. Po przetestowaniu i usunięciu błędów jądro rozwojowe staje się jądrem stabilnym. Nowe wersje stabilne jądra pojawiają się co kilka tygodni, a eksperymentalne -- nawet z dnia na dzień. Zamiast wielomegabajtowych plików ze spakowanymi źródłami całego jądra (źródła do wersji 2.4.x zajmują ponad 25MB) można też pobierać tylko pliki z zapisanymi zmianami w stosunku do poprzedniej wersji (tzw. "łaty"). I tak, jeśli na przykład mamy już źródła jądra w wersji 2.4.1, a chcemy uaktualnić jądro do wersji 2.4.3, to nie musimy pobierać pliku linux-2.4.3.tar.gz, lecz wystarczy ściągnąć pliki: patch-2.4.2.gz i patch-2.4.3.gz.

3. Po co kompilować jądro?

Standardowe jądro dostarczane z Debianem obsługuje większość konfiguracji i jeśli Twój system działa zgodnie z oczekiwaniami, to kompilacja jądra nie jest Ci potrzebna. Kompilacja może być jednak konieczna, jeśli chcesz:

korzystać ze specjalnego sprzętu lub pozbyć się konfliktów sprzętowych, które mogą wystąpić w przypadku standardowego jądra,

korzystać ze sprzętu lub opcji takich, jak APM (zarządzanie energią) lub SMP (obsługa wielu procesorów), które nie są obsługiwane przez standardowe jądro,

http://www.debianusers.pl/print.php?aid=10

2004-02-12 13:15:40

zoptymalizować rozmiar jądra usuwając zbędne sterowniki i kompilując niektóre jako moduły, co może przyspieszyć czas ładowania systemu i szybkość jego działania, użyć opcji jądra wyłączonych w standardowym jądrze (np. obsługa firewalli), korzystac z uaktualnień lub rozwojowej wersji jądra,

zrobić wrażenie na kolegach/koleżankach ;-) albo wypróbować nowe rzeczy.

4. Kompilacja jądra metodą tradycyjną

4.1. Konfiguracja jądra

Najpierw musimy wypakować pobrane źródła. W tym celu kopiujemy je do katalogu /usr/src i rozpakowujemy poleceniami:

dla plików ze źródłami .tar.gz:

gunzip linux-2.x.x.tar.gz | tar -xvf -

dla plików ze źródłami .tar.bz2:

bunzip2 linux-2.x.x.tar.bz2 | tar -xvf -

dla plików ze "łatkami" .gz:

gunzip patch-2.x.x.gz | patch -p0

dla plików ze "łatkami" .bz2:

bunzip2 patch-2.x.x.bz2 | patch -p0

Jeśli w trakcie rozpakowywania nie wystąpiły jakieś błędy, to możemy przystapić do konfigurownia jądra. Możemy to zrobić na trzy sposoby:

make config

make menuconfig

make xconfig

Pierwszy sposób to najstarsza metoda konfiguracji w trybie tekstowym. Jest on niewygodny i należy go zastosować tylko wtedy, gdy zawiodą pozostałe. Drugi sposób pozwala na wygodną konfigurację z użyciem systemu tekstowych menu. Wreszcie trzeci -- najwygodniejszy, działa tylko pod systemem X Window. W każdym z nich jednak mamy do dyspozycji pomoc do prawie wszystkich opcji.

4.2. Kompilacja jądra

Po skonfigurowaniu jądra możemy przystąpić do jego kompilacji. W tym celu wydajemy komendy:

make dep

make clean

make bzImage

make modules

make modules_install

Trzy pierwsze polecenia przygotowują kompilację jądra, a następnie ją wykonują, dwa ostatnie zaś kompiluja moduły i instalują je. Czas trwania kompilacji zależy od szybkości maszyny i waha się od kilku minut na komputerach z procesorem Pentium II lub Celeron do kilkudziesięciu minut na komputerach wyposażonych w procesor 486.

UWAGA: Jeśli ponownie kompilujemy źródła tej samej wersji jądra, to przed wydaniem polecenia make modules_install musimy usunąć katalog /lib/modules/2.x.x z zainstalowanymi modułami.

4.3. Instalacja jądra

Jeśli kompilacja zakończyła się sukcesem i na ekranie nie mamy żadnych informacji o błędach, to możemy przystapić do zainstalowania nowego jądra:

1. Kopiujemy plik bzImage:

cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-<nowa_wersja>

2. Tworzymy symboliczne dowiązania /vmlinuz i /vmlinuz.old: ln -s /boot/vmlinuz-<nowa_wersja> /vmlinuz

ln -s /boot/vmlinuz-<stara_wersja> /vmlinuz.old

3. Kopiujemy plik System.map:

cp /usr/src/linux/System.map /boot/System.map-<nowa_wersja> 4. Tworzymy plik initrd*:

mkinitrd -o /boot/initrd-<nowa_wersja> /lib/modules/<nowa_wersja> 5. Modyfikujemy plik /etc/lilo.conf

# Nowe jądro

image=/vmlinuz

label=debian

initrd=/boot/initrd-<nowa_wersja>*

read-only

# Stare jądro

image=/vmlinuz.old

label=debian.old

initrd=/boot/initrd-<stara_wersja>*

read-only

* - tylko jeśli chcemy dodać do jądra obsługę initrd (ang. Initial RAM disk).

6. Aktualizujemy LILO:

lilo -v

UWAGA: Pozostawienie starego jądra i utworzenie symbolicznego dowiązania do niego pozwoli nam ponownie uruchomić komputer, gdyby okazało się, że system nie chce działać z nowym jądrem.

5. Kompilacja jądra sposobem Debiana

Do kompilacji jądra z wykorzystaniem udogodnień znajdujących się w Debianie potrzebne są następujące pakiety: binutils, bzip2, fileutils, libc-dev, gcc, make, libncurses-dev, kernel-package, bin86, fakeroot.

5.1. Konfiguracja jądra

Najpierw wypakowujemy źródła jądra do jednej z poniższych lokalizacji:

/tmp/linux

/var/tmp/linux

/usr/local/src/<gdziekolwiek>

/usr/src/linux-x.x.x

Następnie konfigurujemy jądro za pomocą komendy:

make-kpkg --config <metoda>

, gdzie metoda może przyjmować następujące wartości: oldconfig, config, menuconfig, xconfig lub w skrócie: old, menu, x.

5.2. Kompilacja jądra

Po skonfigurowaniu jądra czyścimy drzewo katalogów ze źródłem i parametry pakietu kernel-package. W tym celu wydajemy polecenie:

make-kpkg clean

Teraz budujemy pakiet .deb z nowym jądrem. Robimy to w następujący sposób: make-kpkg --revision <nasza_nazwa> kernel_image

gdzie <nasza_nazwa> jest symbolem oznaczającym naszą wersję jądra. Musi on zawierać litery i przynajmniej jedną cyfrę oraz nie może zawierać znaku '_'. Jako łączników można użyć znaków '.',

'+' i ':', np.:

make-kpkg --revision SuperKernel1.0+sound kernel_image

UWAGA: Do budowania pakietu możemy użyć konta dowolnego użytkownika, jeśli zastosujemy program fakeroot:

fakeroot make-kpkg --revision <nasza_nazwa> kernel_image 5.3. Instalacja jądra

Jeśli budowa pakietu przebiegła bezbłędnie, to w katalogu nadrzędnym powinien już czekać gotowy .deb. Instalujemy go w dokładnie taki sam sposób, jak każdą inną paczkę: dpkg -i kernel-image-2.x.x_<nasza_nazwa>_i386.deb

UWAGA: Jeśli po raz kolejny budujemy pakiet z tych samych źródeł jądra, to przed jego instalacją powinniśmy przenieść stare moduły w inne miejsce, np.: mv /lib/modules/2.x.x /lib/modules/2.x.x.old

Polecenie instalujące pakiet oprócz samego jądra zainstaluje także inne potrzebne pliki (/boot/

System.map-2.x.x i /boot/config-2.x.x) oraz tak zmodyfikuje program ładujący jądro (LILO), aby można je było uruchomić po zrestartowaniu komputera. Standardowe dowiązania symboliczne utworzone przez program dpkg są następujące:

/vmlinuz.old -- dla starego jądra,

/vmlinuz -- dla nowego jądra.

5.4. Inne możliwości make-kpkg

Program make-kpkg to bardzo pożyteczne narzędzie, które umożliwia nam również tworzenie podwersji jądra, nakładanie "łatek", budowanie modułów, dodawanie do jądra wsparcia dla initrd i wiele innych.

5.4.1. Tworzenie podwersji jądra

Dzięki tej funkcjonalności programu make-kpkg możemy w łatwy sposób tworzyć paczki z tą samą wersją jądra, lecz w różnej konfiguracji.

Załóżmy, że chcemy dodać do naszego jądra obsługę dźwięku, która standardowo jest wyłączona w "Woodim". W tym celu dokonujemy odpowiednich modyfikacji w konfiguracji jądra i kompilujemy je w sposób pokazany poniżej:

make-kpkg --config menu --revision SuperKernel1.0+sound --append-to-version -sound \

kernel_image

W wyniku działania polecenia otrzymamy pakiet kernel-image-2.x.x-sound_SuperKernel1.0+sound_i386.deb.

Nie musimy się zbytnio martwić o moduły do tego jądra, gdyż po instalacji pakietu zostaną one umieszczone w katalogu /lib/modules/2.x.x.-sound.

5.4.2. Nakładanie "łatek" na jądro

Powiedzmy, że znudziło się nam już standardowe logo Linuxa wyświetlane w czasie startu systemu przez framebuffer. Możemy je zmienić modyfikując odpowiednio źródła jądra. W tym celu wykorzystamy dostępny w dystrybucji pakiet kernel-patch-debianlogo. Instalujemy go w typowy dla Debiana sposób:

apt-get install kernel-patch-debianlogo

Po zainstalowaniu pakietu odpowiednie "łaty" zostaną umieszczone w katalogu /usr/src/kernel-patches/all/debianlogo.

Żeby "połatanie" jądra się udało musimy wcześniej wyeksportować zmienną środowiskową PATCH_THE_KERNEL:

export PATCH_THE_KERNEL=YES

Teraz możemy przystąpić do budowy jądra i jego automatycznego "połatania": make-kpkg --config menu --revision SuperKernel1.0+logo --append-to-version -logo \

--added-patches debianlogo kernel_image

Po zakończeniu działania polecenia otrzymamy pakiet kernel-image-2.x.x-logo_SuperKernel1.0+logo_i386.deb.

5.4.3. Budowanie modułów

Program make-kpkg możemy wykorzystać nie tylko do budowania jądra, ale także modułów.

Załóżmy, że mamy notebooka, dodaliśmy do jądra obsługę dźwięku, a teraz chcemy zbudować moduły do obsługi kart sieciowych PCMCIA. Instalujemy w tym celu pakiet pcmcia-source. Po jego zainstalowaniu źródła znajdą się w katalogu /usr/src/modules/pcmcia-cs.

Teraz przystępujemy do budowy modułów używając komendy:

make-kpkg --revision SuperKernel1.0+sound --append-to-version -sound \

--added-modules pcmcia-cs modules_image

Po zakończeniu działania komendy otrzymamy pakiet pcmcia-modules-2.x.x-sound_3.1.33+SuperKernel1.0+sound_i386.deb.

UWAGA: Jeśli do budowy jądra nie używaliśmy opcji --append-to-version, to do zbudowania modułów także nie musimy jej używać.

5.4.4. Dodanie do jądra wsparcia dla initrd

Initrd (ang. Initial RAM disk) to RAM dysk, który jest montowany przez program uruchamiający Linuxa (np. Loadlin lub LILO) jako partycja / przed zamontowaniem właściwej głównej partycji.

Initrd jest najczęściej używany po to, aby załadować moduły potrzebne do podmontowania

"prawdziwej" partycji /. Aby dodać obsługę initrd przez jądro musimy w czasie jego konfiguracji zaznaczyć wkompilowanie na stałe opcji RAM disk support (CONFIG_BLK_DEV_RAM) i Initial RAM disk (initrd) support (CONFIG_BLK_DEV_INITRD) w sekcji Block Devices oraz opcji ROM filesystem support (CONFIG_ROMFS_FS) w sekcji Filesystems. Więcej informacji na temat initrd możemy znaleźć w pliku Documentation/initrd.txt znajdującym się w źródłach jądra.

Do pliku /etc/kernel-img.conf dopisujemy linijkę:

do_initrd = Yes

Do wywołania make-kpkg dodajemy jeszcze jedną opcję:

make-kpkg --revision SuperKernel1.0+initrd --append-to-version -initrd \

--initrd kernel_image

Po zainstalowaniu pakietu powiniśmy jeszcze sprawdzić czy dowiązanie symboliczne /initrd.img wskazuje na /boot/initrd.img-2.x.x-initrd.

6. Źródło

Artykuł "Jądro Linuxa -- szlifowanie systemu", Igor Wawrzyniak, PC World Komputer, Dokument Instalacja Debiana GNU/Linux 2.2 dla architektury Intel x86, Artykuł "Pamiętnik starego debianowca", Artur Górniak, LinuxPlus nr 7/2000, Artykuł "Kompilacja jądra w Debianie", Robert Litwiniec, LinuxPlus Extra! Debian 3.0

Woody,

Plik README dołączony do źródła jądra,

Plik /etc/doc/kernel-package/README.gz,

Strona podręcznika make-kpkg(1).

7. Podziękowania

Autor artykułu dziękuje następującym osobom:

Koziemu, Tomaszowi Rykale i Michałowi Bogusiakowi vel kilop za dostrzeżone błędy.

Kaczemu za uzupełnienie informacji na temat parametru --revision programu make-kpkg.

Copyleft

Pafcio. All rights reversed.

Ostatnia modyfikacja: Pt 30.05.2003 16:38:01

Ten artykuł został opublikowany pod adresem

http://www.debianusers.pl/article.php?aid=10.