Gentoo – kompilacja jądra (kernel 2.6.30)

Info: To nie jest informacja jak kompilować kernel – to raczej informacja jak go nie kompilować 🙂

Największym problemem okazała się dla mnie kompilacja kernela 2.6.30. Początkowo podczas instalacji użyłem narzędzia genkernel ponieważ było wygodne. Jednak tak stworzone jądro trochę długo się uruchamiało (około 1 minuty 15 sek. od GRUBA do ekranu logowania). Wszystko dlatego, że na początku uruchamiany był obraz initrd i on ładował do dużo modułów których nawet nie potrzebowałem! Pomijam już fakt, że kompilacja takiego jądra z milionem modułów trwała około 20 minut.

Postanowiłem więc wziąć sprawy w swoje ręce i zmodyfikować nieco ustawienia jądra tak aby nie musiało korzystać z initrd. Dodatkowo chciałem aby jądro obsługiwało system plików ext4, abym mógł pracować na partycji gdzie zainstalowałem Ubuntu (bo ono też jeszcze jest 😉 ).

Zatem poszedłem do źródeł gentoo-sources które były już na dysku od czasu gdy instalowałem system:

cd /usr/src/linux

I rozpocząłem konfigurowanie:

make menuconfig

Początkowo ogrom opcji jakie się cisną do oczu jest porażający. Po kilku nieudanych kompilacjach (tzn takich, że jądro po uruchomieniu dawało KERNEL PANIC). Postanowiłem zacząć całkowicie od nowa. W katalogu /usr/src/linux wydałem polecenie:

rm .config

Co oznacza, że usunąłem starą konfigurację (jeszcze wygenerowaną przez genkernel – stąd pewnie były problemy). Po tej operacji program do konfiguracji jądra wczytał podstawowe ustawienia, które są bardzo minimalistyczne. Bałem się czy takie jądro w ogóle poradzi sobie w życiu codziennym, ale postanowiłem spróbować.

Jedyne rzeczy jakie zmieniłem to dodałem obsługę ext4 oraz zaznaczyłem kilka opcji graficznych dla kart NVIDIA i mojej karty bezprzewodowej.

Kompilacja nowego jądra trwała mniej niż 2 minuty. Wygenerowanych zostało zaledwie 12 modułów, z których łatwo było wybrać te interesujące 🙂

Jak się okazało jądro poradziło sobie i uruchomiło się w około 30 sekund (gdyby nie konfigurować sieci to nawet kilka sekund szybciej). Widać zatem, że w prosty sposób można znacznie przyspieszyć ładowanie systemu operacyjnego.

Teraz jeśli zauważę, że potrzebuję dodatkowej opcji w jądrze to dodanie jej zajmuje tylko kilka minut. Ma to ogromne zalety w stosunku do tego, ze w Ubuntu właściwie wszystko działo się samo i nawet nie wiedziałem skąd, po co i dlaczego 🙂 A ja lubię wiedzieć dlaczego.

Wniosek

Jeśli kompilowałeś jądro przy użyciu genkernela lub w jakiś inny automatyczny sposób to najlepiej usuń tę konfigurację i zacznij od nowa.

W internecie jest bardzo wiele przewodników dotyczących konfiguracji i kompilacji jądra Linux. TA STRONA jest jednym z przykładów. Najważniejszą rzeczą podczas szukania informacji jest wiedza o tym, że informacje te mogą być przestarzałe – dlatego należy ostrożnie podchodzić do znalezionych informacji.

C++ Sockets Library

Kiedy wreszcie postanowiłem napisać jakiś kawałek kodu dla ageNet i dla ułatwienia sobie życia wykorzystać przy tym C++ Sockets Library to okazało się, że kompilacja tego cuda nie jest możliwa ponieważ:

1>g:\\libs\\sockets-2.1.7\\sockethandler.cpp(447) : error C2065: 'EINVAL' : undeclared identifier
1>g:\\libs\\sockets-2.1.7\\sockethandler.cpp(447) : error C2065: 'EINTR' : undeclared identifier
1>g:\\libs\\sockets-2.1.7\\sockethandler.cpp(447) : error C2065: 'EBADF' : undeclared identifier
1>g:\\libs\\sockets-2.1.7\\sockethandler.cpp(447) : error C2065: 'ENOMEM' : undeclared identifier

Na szczęście są w świecie ludzie, którzy wiedzieli w czym rzecz i opisali to w internecie. Dzięki jednemu z nich problem został szybko rozwiązany. Nie mogłem się jednak nacieszyć tym osiągnięciem ponieważ chwilę później pojawił się nowy błąd!

1>LINK : fatal error LNK1181: cannot open input file 'ssleay32md.lib'

Zupełnie nie wiem dlaczego w pakiecie openssl-lib, który zassałem z internetu nie ma tego pliku… Wizja kompilacji OpenSSL ze źródeł strasznie mnie wkurza, bo zapewne pojawią się nowe zależności przez które się ona nie powiedzie…