Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
46
grudzień 2009
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
47
www.lpmagazine.org
lin
ux
@
so
ftw
ar
e.
co
m
.p
l
Linux Kernel: Podróż
do wnętrza systemu
Część druga (2/7): Zaawansowana konfiguracja
i rozruch systemu
W pierwszej części cyklu artykułów omawiających budowę, konfigurację oraz programowanie jądra
systemu Linux, zapoznaliśmy się z podstawowymi opcjami, pozwalającymi na dostosowanie jądra
do naszych wymagań. W tym artykule zajmiemy się dokładnym opisem najważniejszych aspektów
konfiguracji kernela, opisem procesu uruchamiania systemu oraz wykorzystaniem łatek (patchy) w celu
aktualizacji źródeł jądra. Zapraszam do lektury!
Rafał Kułaga
W
pierwszej części cyklu, powiedzieli-
śmy, iż jądro systemu Linux należy do
najbardziej złożonych programów ja-
kie kiedykolwiek napisano. Składa się
z ponad 12 milionów linijek kodu, zawierających imple-
mentację podstawowych funkcji systemu operacyjnego,
obsługę stosów wielu protokołów telekomunikacyjnych
oraz sterowników urządzeń. Taka ilość kodu może wy-
dawać się przytłaczająca, zwłaszcza dla początkujących
użytkowników systemu Linux.
Jednym z najważniejszych problemów, jakie napotyka-
my w trakcie wyboru składników jądra, jest określenie za-
leżności pomiędzy posiadanym sprzętem, a fragmentami ją-
dra niezbędnymi w celu jego poprawnej obsługi. Problem ten
może być szczególnie dotkliwy dla osób przyzwyczajonych
do systemów z rodziny Microsoft Windows, w których pro-
ces instalacji sterowników jest w zasadzie automatyczny. W
przypadku systemów Linuksowych jest to proces znacznie
bardziej skomplikowany, często wymagający długich poszu-
kiwań – okazuje się bowiem, iż część producentów nie do-
starcza sterowników dla tego systemu. Dostępne są jednak
narzędzia, pozwalające określić producenta i typ zainstalo-
wanego w systemie sprzętu, dzięki czemu odpowiednich ste-
rowników będziemy mogli poszukać w internecie.
W tym artykule zajmiemy się wszystkimi najważniej-
szymi aspektami konfiguracji jądra. W przeciwieństwie do
pierwszej części, której głównym zadaniem było wprowa-
dzenie Czytelnika do tematyki związanej z rekompilacją ją-
dra, omówimy znaczenie najważniejszych opcji poszcze-
gólnych kategorii w menu programu konfiguracyjnego ją-
dra. Omówimy również podstawowe zagadnienia związa-
ne z cross-kompilacją jądra Linux (umożliwiającą jego wy-
korzystanie w systemach niekompatybilnych z architekturą
x86) oraz przyjrzymy się procesowi rozruchu systemu. Pew-
na uwaga zostanie również poświęcona konfiguracji usług
uruchamianych przy starcie systemu oraz poziomom uru-
chamiania, pomimo iż są to zagadnienia dość luźno związa-
ne z tematyką rekompilacji jądra.
Patchowanie źródeł jądra
Archiwum zawierające źródła jądra Linux ma rozmiar prze-
kraczający 30 MB. Nie jest to zbyt dużo, jeżeli weźmiemy
pod uwagę przepustowość dostępnych obecnie łączy inter-
netowych. Z drugiej strony, pobieranie pełnych źródeł jądra
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
46
grudzień 2009
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
47
www.lpmagazine.org
systemu za każdym razem, gdy pojawią się ja-
kiekolwiek poprawki, powoduje niepotrzebne
obciążenie serwerów. Z tego względu, warto za-
poznać się z narzędziem patch, pozwalającym na
uaktualnienie posiadanych źródeł, bez potrzeby
pobierania dużej ilości danych z internetu.
Patch i diff
Działanie programu patch polega na wykorzy-
staniu opisów różnic pomiędzy dwoma wer-
sjami pliku – nowszą oraz starszą. Dzięki temu
oszczędzamy dużą ilość miejsca, ponieważ nie
powielamy tej części danych, która pozostała
w niezmienionej postaci. Do wygenerowania
pliku łatki wykorzystujemy narzędzie diff.
Aby lepiej zrozumieć zasadę działania na-
rzędzi diff i patch, posłużymy się przykładem.
Załóżmy, iż dysponujemy dwoma plikami o na-
zwach old i new. Zawartość pliku old jest nastę-
pująca:
Ala ma kota.
Natomiast pliku new:
Ala ma psa i kota.
Plik z łatką generujemy przy pomocy następu-
jącego polecenie
diff -a old new > lata.patch
Aktualizację zawartości pliku old przeprowadzi-
my przy użyciu polecenia:
patch old lata.patch
Po sprawdzeniu zawartości plików old i new
okazuje się, iż są one identyczne. W naszym
przypadku plik lata.patch ma rozmiar więk-
szy od pliku new. Jednak w przypadku bar-
dzo wielu plików o dużych rozmiarach,
w których wprowadzane są jedynie niewiel-
kie zmiany, narzędzia diff i patch sprawdza-
ją się doskonale.
Oczywistą konsekwencją zasady działania
narzędzi patch i diff jest to, iż łatka określa róż-
nicę pomiędzy dwoma dokładnie określonymi
wersjami pliku. Oznacza to, iż wykorzystując
program patch do aktualizacji źródeł jądra, bę-
dziemy musieli dobrać odpowiedni plik łatki na
podstawie znajomości posiadanej wersji źródeł
oraz wersji, do której chcemy je zaktualizować.
Patchowanie źródeł jądra
Patche do źródeł jądra dostępne są na stronie
http://kernel.org/. Zanim zaczniesz szukać od-
powiedniego dla Twoich potrzeb pliku, zapo-
znaj się z istniejącymi rodzajami łatek. Dostęp-
ne są trzy typy patchy:
• Łatka stabilnej wersji jądra – używana do
aktualizacji jądra od wersji bazowej (np.
2.6.31) do określonej wersji stabilnej (np.
2.6.31.3);
• Łatka bazowej wersji jądra – używana do
aktualizacji jądra od starszej wersji bazo-
wej (np. 2.6.30) do nowszej wersji bazo-
wej (np. 2.6.31). Pamiętaj, iż łatka ta nie
będzie działać dla wersji 2.6.30.X i wersji
2.6.31.Y;
• Łatki przyrostowe – używane do aktuali-
zacji jądra od starszej wersji stabilnej (np.
2.6.31.2) do nowszej wersji stabilnej (np.
2.6.31.3). W nazwie łaty przyrostowej
wyszczególnione są obydwie wersje (np.
patch-2.6.31.2-3).
Określenie odpowiedniego patcha gwarantuje
poprawność kodu jądra po aktualizacji.
Wszystkie wymienione typy łatek dostęp-
ne są pod adresem http://www.kernel.org/pub/
linux/kernel/v2.6/. Łaty przyrostowe dostępne są
w podkatalogu incr. Określenie nazwy pliku za-
wierającego odpowiedniego patcha nie powin-
no sprawić Czytelnikowi większego problemu.
W razie problemów, odwołaj się do przykładów
aktualizacji, przedstawionych na Rysunku 1. Po
pobraniu i rozpakowaniu pliku łatki, przekopiuj-
my go lokalizacji, w której znajduje się katalog
zawierający źródła jądra. Po przejściu do głów-
nego katalogu ze źródłami, wydajmy polecenie:
patch -p1 < ../patch-x
Pojawiające się komunikaty informują o plikach,
w których wprowadzane są zmiany. Po zakończe-
niu działania programu patch, możesz sprawdzić
poprawność aktualizacji przy użyciu polecenia:
head -n 5 Makefile
Jeżeli wyświetlony numer wersji odpowiada do-
celowej wersji jądra, oznacza to, iż aktualiza-
cja przebiegła pomyślnie. W takim przypadku,
możesz przystąpić do konfiguracji, a następnie
kompilacji jądra.
Przebieg rozruchu systemu
Pod pojęciem rozruchu systemu Linux mamy
na myśli ogół procesów zachodzących od wy-
brania przez użytkownika odpowiedniej pozy-
cji w menu programu rozruchowego, do mo-
mentu rozpoczęcia logowania. W trakcie roz-
ruchu systemu ma miejsce wiele akcji, zwią-
zanych z wczytaniem jądra systemu do pamięci
i jego podstawową inicjalizacją oraz urucho-
mieniem usług odpowiadających danemu po-
ziomowi uruchamiania (Runlevel).
Szczegóły rozruchu systemu są w dużym
stopniu zależne od architektury sprzętowej.
Z najciekawszymi zagadnieniami związanymi
z procesem uruchamiania systemu mamy do
czynienia w przypadku systemów wbudowa-
nych – w przypadku klasycznej architektury
x86 proces ten przebiega bardzo podobnie na
wszystkich urządzeniach.
Niezależnie od zastosowanej architektury
sprzętowej, proces rozruchu systemu składa się
z trzech głównych kroków (Rysunek 2):
• Wczytanie obrazu jądra do pamięci po-
przez program rozruchowy – proces ten
pozostaje w ścisłej zależności od zastoso-
wanego sprzętu. Etap ten kończy się uzy-
skaniem minimalnego środowiska urucho-
mieniowego, w którym możliwa jest dalsza
inicjalizacja jądra;
Rysunek 1.
Zastosowanie różnych rodzajów patchy w celu aktualizacji źródeł jądra
�������������
��������������
���������������
�������������
������������
�������������
���������������
����������������
���������������
���������������
����������������
Rysunek 2.
Podstawowe etapy rozruchu syste-
mu Linux
�����������������������������������
������������������������������������
����������
��������������������
��������������������������������������
��������������������������
���������������������������������������
48
grudzień 2009
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
49
www.lpmagazine.org
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
• Skok do części kodu jądra charakterystycz-
nej dla danej architektury – proces ten ma
na celu przeprowadzenie podstawowej
konfiguracji jądra, w sposób charaktery-
styczny dla danej architektury sprzętowej;
• Skok do głównej części jądra (niezależnej
od platformy sprzętowej) – proces ten ma
na celu dokończenie inicjalizacji pozosta-
łych podsystemów jądra oraz przejście do
standardowego trybu działania, w którym
możliwe jest uruchomienie usług i proce-
sów przestrzeni użytkownika.
• Uruchomienie procesów odpowiadających
domyślnemu poziomowi uruchamiania – za-
danie to realizowane jest przez program init.
Zajmiemy się teraz opisem przebiegu poszcze-
gólnych kroków.
Wczytanie obrazu jądra do pamięci
Po włączeniu komputera, inicjalizacji BIOS i uru-
chomieniu programu rozruchowego, użytkownik
zazwyczaj proszony jest o wybranie jednego z
systemów operacyjnych, których lista zdefinio-
wana jest w odpowiednim pliku. W przypadku
komputerów, na których zainstalowanych jest
kilka różnych systemów operacyjnych, proces
ten może przebiegać zupełnie inaczej, w zależno-
ści od wyboru użytkownika. W przypadku syste-
mów Linuksowych, różne pozycje w menu pro-
gramu rozruchowego mogą odpowiadać plikom
zawierającym różne obrazy jądra systemu.
Proces wczytywania obrazu jądra do pa-
mięci ma szczególnie duże znaczenie w przy-
padku systemów wbudowanych opartych na Li-
nuksie. Jego odpowiednia konfiguracja wyma-
ga nie tylko zrozumienia zadań związanych z tą
fazą rozruchu systemu, lecz również znajomo-
ści danej architektury sprzętowej. Wczytanie ją-
dra systemu odbywa się przy użyciu wyspecjali-
zowanych programów rozruchowych, takich jak
U-Boot. Osobom zainteresowanym tą tematyką
polecam zapoznanie się z informacjami dostęp-
nymi na stronach zawartych w ramce W Sieci.
Etap charakterystyczny
dla platformy sprzętowej
Po wczytaniu obrazu jądra Linux do pamięci,
wykonywany jest skok do adresu, pod którym
znajduje się kod maszynowy odpowiedzialny
za przeprowadzenie podstawowej konfiguracji
jądra. Wszystkie opisywane w tym paragrafie
funkcje zdefiniowane są w plikach źródłowych
znajdujących się w katalogach arch/x86/boot/
oraz arch/x86/kernel. Jak można się domyślić,
są to zadania pozostające w ścisłym związ-
ku z architekturą sprzętową, wymagające uży-
cia asemblera danego procesora. Wspomniany
już skok odbywa się do miejsca w pamięci, w
którym znajduje się kod odpowiadający za we-
ryfikację poprawności obrazu jądra w pamię-
ci, określenia rozmiaru dostępnej pamięci sys-
temowej, inicjalizację karty graficznej, reloka-
cję kodu jądra oraz przełączenie procesora w
tryb chroniony.
Po zakończeniu wymienionych zadań,
utworzony zostaje tymczasowy stos jądra oraz
wykonywane są rozmaite czynności związane z
przygotowaniem pamięci oraz rozpakowaniem
obrazu jądra systemu. Następnym krokiem jest
aktywowanie funkcji stronicowania pamięci
oraz finalizacja procesu tworzenia stosu jądra.
Utworzona zostaje również tablica obsługi prze-
rwań – na razie zawierająca jedynie atrapy funk-
cji obsługujących. Określany jest też typ zainsta-
lowanego w systemie procesora.
Etap wysokopoziomowy
Dalsza część procesu inicjalizacji jądra syste-
mu odbywa się już w sposób bardziej niezależny
od platformy sprzętowej. Omówimy tu pokrótce
najważniejsze zadania wykonywane na tym eta-
pie, rozpoczynającym się od wyświetlenia infor-
macji o wersji jądra Linux. Pierwszym krokiem
jest konfiguracja funkcji zależnych od architek-
tury sprzętowej, takich jak obsługa pamięci oraz
stronicowanie. Na przebieg tego procesu ma-
ją wpływ parametry przekazane przy starcie ją-
dra. Następnym krokiem jest pełne przetworzenie
wszystkich parametrów konfiguracyjnych z któ-
rymi jądro zostało wywołane. Więcej informacji
na ten temat znajdziesz w następnym paragrafie.
Po przetworzeniu parametrów konfigura-
cyjnych, inicjalizowane są najważniejsze struk-
tury, niezbędne do pracy systemu operacyjnego,
takie jak: scheduler, tablica przerwań IRQ, ta-
bela procesów, konsola oraz zegar systemowy.
Szczegółowy opis przebiegu poszczególnych
etapów tego procesu jest bardzo skomplikowa-
ny i stanowi raczej temat na osobny artykuł.
Następny krok może okazać się dla Czy-
telnika dość zaskakujący. Polega on bowiem
na sprawdzeniu obecności w sprzęcie znanych
niedoskonałości konstrukcyjnych. Okazuje się,
iż nie tylko oprogramowanie może zawierać
błędy. Przykładem wady konstrukcyjnej, któ-
ra może mieć wpływ na działanie kompute-
ra, jest tzw. Pentium FDIV Bug, polegająca na
niepoprawnym wykonywaniu operacji dziele-
nia liczb zmiennoprzecinkowych (FDIV to in-
strukcja procesora odpowiadająca za dzielenie
liczb zmiennoprzecinkowych). W dzisiejszych
czasach, skutki błędów w budowie procesorów
można korygować za pomocą odpowiednich
aktualizacji mikrokodu (warstwy pośredniej po-
między kodem maszynowym a sprzętem) – jest
to jedno z zadań realizowanych na tym etapie.
Końcowym etapem inicjalizacji jądra jest
utworzenie procesu bezczynności systemowej
(Idle Thread), inicjalizacja sterowników urządzeń
oraz przekazanie kontroli nad dalszą częścią roz-
ruchu systemu procesom przestrzeni użytkowni-
ka (standardowo odbywa się to za pomocą pro-
gramu init znajdującego się w katalogu /sbin).
Init i poziomy działania
Program init służy do uruchomienia wszystkich
pozostałych procesów przestrzeni użytkownika,
niezbędnych do uzyskania kompletnego środowi-
ska roboczego. Init jest rodzicem wszystkich dzia-
łających w systemie procesów, dlatego niemożli-
we jest jego unicestwienie sygnałem SIGKILL.
Init może zostać wywołany w jednym z
sześciu poziomów działania (Runlevel), ozna-
czonych liczbami od 0 do 6. Poszczególne po-
ziomy odpowiadają:
Rysunek 3.
Zastosowanie narzędzi dmesg i grep w celu zdobycia informacji o urządzeniach USB zainsta-
lowanych w systemie
48
grudzień 2009
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
49
www.lpmagazine.org
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
• 0 – zatrzymanie systemu (nie należy używać
tego poziomu jako poziomu startowego);
• 1 – tryb jednego użytkownika;
• 2/3/4/5 – tryby określane przez dystrybucję;
• 6 – ponowne uruchomienie systemu (nie
należy używać tego poziomu jako poziomu
startowego).
Znaczenie poziomów działania 2–5 zależne jest
od używanej dystrybucji. Zazwyczaj znajdują się
wśród nich dwa poziomy odpowiadające pełne-
mu trybowi wielu użytkowników: graficznemu
oraz tekstowemu. Domyślny poziom działania
określony jest w pliku /etc/inittab w linii:
id:2:initdefault:
W tym przypadku jest nim poziom 2. Poziom
działania można również zmienić w trakcie pra-
cy systemu, przy pomocy polecenia
init N
,
gdzie
N
– żądany poziom działania (wymaga-
ne są w tym celu uprawnienia użytkownika ro-
ot). Przy pomocy polecenia
runlevel
spraw-
dzimy aktywny poziom. Powinniśmy pamię-
tać, aby wyłączyć automatyczny start usług, z
których nie korzystamy. Większość dystrybucji
zawiera specjalne narzędzia graficzne, pozwala-
jące na wygodną modyfikację tego aspektu pra-
cy systemu operacyjnego, jeżeli jednak zmian
wolisz dokonać własnoręcznie, to odpowied-
nie pliki konfiguracyjne znajdziesz w katalogu
/etc/rcN.d, gdzie N – poziom działania systemu.
Przekazywanie argumentów
przy rozruchu systemu
Po uruchomieniu systemu operacyjnego Linux,
komunikacja z jądrem może odbywać się mię-
dzy innymi za pomocą plików znajdujących się
w katalogach /proc i /sys. Pozwala to aktywo-
wać i zmieniać parametry działania podsyste-
mów jądra oraz odczytywać informacje o za-
instalowanym sprzęcie i dostępnych zasobach.
Przykładem może być plik /proc/cpuinfo, w któ-
rym zawarte są informacje o zainstalowanym w
systemie procesorze.
Zastosowanie programu rozruchowego da-
je nam również możliwość wpłynięcia na pro-
ces inicjalizacji jądra poprzez podanie odpo-
wiednich parametrów. Dzięki temu, możemy
np. przesłać za pośrednictwem sieci komunika-
ty wyświetlane przy uruchamianiu systemu na
inną maszynę. Przy użyciu odpowiednich para-
metrów mamy również możliwość wyłączenia
pewnych podsystemów jądra (np. obsługi AC-
PI) w celu określenia elementów uniemożliwia-
jących poprawne załadowanie systemu. Argu-
menty podawane przy wczytywaniu jądra ma-
ją również ogromne znaczenie w procesie te-
stowania i debugowania systemów wbudowa-
nych opartych na systemie Linux. W przypad-
ku większości urządzeń tego typu nie mamy bo-
wiem urządzeń wyjściowych, pozwalających na
analizę wyświetlanych komunikatów. W takiej
sytuacji, jedynym wyjściem jest zastosowanie
komputera podłączonego do systemu wbudo-
wanego za pomocą interfejsu RS-232.
Najważniejsze opcje konfiguracyjne ją-
dra zostały zawarte w Tabeli Przykładowe pa-
rametry przekazywane przy rozruchu syste-
mu. Pamiętaj, że do ich poprawnej interpre-
tacji konieczne jest zachowanie odpowied-
niej wielkości znaków. W przypadku progra-
mu rozruchowego GRUB, parametry mogą zo-
stać zapisane na stałe w pliku konfiguracyjnym
/etc/grub/menu.lst lub podawane bezpośrednio
przy uruchomieniu systemu.
Przygotowanie
do konfiguracji jądra
Zanim przejdziemy do opisu zaawansowanej
konfiguracji jądra systemu, warto zastanowić
się, jakie narzędzia będą pomocne w ustaleniu
jakich sterowników urządzeń potrzebujemy.
Problem ten może wydawać się banalny – każ-
dy przecież wie, jaki sprzęt zainstalowany jest w
jego komputerze. Okazuje się jednak, iż w przy-
padku taniego sprzętu producentów z dalekiego
wschodu zazwyczaj nie możemy liczyć na ste-
rowniki dostarczane przez producenta. Co wię-
cej, urządzenia takie nie mają nawet konkret-
nych nazw, pozwalających na poszukanie odpo-
wiednich informacji w internecie.
Określanie zainstalowanych urządzeń
Większość dystrybucji i środowisk graficznych
zawiera narzędzia, pozwalające na wyświetlenie
listy urządzeń obecnych w systemie oraz moni-
torowanie ich pracy. Programy te sprawdzą się
doskonale w przypadku, gdy w systemie zain-
stalowane są odpowiednie sterowniki. Jak więc
zdobyć informacje o sprzęcie, który nie został
rozpoznany przez system i dla którego nie dys-
ponujemy odpowiednimi sterownikami?
Dmesg – komunikaty jądra
Jednym z podstawowych narzędzi, pozwalają-
cych na odczytywanie komunikatów diagno-
stycznych jądra, w tym informacji o podłącza-
nych urządzeniach jest dmesg. Po jego wywoła-
niu, Twoim oczom ukaże się bardzo duża liczba,
niekoniecznie czytelnych informacji. Kluczem
do pełnego wykorzystania możliwości progra-
mu dmesg jest odpowiednia obróbka wyświetlo-
nych danych. Przeszukiwanie wydruków sporzą-
dzonych przez program dmesg byłoby niezwy-
kle czasochłonne, gdybyśmy nie stosowali na-
rzędzi pomocniczych. Jednym z nich jest grep,
dzięki któremu możemy przefiltrować strumień
danych, wyświetlając jedynie linie spełniające
określone wyrażenie regularne. Przykładem za-
stosowania programów dmesg i grep w celu po-
zyskania informacji o urządzeniach obecnych w
systemie może być polecenie:
dmesg | grep -i usb
Jego wykonanie spowoduje wyświetlenie wszyst-
kich linii, zawierających odniesienia do urządzeń
i kontrolerów USB (Rysunek 3). Operator
|
służy
do przekierowania strumienia danych wygenero-
wanego przez program dmesg do narzędzia grep.
Z pewnością zauważyłeś, że informacje uzy-
skiwane przy użyciu programu dmesg są mało
czytelne. Siłą tego programu jest jednak to, iż wy-
świetla on wszystkie komunikaty diagnostyczne
i informacyjne jądra, przez co pozwala na zdo-
bycie identyfikatora producenta i modelu sprzę-
tu. Informacje te możemy następnie wykorzystać
przy poszukiwaniu sterowników w internecie.
Lspci i lsusb – co na magistralach piszczy
Lspci i lsusb to dwa bardzo podobne programy,
pozwalające na uzyskanie informacji o obec-
nych w systemie urządzeniach, podłączonych
do magistral PCI i USB (Rysunek 4).
W przeciwieństwie do programu dmesg,
lspci i lsusb wyświetlają informacje w posta-
ci, która nadaje się do analizy przez użytkow-
Tabela 1.
Przykładowe parametry przekazywane przy rozruchu systemu
Opcja konfiguracyjna
Zastosowanie
moduł.parametr= wartość
Ustawienie wartości parametru
parametr
modułu
moduł
na
wartość
noexec= on/off
Włączenie lub wyłączenie funkcji blokowania wykonania obszarów pamięci
resume= urządzenie
Wznowienie pracy systemu przy użyciu danych z urządzenia
urządzenie
maxcpus= N
Ustawienie maksymalnej liczby procesorów wykorzystywanych przez
system SMP na
N
ramdisk_size= rozmiar
Ustawienie rozmiaru ramdiska na
rozmiar
root= urządzenie
Wybór urządzenia na którym znajduje się główny system plików
acpi= force/off
Wymuszenie włączenia systemu ACPI (
force
) lub jego dezaktywacja (
off
)
pci= off
Wyłączenie obsługi magistrali PCI
loglevel= 0-7
Ustawienie poziomu informowania o błędach; 0 – najniższy, 7 – najwyższy
50
grudzień 2009
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
51
www.lpmagazine.org
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
nika. Uzyskane informacje o zainstalowa-
nych urządzeniach możemy następnie wy-
korzystać w celu poszukiwania sterowników
w internecie.
Co warto zbudować jako moduł?
Początkujący często zastanawiają się, jakie
elementy jądra należy zbudować jako część
statyczną jądra, a które warto skompilować ja-
ko dynamicznie dołączane moduły (więcej in-
formacji o modułach i modularnej budowie ją-
dra znajdziesz w pierwszej części cyklu). Jak
w wielu przypadkach, nie ma tu jedynie po-
prawnych odpowiedzi – przydatność danego
mechanizmu jądra lub sterownika jest ściśle
uzależniona od wymagań danego komputera
lub środowiska w jakim funkcjonuje.
Książkowym przykładem mechanizmu
który może być zbudowany zarówno jako mo-
duł jak i część statyczna, jest obsługa druko-
wania. Jeżeli do Twojego komputera jest na
stałe podłączona drukarka i często z niej ko-
rzystasz, to zdecydowanie najlepszym rozwią-
zaniem jest skompilowanie kodu odpowie-
dzialnego za obsługę wydruku jako część sta-
tyczną jądra. Jeżeli jednak rzadko korzystasz
z drukarki, warto zbudować odpowiedni frag-
ment jądra jako moduł.
Nie tylko sterowniki urządzeń mogą zostać
skompilowane jako moduły. Duża część mecha-
nizmów jądra, takich jak np. specyficzne funk-
cje związane z obsługą mechanizmu filtrowania
pakietów i NAT, może również zostać zbudowa-
na jako dynamiczny fragment jądra.
Obsługa modułów
W celu obsługi modułów jądra obecnych w sys-
temie, korzystamy z zestawu poleceń, do któ-
rych wykonania niezbędne są uprawnienia użyt-
kownika root. Najważniejsze z nich to:
• insmod – służący do wczytania modułu i je-
go połączenia z działającym jądrem;
• rmmod – służący do usunięcia wczytanego
modułu jądra;
• depmod – służący do określenia zależności
pomiędzy modułami;
• lsmod – służący do wyświetlenia listy
wczytanych modułów;
• modprobe – służący do wczytywania mo-
dułów z uwzględnieniem istniejących po-
między nimi zależności. Użycie programu
modprobe spowoduje automatyczne wczy-
tanie wszystkich modułów od których zale-
ży praca wybranego przez nas modułu.
Skompilowane moduły są zazwyczaj przecho-
wywane w katalogu /lib/modules.
Konfiguracja jądra
W pierwszej części cyklu, opisaliśmy krótko za-
wartość każdej z kategorii opcji programu kon-
figuracyjnego jądra. Zajmiemy się teraz dokład-
niejszym opisem zawartości poszczególnych me-
nu. Nie będziemy nawet podejmować próby opi-
sania wszystkich najważniejszych opcji konfigu-
racyjnych, ponieważ jest ona skazana na porażkę
– liczba parametrów konfiguracyjnych skutecz-
nie uniemożliwia ich opisanie w artykule.
Jednym z najlepszych sposobów poznania
opcji zawartych w programie konfiguracyjnym
jądra, jest przeglądnięcie ich wszystkich. Jeżeli
będziesz miał wątpliwości co do znaczenia kon-
kretnej pozycji, w menu programu konfiguracyj-
nego wybierz opcję Help.
General Setup
W kategorii tej zawarte są opcje dotyczące roz-
maitych aspektów pracy systemu: komunikacji
międzyprocesowej, obsługi partycji wymiany,
sposobu kompresji jądra oraz obsługi przestrze-
ni nazw jądra (Rysunek 5).
Enable loadable module support
W kategorii tej zawarte są opcje dotyczące konfi-
guracji obsługi modułów jądra, takie jak np. ob-
sługa odłączania modułów (Module unloading).
Enable the block layer
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi urządzeń blokowych oraz sche-
dulerów operacji wejścia/wyjścia (IO schedu-
lers). Możemy tu aktywować obsługę dużych
urządzeń blokowych i plików (powyżej 2 TB).
Całkowite wyłączenie tej kategorii spowoduje,
że wykorzystanie w systemie urządzeń bloko-
wych będzie niemożliwe.
Rysunek 4.
Program lspci pozwala na wyświetlenie informacji o zainstalowanych urządzeniach magistrali PCI
Rysunek 5.
Menu General Setup programu konfiguracyjnego jądra
50
grudzień 2009
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
51
www.lpmagazine.org
Jądro Linuksa
Linux Kernel (2/7): Zaawansowana konfiguracja i rozruch systemu
Processor type and features
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi procesorów. Zrozumienie ich
znaczenia wymaga od użytkownika przynajm-
niej podstawowej wiedzy na temat architektury
procesorów, tak więc nie będziemy ich tu opi-
sywać. Dużo informacji znajdziesz w pomocy
elementów tej kategorii.
Power management and ACPI options
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi podsystemu ACPI oraz funkcji
zarządzania energią. Podobnie jak w przypadku
kategorii Processor type and features, wymaga-
na jest chociaż podstawowa znajomość działania
funkcji, technik oraz pojęć związanych z ACPI.
Bus options (PCI etc.)
W kategorii tej zawarte są opcje dotyczące konfi-
guracji obsługi magistral (PCI, PCIE, PCMCIA,
ISA itp.). Warto dezaktywować obsługę tych ma-
gistral, których nie używasz. W większości przy-
padków możesz również wyłączyć funkcję Sup-
port for PCI Hotplug, pozwalającą na podłącza-
nie urządzeń PCI w czasie pracy komputera.
Executable file formats/Emulations
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi formatów plików wykonywal-
nych, obsługiwanych przez jądro. W większości
przypadków, w kategorii tej nie ma zbyt wielkie-
go pola do optymalizacji.
Networking support
W kategorii tej zawarte są opcje dotyczące kon-
figuracji mechanizmów sieciowych systemu.
Możemy w niej aktywować obsługę rozmaitego
sprzętu sieciowego, protokołów telekomunika-
cyjnych oraz funkcji związanych z filtrowaniem
pakietów. Wiele informacji dotyczących każdej
z opcji znajdziesz w pomocy.
Device Drivers
W kategorii tej zawarte są opcje dotyczące
konfiguracji sterowników urządzeń. W menu
tym możesz dokonać wielu zmian, skutkują-
cych zwiększeniem wydajności pracy systemu
i zmniejszeniem obrazu jądra. Punktem wyj-
ścia do dalszej konfiguracji powinno być wyłą-
czenie obsługi urządzeń, których na pewno nie
będziesz używał. Następnie, warto przyjrzeć się
znaczeniu poszczególnych funkcji i zdecydo-
wać, czy warto zbudować je jako moduły.
Firmware drivers
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi firmware urządzeń. W więk-
szości są to funkcje charakterystyczne dla okre-
ślonych producentów sprzętu komputerowego.
File systems
W kategorii tej zawarte są opcje dotyczące
konfiguracji obsługi systemów plików. Kon-
figuracja tego aspektu pracy systemu daje du-
że możliwości poprawy wydajności i zmniej-
szenia obrazu jądra. Znaczenie funkcji tej ka-
tegorii omówimy szczegółowo w następnej
części cyklu.
Kernel hacking
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi funkcji przydatnych przy two-
rzeniu kodu jądra. Na większości komputerów
można śmiało pominąć tą kategorię.
Security options
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi funkcji związanych z zabezpie-
czeniami na poziomie jądra systemu (np. SELi-
nux). Tematem tym zajmiemy się dokładnie w
następnych częściach cyklu.
Cryptographic API
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi funkcji związanych z krypto-
grafią i algorytmami szyfrującymi. Tematem
tym zajmiemy się dokładnie w następnych czę-
ściach cyklu.
Virtualization
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi funkcji związanych z obsługą
wirtualizacji. Jeżeli nie jesteś zainteresowany tą
tematyką, lub korzystasz z innego oprogramo-
wania do wirtualizacji, to możesz śmiało wyłą-
czyć tą funkcję.
Library functions
W kategorii tej zawarte są opcje dotyczące kon-
figuracji obsługi prostych funkcji bibliotecz-
nych, wykorzystywanych przez jądro. Jakiekol-
wiek zmiany w tym menu nie są zalecane.
Wykorzystanie
istniejących konfiguracji
Przekonałeś się, iż konfiguracja jądra może być
procesem bardzo czasochłonnym. Z tego wzglę-
du, często istnieje potrzeba zapisania pliku zawie-
rającego konfigurację w bezpiecznym miejscu,
w celu późniejszego ponownego wykorzystania.
Konfiguracja jądra zapisana jest w pliku
.config. Dane zapisane w tym pliku są oczywi-
ście charakterystyczne dla danej wersji jądra.
Z tego względu, aby zastosować pliki utworzo-
ne w programach konfiguracyjnych starszych
wersji, musimy skorzystać z odpowiedniego
narzędzia, pozwalającego na zmianę zapisa-
nych w nim danych.
W trakcie tworzenia nowej konfigura-
cji opartej na ustawieniach zapisanych w pli-
ku .config wcześniejszej wersji, będziemy mu-
sieli odpowiedzieć na pytania dotyczące konfi-
guracji wszystkich opcji, które pojawiły się w
nowszej wersji. Możemy wykorzystać w tym
celu dwa polecenia:
make oldconfig
i
make si-
lentoldconfig
.
make oldconfig
powoduje wyświetlenie
wszystkich opcji konfiguracyjnych, a następnie
automatyczne udzielenie odpowiedzi na te, któ-
re obecne już były w starszej wersji jądra. Użyt-
kownik musi jedynie odpowiedzieć na pytania,
dotyczące nowych opcji jądra.
make silentoldconfig
działa w sposób
bardzo podobny do
make oldconfig
, z tą różni-
cą, iż nie wyświetla wszystkich pytań dotyczą-
cych konfiguracji jądra, jedynie te, które pojawi-
ły się w nowszej wersji.
Niezależnie od zastosowanego polecenia,
wykorzystanie istniejącej konfiguracji zawsze
poprzedzamy przekopiowaniem pliku .config do
katalogu ze źródłami jądra.
W następnej części
W następnej części cyklu zajmiemy się opi-
sem zarządzania zasobami poprzez jądro Li-
nux. Dowiemy się, w jaki sposób kernel przy-
dziela aplikacjom zasoby, jak określana jest
kolejność zadań wykonywanych przez pro-
cesor oraz jak działa scheduler. Zajmiemy się
również systemami plików obsługiwanymi
przez jądro Linux. Dowiemy się, w jaki spo-
sób dane przechowywane są na dyskach twar-
dych, jak odbywa się obsługa partycji wymia-
ny oraz poznamy zastosowania, w których naj-
lepiej sprawdzą się poszczególne systemy pli-
ków. Do usłyszenia!
• Strona główna jądra Linux
– http://www.kernel.org/
• Strona KernelTrap
– http://kerneltrap.org/
• Linux w systemach wbudowanych
– http://www.linuxfordevices.com/s
W Sieci
Autor interesuje się bezpieczeństwem sys-
temów informatycznych, programowaniem,
elektroniką, muzyką rockową, architekturą
mikroprocesorów oraz zastosowaniem Li-
nuksa w systemach wbudowanych.
Kontakt z autorem: rl.kulaga@gmail.com
O autorze