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