Uwaga: Ten dokument zawiera błędy lub nie jest już aktualizowany. |
Dla użytkowników, którzy nie są jeszcze zaznajomieni z ręczną konfiguracją jądra powstał program automatyzujący ten proces - genkernel. Pomoże on stworzyć obraz jądra podobny do tych jakie znajdują się na płytach instalacyjnych Gentoo i są tak zaprojektowane, aby same wykrywały całą konfigurację sprzętową naszego systemu. Niektórzy użytkownicy mogą być również zainteresowani używaniem genkernela do uruchomienie sprzętu oraz obsługi działającego jądra, przed załadowaniem systemu. Ponieważ genkernel automatycznie kompiluje moduły jądra, możemy używać sprzętu, który do poprawnego funkcjonowania wymaga załadowania pewnych parametrów modułu.
Jeśli jesteśmy niepewni jak skompilować jądro lub po prostu nie znamy konfiguracji naszego sprzętu, wtedy genkernel jest przydatnym narzędziem. Jest on stworzony do odciążenia użytkownika z ręcznej kompilacji jądra oraz domyślnie wspiera większość urządzeń dostępnych na rynku.
Jednakże, jeśli wiemy jakie sterowniki są wymagane przez system, możemy skrócić czas kompilacji jądra. Jest to możliwe ponieważ możemy wskazać genkernelowi, aby skompilował tylko niezbędne sterowniki. Często liczba sterowników wymaganych przez nasz system będzie znacznie mniejsza (co skróci czas kompilacji jądra) niż ta, którą domyślnie będzie chciał zainstalować genkernel.
Aby zainstalować genkernel, wykonujemy polecenie emerge genkernel. Jeśli używamy Gentoo Reference Platform (GRP), musimy pamiętać, aby zainstalować pakiety binarne przez dodanie opcji -k do polecenia emerge. Ponieważ GRP jest dodatkiem do starszej wersji genkernela, więc flagi mogą być inne. W takim przypadku należy przeczytać genkernel --help i dowiedzieć się jak używać wersji genkernela zainstalowanej w systemie.
Pomimo że istnieje kilka sposobów uruchomienia genkernela, to najbardziej niepożądaną jest genkernel all. Tu jest użyta ogólna konfiguracja, która działa dobrze na większości systemów. Jednak posiada ona wady: większość stworzonych modułów jest bezużytecznych dla szarego użytkownika, a czas kompilacji jest bardzo długi. Poniżej znajduje się przykład bardziej wydajnego podejścia, które uzyskujemy dopisując, jako root, pewne flagi:
Listing 2.1: Uruchamianie genkernela (z flagami) |
# genkernel --splash --no-install --no-clean --menuconfig all
|
Powyższa operacja zmusza genkernel do stworzenia jądra z załączoną opcją splash (--splash), który będzie musiał być ręcznie zainstalowany (--no-install). Podczas przygotowywania źródła drzewa jądra, genkernel powstrzyma się od czyszczenia jakichkolwiek obecnych plików obiektowych z drzewa źródła (--no-clean). Zostanie również wyświetlone narzędzie konfiguracyjne, które pozwoli użytkownikowi wybrać, które moduły zostaną zbudowane (--menuconfig).
Istnieją również inne flagi, które zmieniają wynik kompilacji genkernela. Przykładowo, jeśli zamienimy flagę --no-install na --install, wtedy genkernel automatycznie zainstaluje nowe jądro w katalogu /boot. Użycie flagi --mountboot zezwoli genkernelowi na automatyczne montowanie partycji /boot, jeśli to będzie konieczne.
Należy pamiętać, że genkernel jest stworzony, aby uprościć kompilację jądra oraz uczynić ją bezstresową. Z tego powodu genkernel obsługuje wiele flag ułatwiających kompilację jądra. Przykładowo, istnieją flagi, które pomagają przy konfiguracji, zaś inne mają wpływ na proces kompilacji. Niektóre flagi pomagają nawet usunąć błędy kompilacyjne. Dla zainteresowanych, istnieją jeszcze flagi, które wpływają na złożenie, pakowanie, a nawet ładowanie jądra.
Reszta tego rozdziału podaje dostępne flagi wraz z ich opisem działania. Niektóre flagi mogą wykonać operację w drugą stronę. Operacje w drugą stronę mogą być uzyskane za pomocą przedrostka no-, a ich opis działania zawarty jest w nawiasach kwadratowych, [].
Flagi konfiguracyjne wypisane poniżej są po to, aby pomóc zdecydować jakie funkcje mają być włączone lub wyłączone w jądrze przed jego kompilacją. Możemy nawet wybrać czy stworzony plik konfiguracyjny ma być zachowany. Poniżej znajdują się główne flagi konfiguracyjne:
Następujące flagi zaczynają działać podczas kompilacji:
Następujące flagi są wspierane przez genkernel oraz są przekazywane niezbędnym aplikacjom podczas kompilacji jądra. Te flagi wpływają na kompilator użyty do procesu kompilacji, aczkolwiek na znacznie niższym poziomie.
Flag diagnostyczne podczas kompilacji jądra kontrolują ilość wyświetlanych informacji.
Poniższe flagi są używane do stworzenia pewnych efektów podczas ładowania systemu. Niektóre z nich są tylko estetyczne, lecz inne mogą być niezbędne do włączenia pewnych funkcji w systemie.
Poniższe flagi są wspierane przez genkernel, ale nie pasują do żadnej z powyższych kategorii:
Tryb mówi genkernelowi co ma skompilować. W obecnej chwili obsługiwane są poniższe tryby:
Ostatni tryb, all, jest zalecany dla większości użytkowników, ponieważ wtedy zostanie zbudowane w pełni działające jądro. Należy pamiętać, że tryb po prostu mówi genkernelowi co budować, nie instalować.
Aby genkernel poprawnie współpracował z programem ładującym należy dokonać czterech zmian.
Edytowanie /etc/genkernel.conf
Podawanie flag genkernelowi z linii poleceń może być czasochłonne, szczególnie jeśli mamy dużo flag:
Listing 3.1: Uruchamianie genkernela (przeładowany flagami) |
# genkernel --debuglevel=5 --no-color --no-mrproper --clean --gensplash\
--kerneldir=/path/to/alternate/kernel/sources --install --menuconfig --udev\
--kernel-config=/path/to/preferred/configfile --save-config --mountboot all
|
Na szczęście istnieje plik konfiguracyjny gdzie większość podstawowych opcji może być ustawionych (lub zmienionych). Spójrzmy na ważniejsze opcje:
Poprzez wybranie odpowiednich opcji w /etc/genkernel.conf, możemy zmniejszyć o połowę liczbę flag, które podajemy genkernelowi z wiersza poleceń:
Listing 3.2: Uruchamianie genkernela (z flagami), po edycji genkernel.conf |
# genkernel --gensplash --kerneldir=/path/to/alternate/kernel/sources --udev\
--kernel-config=/path/to/preferred/configfile --install all
|
Identyczne rezultaty mogą być uzyskane przy pomocy obydwu podejść jednak to drugie umożliwia zachowanie ustawień w skrypcie, który może być później zmieniony.
4. Network-Booting z genkernelem
Network Booting z płyty instalacyjnej
Narzędzie genkernel może zbudować obrazy jądra oraz initrd, które będą wspierały network booting lub netbooting. Jeśli mamy szczęście to powinniśmy już być w stanie netboot dowolny komputer w środowisko dostarczone przez płytę instalacyjną.
Magia leży w skrypcie genkernela linuxrc: próbuje on netmount płytę instalacyjną używając NFS. Odtąd skrypty startowe płyty instalacyjnej widzą płytę tak jakby była obecna lokalnie.
Budowanie obrazów jądra oraz initrd ze wsparciem dla netbooting
Aby załączyć wsparcie dla netbooting, włączamy w jądrze następujące opcje:
Ostrzeżenie: Wsparcie dla netbooting w genkernelu jest eksperymentalne, więc może ono zawierać błędy. |
Po pierwsze, obraz jądra musi zawierać sterowniki dla naszej karty sieciowej. Normalnie sterowniki dla takich urządzeń będą skompilowane jako moduły. Jednakże, jest to konieczne, aby (dla netbooting) te sterowniki posiadać wkompilowane w obraz jądra, a nie jako moduły.
Listing 4.1: Konfiguracja wsparcia dla naszej karty sieciowej w jądrach serii 2.6.x |
Device Drivers --->
Networking Support --->
Ethernet (10 or 100Mbit) --->
[*] Ethernet (10 or 100Mbit)
<*> the driver for your network card
(Należy się upewnić, że wybraliśmy <*> a nie
<M>)
|
Po drugie, zalecamy włączenie opcji IP: kernel level autoconfiguration oraz IP: DHCP support. Tym samym ominiemy niepotrzebną złożoność warstwy, ponieważ adres IP oraz ścieżka NFS do płyty instalacyjnej mogą być skonfigurowane na serwerze DHCP. Oczywiście, znaczy to tyle, że wiersz polecenia jądra pozostanie taki sam na dowolnej maszynie — co jest bardzo ważne dla etherbooting.
Listing 4.2: Konfiguracja wsparcia dla DHCP w jądrach serii 2.6.x |
Device Drivers --->
Networking Support --->
Networking options
[*] TCP/IP networking--->
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support
(Te opcje mówią jądru, aby wysłał żądanie do serwera DHCP podczas
startu systemu)
|
Dodatkowo należy włączyć wsparcie dla SquashFS, ponieważ większość nowoczesnych płyt instalacyjnych Gentoo tego wymaga. Wsparcie dla SquashFS nie jest zawarte w zwykłym drzewie źródła jądra. Aby włączyć SquashFS, nakładamy odpowiednie łatki na jądro lub instalujemy gentoo-sources.
Listing 4.3: Konfiguracja wsparcia dla SquashFS w jądrze |
File systems--->
Miscellaneous filesystems --->
[*] SquashFS 2.X - Squashed file system support
|
Po zakończeniu procesu kompilacji, tworzymy skompresowany tarball (tar.gz), który zawiera moduły jądra. Ten krok jest konieczny, jeśli wersja jądra nie jest taka sama jak wersja obrazu jądra na płycie instalacyjnej.
Listing 4.4: Tworzenie skompresowanego tarballa zawierającego moduły jądra |
(Tworzymy plik tar.gz zawierający wszystkie moduły) # cd / # tar -cf /tmp/modules-X.Y.Z.tar.gz /lib/modules/X.Y.Z/ |
Zależnie od mechanizmu uruchamiania sieciowego, będziemy potrzebowali następujących kroków:
Listing 4.5: Tworzenie obrazu startowego |
(Tworzenie obrazu etherboot) # emerge mknbi # cd /boot # mkelf-linux -params="root=/dev/ram0 init=/linuxrc ip=dhcp" kernel... initrd... > etherboot.img (Tworzenie obrazu OpenBoot/SPARC64 TFTP) # emerge sparc-utils # cd /boot # elftoaout kernel... -o kernel.aout # piggyback64 kernel.aout System.map-... initrd-... # mv kernel.aout openboot.img (To jest obraz startowy) (PXE nie wymaga większej ilości kroków, jądro oraz initrd mogą być używane tak jak są) |
W końcu, kopiujemy to jądro na serwer TFTP. Szczegóły zależą od używanej architektury i wykraczają poza ten przewodnik. Po więcej informacji należy spojrzeć do dokumentacji odpowiedniej platformy.
Aby ustawić zasoby współdzielone NFS, które zawierają płytę instalacyjną, używamy urządzenia pseudo sieci (ang. loop device), aby zamontować obraz ISO, po czym kopiujemy zawartość płyty na udostępnione zasoby NFS. Ponieważ wszystkie pliki tar.gz, które znajdują się w katalogu /nfs/livecd/add/, zostaną wypakowane przez skrypty genkernela, więc jedyne co nam pozostało to skopiować plik modules-X.Y.Z.tar.gz do katalogu /nfs/livecd/add/.
Listing 4.6: Przygotowywanie zasobów współdzielonych NFS |
(Tu zakładamy, że /nfs/livecd jest wyeksportowanym zasobem współdzielonym NFS) # mount /tmp/gentoo-livecd.iso /mnt/cdrom -o loop # cp -p /mnt/cdrom /nfs/livecd # umount /mnt/cdrom (Kopiujemy modules.tar.gz do /add) # mkdir /nfs/livecd/add # cp /tmp/modules-X.Y.Z.tar.gz /nfs/livecd/add |
Obrazy netboot zażądają od serwera DHCP adresu IP oraz parametru root-path. Obydwa mogą być określone za pomocą adresu MAC, służącego do identyfikacji maszyn:
Listing 4.7: Przykładowe ustawienie pliku dhcpd.conf na kliencie |
...
host netbootableMachine {
hardware ethernet 11:22:33:44:55:66;
fixed-address 192.168.1.10;
option root-path "192.168.1.2:/nfs/livecd";
}
(Tu 192.168.1.2 jest serwerem NFS, podczas gdy 192.168.1.10 jest
adresem IP od maszyny netbooted)
...
|
Samo Netbooting jest bardzo specyficzne w zależności od platformy. Ważną częścią jest określenie parametrów ip=dhcp oraz init=/linuxrc w wierszu polecenia jądra, ponieważ załączą one interfejs sieciowy oraz powiedzą skryptom initrd, aby zamontowały płytę instalacyjną poprzez NFS. Poniżej znajdują się wskazówki dla konkretnych platform:
Listing 4.8: Rozkazy Netbooting |
# Etherboot - wkładamy dyskietkę etherboot po czym uruchamiamy ponownie komputer. # Wiersz polecenia jądra został określony podczas budowania obrazu) # Sparc64 - Wciskamy kombinację klawiszy Stop-A, w wierszu polecenia boot wpisujemy) ok boot net ip=dhcp init=/linuxrc # PXE - Ustawiamy pxelinux (część syslinux), następnie tworzymy # pxelinux.cfg (domyślnie), który będzie zawierać: DEFAULT gentoo TIMEOUT 40 PROMPT 1 LABEL gentoo KERNEL kernel-X.Y.Z APPEND initrd=initrd-X.Y.Z root=/dev/ram0 init=/linuxrc ip=dhcp |
Celem genkernela jest dostarczenie (łatwiejszej) alternatywnej metody kompilacji jądra. Jak zwykle mamy wolność wyboru czy chcemy czy nie chcemy automatyzować proces kompilacji jądra.
Materiał udostępniany na podstawie licencji Creative Commons - Attribution / Share Alike.