Paweł Tęcza ptecza@debianusers.pl i inni
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.
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.
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”.
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:
Najpierw musimy wypakować pobrane źródła. W tym celu kopiujemy je do katalogu ”/usr/src” i rozpakowujemy poleceniami:
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.
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.
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:
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-<nowa_wersja>
ln -s /boot/vmlinuz-<nowa_wersja> /vmlinuz ln -s /boot/vmlinuz-<stara_wersja> /vmlinuz.old
cp /usr/src/linux/System.map /boot/System.map-<nowa_wersja>
mkinitrd -o /boot/initrd-<nowa_wersja> /lib/modules/<nowa_wersja>
# 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).
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.
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”.
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”.
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
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:
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.
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”.
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”.
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ć.
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”.
Autor artykułu dziękuje następującym osobom:
Copyleft
Pafcio. All rights reversed.Ostatnia modyfikacja: Pt 30.05.2003 16:38:00
~~DISCUSSION~~