www.debianusers.pl: Kompilacja jądra Linux
Page 1
http://www.debianusers.pl/print.php?aid=10
2004-02-12 13:15:40
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,
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