W Gentoo dostępne są dwie metody konfiguracji jądra. Automatyczna (genkernel) i ręczna. Automatyczna metoda może wydawać się nieco łatwiejsza, ale większość użytkowników i tak wybiera ręczną konfigurację jądra. Powody takiej decyzji mogą być różne, zwykle wymienia się większą elastyczność ręcznej konfiguracji, mniejszy rozmiar jądra, krótszy czas kompilacji, możliwość nauki i nadmiar wolnego czasu.
W tym tekście nie ma instrukcji dotyczących metody automatycznej. Jeśli ktoś woli użyć genkernela do kompilacji i instalacji jądra, powinien skorzystać z opisu Konfiguracji jądra genkernel.
Nie opiszemy tu całego procesu konfiguracji od początku do końca. W wielkim stopniu zależy on bowiem od samodzielności użytkownika i jego poziomu wiedzy o używanym sprzęcie. Zamiast tego opiszemy tu najczęściej pojawiające się problemy.
Dokument ten dotyczy instalacji nowszych jąder dla najbardziej popularnych architektur. Niektóre jego fragmenty mogą nie dotyczyć starszych jąder i egzotycznego sprzętu. Większość treści powinna jednak pozostać wspólna.
Zakładamy, że użytkownik posiada źródła jądra Linux na twardym dysku (w katalogu /usr/src), że potrafi dostać się do programu konfigurującego jądro za pomocą polecenia menuconfig i że potrafi się po nim poruszać. Ten dokument nie jest skierowany do osób, które nie spełniają tych warunków.
Cały proces jest stosunkowo prosty. Użytkownikowi przedstawiana jest pewna ilość opcji pogrupowanych w kilkustopniowych menu i musi on wybrać te z nich, które dotyczą jego sprzętu.
Jądro posiada domyślną konfigurację, która jest ustawiana przy pierwszym uruchomieniu menuconfig na konkretnym zestawie źródeł. Domyślne opcje są skonfigurowane w bardzo dobry sposób tak, aby były odpowiednie dla większości użytkowników zmuszając ich jedynie do drobnych poprawek konfiguracji. Nie należy wyłączać żadnych domyślnych opcji jeśli nie wie się dokładnie do czego one służą i jakie są konsekwencje ich wyłączenia.
Jeśli jest to pierwsza konfiguracja jądra w życiu, nie należy zmieniać za dużo, a raczej pozostać przy jak największej ilości domyślnych opcji. Należy również być bardzo uważnym, niektóre części konfiguracji są kluczowe dla prawidłowego uruchomienia się systemu.
Wbudowane sterowniki czy moduły
Większość opcji można oznaczyć na trzy sposoby. Jako takie, które wcale nie zostaną zbudowane, takie, które będą wbudowane w jądro na stałe (Y) i takie, które zostaną zbudowane jako moduły (M). Moduły znajdują się w osobnym katalogu na twardym dysku, w odróżnieniu od wbudowanych części jądra, które znajdują się wewnątrz jego obrazu.
Pomiędzy sterownikami wbudowanymi i modularnymi istnieje jedna zasadnicza różnica. Poza kilkoma wyjątkami, jądro nie będzie automatycznie ładowało sterowników zbudowanych jako moduły, niezależnie od tego czy są potrzebne czy nie. Wprawdzie inne składniki systemu mogą zażądać załadowania konkretnego modułu, wciąż jednak zalecamy wbudowywanie wszystkich niezbędnych sterowników bezpośrednio w jądro. Dzięki temu obsługa sprzętu będzie dostępna zawsze, niezależnie od okoliczności.
Niektóre opcje po prostu trzeba wbudować na stałe w jądro. Przykładem takiej opcji jest obsługa używanego na partycjach systemu plików. Jeśli korzysta się z ext2 i zbuduje się jego obsługę jako moduł, system się po prostu nie uruchomi, ponieważ nie będzie w stanie odczytać modułu ext2 z partycji, której obsługi nie posiada.
Poza wykryciem architektury systemu, program konfiguracyjny nie przeprowadza żadnych testów sprawdzających jaki sprzęt jest zainstalowany w komputerze. Istnieją wprawdzie domyślne opcje konfiguracyjne dla najczęściej używanego sprzętu, ale zwykle nie mają one zastosowania w konkretnym przypadku i konieczne jest ręczne wybranie obsługi używanego sprzętu.
Wymaga to posiadania pewnej wiedzy na temat używanego komputera, znajomości sprzętu jaki jest w nim zainstalowany. Podstawową sprawą jest informacja o tym, jaki chipset ma płyta główna zainstalowana w komputerze, nie jej konkretna nazwa.
Na szczęście istnieją programy, które umożliwiają wykrycie całego zainstalowanego w komputerze sprzętu. Program lspci (część pakietu sys-apps/pciutils) pozwala zidentyfikować wszystkie karty rozszerzeń podłączone do złącz PCI oraz sprzęt wbudowany w płytę główną, a program lsusb (z pakietu sys-apps/usbutils) pozwala na identyfikację wszystkich urządzeń podłączonych przez porty USB.
Sytuacja jest w pewien sposób skomplikowana przez różne stopnie standaryzacji sprzętu. Jeśli dany komputer nie odbiega za bardzo od domyślnych ustawień, sprzęt po prostu będzie działał. Dyski IDE czy klawiatura i myszka na PS/2 nie są problemem. Problem pojawia się gdy standardy niemal nie istnieją, tak jak na przykład dla kart sieciowych. W takim wypadku trzeba zidentyfikować konkretny model karty sieciowej i wybrać go z długiej listy podobnych urządzeń w odpowiednim menu programu konfiguracyjnego.
Kilka opcji domyślnych zapewnia tylko podstawową obsługę sprzętu, nie pozwalając na wykorzystanie jego pełnych możliwości. Dotyczy to na przykład obsługi chipsetu IDE, której domyślne ustawienia sprawią, że twarde dyski IDE będą wprawdzie działać, ale ich praca będzie bardzo wolna.
Poza obsługą sprzętu, jądro posiada też szereg opcji dotyczących współpracy z różnymi typami oprogramowania. Jednym z przykładów jest obsługa systemów plików, którą trzeba wybrać, aby możliwa była praca na założonych partycjach głównych i dodatkowych (takich jak VFAT czy karty pamięci USB).
Innym przykładem takich możliwości są zaawansowane opcje sieciowe. Aby móc skorzystać z zapór ogniowych czy routingu, konieczne jest zaznaczenie odpowiednich opcji w konfiguracji jądra.
Po lekturze tego krótkiego omówienia podstawowych problemów związanych z konfiguracją jądra, należy przystąpić do identyfikacji używanego sprzętu oraz odszukiwania i włączania jego obsługi w programie konfiguracyjnym jądra.
Pozostała część tego tekstu to próba rozwiązania najczęściej pojawiających się problemów oraz wyjaśnienienia kwestii, które najczęściej powodują dezorientację użytkowników. Powodzenia!
Większość nowych komputerów posiada twarde dyski i napędy CD/DVD oparte na Serial ATA częściej niż na starszym IDE.
Obsługa SATA w Linuksie jest implementowana w nakładce o nazwie libata, która znajduje się pod podsystemem SCSI. Z tego powodu sterowniki SATA znajdują się w tej samej sekcji co sterowniki SCSI. Dodatkowo, wszystkie inne urządzenia przechowujące dane są traktowane jako urządzenia SCSI, a zatem potrzebują obsługi dysków/cd-romów SCSI. Dysk twardy SATA ma w systemie nazwę (na przykład) /dev/sda, a dysk SATA CD/DVD /dev/sr0.
Chociaż większość tych sterowników obsługuje kontrolery SATA, libata nie została napisana tylko dla SATA. W niedalekiej przyszłości wszystkie sterowniki IDE również będą przepisane na libata.
Listing 3.1: Konfiguracja libata |
Device Drivers --->
SCSI device support --->
<*> SCSI device support
<*> SCSI disk support
<*> SCSI CDROM support
SCSI low-level drivers --->
<*> Serial ATA (SATA) support
Z poniższej listy należy wybrać chipset płyty głównej komputera
|
Pomimo pojawienia się urządzeń SATA, dyski IDE wciąż są bardzo popularne i używane przez bardzo wiele osób. IDE to dość typowy sprzęt, zatem Linux obsługuje niemal wszystkie jego typy bez konieczności wybierania jakichkolwiek dodatkowych opcji.
Niestety, IDE to stara technika i w związku w tym nie jest w stanie obsługiwać szybkich transferów jakie zapewniają nowe urządzenia. Sterownik IDE jest ograniczony do prędkości standardu PIO co nie tylko powoduje, że wymiana danych odbywa się stosunkowo wolno, ale też wywołuje duże obciążenie procesora.
Jeśli komputer został wyprodukowany po 1995 roku, jego kontroler IDE powinien posiadać jeszcze jeden standard przesyłu danych bezpośredniego dostępu do pamięci (Direct Memory Access) nazywany zwykle skrótowo DMA. Jest on znacznie szybszy i prawie wcale nie zużywa zasobów procesora. Jeśli system działa strasznie wolno i korzysta się z dysku IDE, najbardziej prawdopodobnym źródłem problemu jest właśnie nieużywanie DMA.
Uwaga: Tak jak wspominaliśmy wcześniej, libata jest dostępne także dla dysków IDE. Użytkownicy libata będą mieli włączone DMA na wszystkich swoich dyskach, także na tych IDE. Nie trzeba nic dodatkowo konfigurować. |
Osoby nieużywające libata dla dysków IDE muszą sprawdzić czy jest włączona obsługa DMA i włączyć ją w razie potrzeby.
Listing 3.2: Sprawdzanie czy DMA jest włączone |
# hdparm -d /dev/hda
/dev/hda:
using_dma = 0 (off)
|
Aby włączyć DMA dla urządzeń IDE, wystarczy zaznaczyć w konfiguracji jądra odpowiedni kontroler IDE.
Listing 3.3: Konfiguracja kontrolera IDE |
Device Drivers --->
ATA/ATAPI/MFM/RLL support --->
<*> ATA/ATAPI/MFM/RLL support
<*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
[*] PCI IDE chipset support
Należy wybrać odpowiedni chipset z poniższej listy
|
USB to szeroko stosowane złącze, które umożliwia podłączenie do komputera dużej ilości różnych zewnętrznych urządzeń peryferyjnych. Jednym z powodów sukcesu USB jest fakt, że jest bardzo ustandaryzowany, chociaż urządzenia kontrolera (host controller devices) nieco się między sobą różnią. Występują ich trzy typy:
Większość komputerów posiada dwa z trzech wymienionych wyżej interfejsów. EHCI (USB 2.0) oraz UHCI lub OHCI (USB 1.1). Ważne jest, aby zaznaczyć w konfiguracji obsługę obu typów kontrolera występujących w komputerze. Wszystkie urządzenia USB 2.0 są kompatybilne z USB 1.1, ale spora część urządzeń USB 1.1 nie działa pod USB 2.0 - bo i po co myszce transfery szybsze niż 1.5mbit na sekundę?
Jeśli nie wybierze się odpowiednich sterowników dla używanych typów USB HCD, porty USB nie będą działały, a podłączone do nich urządzenia nie dostaną zasilania ani nie będą w stanie się komunikować z komputerem.
Dzięki pewnej sztuczce związanej z lspci (z pakietu sys-apps/pciutils) wykrywanie używanych HCD jest banalnie proste. Ignorując kontroler FireWire, który również spełniał warunki zapytania, odczytujemy, że system używa OHCI i EHCI:
Listing 3.4: Wykrywanie typu HCD za pomocą lspci |
# lspci -v | grep HCI 00:02.0 USB Controller: nVidia Corporation CK804 USB Controller (rev a2) (prog-if 10 [OHCI]) 00:02.1 USB Controller: nVidia Corporation CK804 USB Controller (rev a3) (prog-if 20 [EHCI]) 01:0b.0 FireWire (IEEE 1394): Agere Systems FW323 (rev 61) (prog-if 10 [OHCI]) |
Listing 3.5: Konfiguracja USB HCD |
Device Drivers --->
USB support --->
<*> Support for Host-side USB
--- USB Host Controller Drivers
<*> EHCI HCD (USB 2.0) support
<*> OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support
Należy zaznaczyć obsługę używanych w systemie HCD - można zaznaczyć wszystkie trzy jeśli się nie wie, które wybrać
|
Systemy z wieloma procesorami, hiperwątkowość, dwurdzeniowość
Wiele komputerów posiada więcej niż jeden procesor, ale nie zawsze jest to bardzo oczywiste.
We wszystkich tych przypadkach należy zaznaczyć odpowiednie opcje w jądrze, aby wykorzystać maksimum wydajności oferowanej przez taki sprzęt.
Listing 3.6: Konfiguracja wieloprocesorowości |
Processor type and features ---> [*] Symmetric multi-processing support Opcję powyżej należy zaznaczyć w każdym z opisanych powyżej przypadków [*] SMT (Hyperthreading) scheduler support Ta opcja dotyczy procesorów z hiperwątkowością (HT) [*] Multi-core scheduler support (NEW) Ta opcja dotyczy systemów dwurdzeniowych (dual core) |
x86, obsługa dużej ilości pamięci
W związku z ograniczeniami 32-bitowej przestrzeni adresowej architektury x86, domyślna konfiguracja jądra obsługuje maksymalnie 896MB pamięci RAM. Jeśli w komputerze zainstalowano więcej pamięci, tylko 896MB z niej będzie używane do czasu włączenia opcji "High Memory Support".
Uwaga: To ograniczenie występuje tylko na architekturze x86 (IA32). Inne architektury nie mają problemów z obsługą większych ilości pamięci. |
Opcja ta nie jest włączana domyślnie, ponieważ powoduje pewien narzut na wydajność systemu. Nie należy się tym jednak przejmować. Korzyść z posiadania większej ilości pamięci znacznie przewyższe koszta jej obsługi.
Listing 3.7: Obsługa większej ilości pamięci na x86 |
Processor type and features --->
High Memory Support --->
(X) 4GB
( ) 64GB
Opcja 4GB dotyczy wszystkich sytuacji, gdy system posiada mniej niż 4GB pamięci
|
4. Inne dokumenty dotyczące konfiguracji jądra
Jak dotąd omówiliśmy tylko ogólne sprawy i kilka specyficznych problemów związanych z konfiguracją jądra, raczej bez wdawania się w niepotrzebne szczegóły. Niektóre tematy związane z konfiguracją jądra są tak kompleksowe, że wymagają osobnych dokumentów - i takie dokumenty należą do dokumentacji Gentoo.
Dokumenty te mogą sporo pomóc przy konfiguracji tych specyficznych opcji, do których się odnoszą. Jeśli jednak nie jest się doświadczonym użytkownikiem, nie należy za bardzo na ich podstawie zmieniać konfiguracji jądra. Warto zacząć od obsługi podstawowych urządzeń i programów, a dopiero później stopniowo dodawać obsługę dźwięku, drukowania i tym podobnych, gdy już się upewni, że nowe jądro działa.
Zmiany w konfiguracji nie odnoszą skutku
To częsty problem. Użytkownik dokonuje zmian w konfiguracji, ale potem popełnia po drodze jakiś drobny błąd, w rezultacie którego zamiast uruchomić system z jądrem, które właśnie zbudował, uruchamia go z jakiegoś innego obrazu. Wtedy zauważa, że pomimo zmiany w konfiguracji jądra ich problem wciąż istnieje i wnioskuje z tego, że zmiany tej konfiguracji nie wpływają na jego problem.
Proces kompilowania i instalowania jądra nie leży w gestii tego dokumentu, można o nim szczegółowo przeczytać w tekście Aktualizacja jądra w systemie Gentoo. W skrócie proces ten polega na konfiguracji jądra, kompilacji, montowaniu partycji /boot, kopiowaniu na nią obrazu jądra i ponownym uruchomieniu komputera. Jeśli któraś z tych czynności zostanie pominięta, zmiany nie odniosą skutku.
Możliwe jest sprawdzenie czy jądro, z którego uruchomiono system jest tym samym, które znajduje się na dysku, bazując na dacie i godzinie kompilacji. Zakładając, że używana architektura to x86, a źródła jądra są w katalogu /usr/src/linux:
Listing 5.1: Sprawdzanie jądra |
# uname -v #4 SMP PREEMPT Sat Jul 15 08:49:26 BST 2006 Powyższe polecenie wyświetli datę i godzinę skompliowania jądra, z którego uruchomiono system # ls -l /usr/src/linux/arch/i386/boot/bzImage -rw-r--r-- 1 dsd users 1504118 Jul 15 08:49 /usr/src/linux/arch/i386/boot/bzImage Powyższe polecenie wyświetli datę i godzinę skompliowania jądra, które znajduje się na dysku |
Jeśli czas ten różni się o więcej niż dwie minuty, oznacza to, że podczas instalacji jądra popełniono błąd i że obraz jądra, którego się używa nie jest tym, którego chce się używać.
Moduły nie ładują się automatycznie
Jak już wspominaliśmy wcześniej w tym dokumencie, ustawienie jednej z opcji jądra do zbudowania jako moduł (M) zamiast wbudowania jej na stałe (Y) wiąże się ze sporymi utrudnieniami. Warto powtórzyć to ostrzeżenie, gdyż wielu użytkowników ma przez takie postępowanie problemy.
Gdy sterownik jest wbudowany w jądro, jego kod znajduje się bezpośrednio w jego obrazie (bzImage). Kiedy jądro potrzebuje z niego skorzystać, po prostu go ładuje bez potrzeby jakiejkolwiek ingerencji ze strony użytkownika.
Kiedy sterownik budujemy jako moduł, kod znajduje się w zewnętrzym pliku zainstalowanym gdzieś w systemie plików. Kiedy jądro chce z niego skorzystać, nie jest w stanie, ponieważ, z kilkoma wyjątkami, nie robi nic by go najpierw załadować do pamięci. Tę czynność pozostawia użytkownikowi.
Zatem jeśli na przykład obsługa karty sieciowej została zbudowana jako moduł, a następnie okazuje się, że nie działa połączenie sieciowe, najbardziej prawdopodobnym powodem jest to, że moduł ze sterownikiem karty sieciowej nie został załadowany podczas uruchamiania systemu.
Dlatego warto zaoszczędzić sobie tych kilku straconych na naprawy minut i wbudowywać wszystkie sterowniki na stałe w jądro, tak żeby system mógł z nich korzystać za każdym razem gdy są mu potrzebne.
Materiał udostępniany na podstawie licencji Creative Commons - Attribution / Share Alike.