16 Apr 2009

Debian GNU/Linux - Kompilacja jądra

Będzie to artykuł z serii tych, lekkich łatwych i przyjemnych oraz tych które można znaleźć w sieci :), jednak powstanie - bo gdzieś na dysku miałem zapisane informacje, że coś takiego miałem napisać kiedyś. W Debianie trochę inaczej niż np. w Gentoo instaluje się jądro systemu. W skrócie wygląda to tak, że:
  1. Pobieramy źródło jądra, konfigurujemy je
  2. Tworzymy paczkę ze zbudowanym jądrem, a następnie ją instalujemy

Konwencje nazewnicze występujące w tym tekście

Wszystkie wystąpienia {$LINUX_VERSION} powinny być zamienione na wersję jaką posiadamy. Jeśli by ktoś chciał użyć tego poradnika przy pisaniu skryptu kompilacji, wystarczy że stworzy sobie zmienną LINUX_VERSION.
$LINUX_VERSION=2.6.29.1

Wymagane pakiety

apt-get install kernel-package libncurses5-dev fakeroot fakeroot wget bzip2 build-essential zlib1g-dev zlib1g

Pobieranie źródeł jądra

Nowe źródła jądra można pobrać ze strony http://kernel.org/, źródła powinny być pobrane do katalogu /usr/src, można zrobić to w sposób następujący:
# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-{$LINUX_VERSION}.tar.bz2

Rozpakowywanie źródeł jądra

Po pobraniu źródeł powinniśmy je rozpakować, oraz przygotować się do kompilacji:
# tar xjf linux-{$LINUX_VERSION}.tar.bz2
# rm linux
# ln -s linux-{$LINUX_VERSION} linux
# cd /usr/src/linux

Przygotwanie do kompilacji jądra (opcjonalnie)

  • Nakładanie ewentualnych patchy na kernel
    # cd /usr/src/linux
    # bzip2 -dc /usr/src/patch-2.6.29.1-rc2.bz2 | patch -p1 --dry-run
    # bzip2 -dc /usr/src/patch-2.6.29.1-rc2.bz2 | patch -p1
    
  • Kopiowanie bazowego pliku kofniguracyjnego dla nowego jądra systemu (jeśli wersje jąder bardzo się różnią ten krok może nie zadziałać)
    # cp /boot/config-2.6.26-1-686 /usr/src/linux/.config
    

Konfiguracja jądra

make menuconfig

Kompilacja jądra oraz budowanie paczki *.deb

# make-kpkg clean
# fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
Notatki:
  • Po opcji --append-to-version= można wprowadzić dowolną nazwę pozwalającą nam zidentyfikować jądro, która zaczyna się od znaku - i nie zawiera białych znaków (spacji).
  • Kompilację polecam uruchomić na screenie i zdetachować.
  • Jeśli kompilacja odbywa się ze wszystkimi dostępnymi modułami (config dystrybucyjny) to potrwa pewnie długo - spacer wydaje się być dobrą opcją.
  • Jeśli ktoś stworzył sobie kernel (np. tak: fakeroot make-kpkg --revision=-custom.1.0 kernel_image) bez initrd to może go zbudować później w ten sposób (ale tego nie obejmuje ten artykuł):
    # cd /boot/
    # mkinitrd -o /boot/initrd.img-{$LINUX_VERSION} {$LINUX_VERSION}
    

Instalacja paczki z nowym jądrem

Jeśli paczka z nowym jądrem jest już przygotowana, pozostaje tylko ją zainstalować.
# cd ../
# dpkg -i linux-image-2.6.29.1-custom_2.6.29.1-custom-10.00.Custom_i386.deb
# dpkg -i linux-headers-2.6.29.1-custom_2.6.29.1-custom-10.00.Custom_i386.deb

To wszystko - pora ponownie urochmić system

# shutdown -r now
Po uruchomieniu sprawdzamy wersję kernela:
$ uname -a
Linux pilum 2.6.29.1-custom #1 SMP Thu Apr 16 06:51:26 CEST 2009 i686 GNU/Linux

Problemy jakie się mogą pojawić

  • Czasami bootloader nie zostaje zaktualizowany, rozwiązaniem tego problemu może być edycja pliku /etc/kernel-img.conf oraz dodanie takiej linii:
    postinst_hook = /sbin/update-grub postrm_hook = /sbin/update-grub do_bootloader = no
    To zapewni, że komenda update-grub będzie uruchomiona zasze po instalacji nowego jądra z paczki.
  • Nie wszystkie moduły, które są w systemie zostały przekompilowane (np. moduły do maszyn wirtualnych, kamer internetowych - te niebędące włączone do głównej gałęzi jądra) użytkownik musi sam przekompilować.

15 comments:

  1. czy tak samo przejdę na starszy kernel?

    ReplyDelete
  2. tak, dokładnie tak samo - powinno działać. Oczywiście nie polecam skakać z wersji 2.6.x do wersji 2.4.x :).

    ReplyDelete
  3. Witam ponownie,
    a może wiesz jak rozwiązać taki problem? :)

    debian:~# dkms build -m unicorn -v neo

    Kernel preparation unnecessary for this kernel. Skipping...

    Building module:
    cleaning build area....
    make KERNELRELEASE=2.6.26-2-686 KERNEL_SOURCES=/lib/modules/2.6.26-2-686/build modules....(bad exit status: 2)

    Error! Bad return status for module build on kernel: 2.6.26-2-686 (i686)
    Consult the make.log in the build directory
    /var/lib/dkms/unicorn/neo/build/ for more information.
    0
    0


    plik make.log mogę ew. dosłać pocztą:)

    Pozdrawiam

    ReplyDelete
  4. Cześć,

    Hmm, nigdy nie korzystałem z DKMS (ba nie wiedziałem nawet co to jest), z tego co znalazłem:

    DKMS is a framework designed to allow individual kernel modules to be upgraded without changing the whole kernel. It is also very easy to rebuild modules as you upgrade kernels.

    z tego co wkleiłeś, nasuwa mi się jedno pytanie:

    - czy na pewno pliki nagłówkowe są we właściwym miejscu?

    Raczej będzie mi ciężko Ci pomóc :(, niemniej jednak możesz posłać log na http://pastebin.com/ i podać odnośnik - spojrzeć na to mogę - może coś wymyślę.

    ReplyDelete
  5. Cześć,

    dzięki że wogóle spojrzałeś na to :)
    to jest odnośnik do make.log

    http://pastebin.com/m5d851cdb

    mam problem z instalacją modemu ZXDSL 852 (neostrada)

    już drugi dzień się z tym męczę i jak do tej pory bez efektu :)

    ReplyDelete
  6. Hmm, wygląda na to że jeszcze masz za nową/starą wersję jądra - która ma inna definicje struktur - ewentualnie któraś, ze ścieżek Ci się nie zgadza i kompilator nie wie jaki plik włączyć.

    Masz dwie opcje:
    - hardkor: przeszukać źródła jądra, popatrzeć czy wszystko jest włączone i jest okej, spróbować budować znów, jeśli nie pójdzie zmienić wersje kernela na niższą np.

    - mniejszy hardkor: spróbować wg tej instrukcji: http://riot777.wordpress.com/2006/09/22/zxdsl-852-i-ubuntu/ ; http://debian.linux.pl/viewtopic.php?t=8589

    Post na forum Debiana jest z roku 2008. Próbuj z jajkami: 2.6.28 / 2.6.26 / 2.6.24 (zacząłbym od tego ostatniego).

    - najmniejszy hardkor, ale trzeba wydać pieniądze - kupić router dowolnej firmy - ja polcema bezprzewodowy (ma też switcha) firmy TP-LINK - TD-W8910G - koszt obecnie: 185PLN na stronie dystrybutora.

    Ja niestety ja takiego modemu nie posiadam, więc nie mam Ci jak pomóc. Kiedyś miałem Thomsona i też mnie zawsze szlag trafiał po reinstalacji systemu ... jeśli masz nadzieje na więcej komputerów w domu/laptopa z bezprzewodwą kartą router wydaje się być dobra inwestycją.

    Hmm, no pozostaje mi Ci życzyć powodzenia - całość to pewnie problem z niedopasowaniem wersji jądra do wersji sterowników.

    ReplyDelete
  7. Dziękuję za zainteresowanie tematem.
    Wiem że z tym "modemem" to tylko kłopoty.
    Postaram się wykonać w/w instrukcje nie mniej jednak wydaje mi się, że skutecznym rozwiązaniem będzie zmienić "jajko" na starsze :)
    ... cóż ... zabieram się do tej mało interesującej pracy :)

    Pozdrawiam.

    ReplyDelete
  8. Witam,

    Wykonując w/w czynności przy przejsciu z 2.6.26-2 na 2.6.16.16 pojawia się taki komunikat i budowanie paczek .deb zostaje przerwane :(

    kernel/intermodule.c:178: warning: 'inter_module_register' is deprecated (declared at kernel/intermodule.c:38)
    kernel/intermodule.c:179: warning: 'inter_module_unregister' is deprecated (declared at kernel/intermodule.c:78)
    kernel/intermodule.c:181: warning: 'inter_module_put' is deprecated (declared at kernel/intermodule.c:159)
    CC [M] fs/binfmt_aout.o
    fs/binfmt_aout.c: Assembler messages:
    fs/binfmt_aout.c:154: Error: suffix or operands invalid for `cmp'
    make[2]: *** [fs/binfmt_aout.o] BĹ‚Ä…d 1
    make[1]: *** [fs] BĹ‚Ä…d 2
    make[1]: Opuszczenie katalogu `/usr/src/linux-2.6.16.16'
    make: *** [debian/stamp/build/kernel] BĹ‚Ä…d 2

    ReplyDelete
  9. to nie problem z budowaniem paczki, ale jakis problem z zrodlami kernela - a dokladnie ich kompilacja - ciezko mi powiedziec tak naprawde dlaczego tak sie dzieje :|. Nigdy cos takiego mi sie nie zdarzylo :(.

    Przepraszam Cie ze tak wolno pisze ostatnio mam urwanie glowy :( i nie zapowiada sie na koniec.

    ReplyDelete
  10. OK, temat można zamknąć :)
    Modem działa :) pomogła zmiana kernela na 2.6.25

    Pozdrawiam

    ReplyDelete
  11. oo to sie ciesze, ze Ci to dziala ;) mam tez nadzieje, ze ten tutorial troszke Ci pomogl ;)

    pozdrawiam :)

    ReplyDelete
  12. Witam.

    ja zatrzymałem sie na tej pozycji:

    test:/usr/src/linux# make menuconfig
    make: *** Brak reguł do wykonania obiektu `menuconfig'. Stop.


    Czy macie jakiś pomysł żeby to rozwiązać?

    ReplyDelete
  13. spróbuj:

    make config

    make xconfig

    Jeśli żadne nie ruszyło - to najprawdopodobniej masz coś nie tak z samymi źródłami? Jak wylistujesz zawartość katalogu (polecenie: ls) to masz tam plik o nazwie Makefile? jeżeli nie - to jest przyczyną Twojego niepowodzenia (skrypt budujący nie może znaleźć pliku Makefile - on odpowiada za proces budowania projektu w tym przypadku jądra systemu).

    ;) póki co tylko taki pomysł

    ReplyDelete
  14. ze sterami nie ma problemu.. wystarczy sciagnac z ubudsl.pl paczke np pod ubuntu interpid w rzpakowac ja i poszukac 2 paczki ze sterami... "unicorn-neo.tar.gz" rozpakowac ja i skompilowac pod jajco... make make install oczywiscie wczesniej trzeba miec pliki naglowkowe albo cale zrudla dokladnie pod to samo jajco ... w innym razie moze sie i tak nam skompilwac a i tak nie bedzie dzilalo ... na koncu ladujemy stery modprobe unicorn_usb_eth ActivationMode=3 VPI=8 VCI=40 PROTOCOL=pppoatm ENCAPS=vc-encaps puzniej konfiguracja polonczenia .. pppoeconf (pod debianem ,i innych debianopodobnych,, ) i cieszymy sie netem

    ReplyDelete
  15. aa i bym zapomnial :P jeszce trzeba fimware(po rozpakowaniu tej 1 paczki mozna gdzies tam go znalezc) rozpakowac do /lib/firmware cxacru-firmware.tar

    ReplyDelete