background image

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

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 

background image

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

�����������������������������������

������������������������������������

����������

��������������������

��������������������������������������

��������������������������

���������������������������������������

background image

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

background image

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

background image

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

background image

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