Laboratorium: Systemy operacyjne

Transkrypt

Laboratorium: Systemy operacyjne
Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski
Laboratorium: Systemy operacyjne
Kompilacja jądra w systemie GNU/Linux
1.
Jądro systemowe
Jądro systemowe (z ang. kernel) jest odpowiedzialne za przełączanie jednostki centralnej pomiędzy
poszczególnymi procesami, komunikację z wszelkiego rodzaju urządzeniami wchodzącymi w skład
komputera oraz za zarządzanie pamięcią i partycją wymiany (tzw. partycją swap).
Pierwotna wersja jądra systemu GNU/Linux została napisana w 1991 r. przez fińskiego programistę
Linusa Torvaldsa, który do dziś zajmuje się koordynacją pracy programistów z całego świata nad jego
dalszym rozwojem. Jądro, prawie w całości, zostało opracowane w języku C ze wstawkami napisanymi
w języku Assembler.
2.
Moduły
Moduły służą do odciążenia jądra systemowego poprzez nie ładowanie niepotrzebnych sterowników
urządzeń do pamięci. Przy czym nie chodzi tutaj o niepotrzebne sterowniki np. o sterownik skanera,
którego na wyposażeniu nie ma, ale o takie, które nie są konieczne w danej chwili i mogą zostać
załadowane, kiedy tylko zajdzie potrzeba skorzystania z danego urządzenia. Moduły mają tę zaletę,
że można je dodawać do jądra bez przerywania pracy systemu. Umożliwiają także dodanie obsługi
nowego sprzętu, który akurat został zakupiony bądź dołączony, bez rekompilacji całego jądra. Za pomocą
konsoli modułami można swobodnie operować przy pomocy następujących poleceń:
$
$
$
$
3.
insmod
rmmod
lsmod
depmod
- polecenie przy pomocy którego można załadować dany moduł do pamięci,
- usunięcie (wyłączenie) modułu rezydującego w pamięci,
- wyświetlenie pełnej listy aktualnie załadowanych modułów w systemie,
- utworzenie bazy danych z informacjami o dostępnych w systemie modułach,
które mogą zostać umieszczone w jądrze.
Numeracja oraz wersje jądra systemowego
Istnieją dwa rodzaje dostępnych wersji jądra: stabilne (stable) oraz rozwojowe (development). Wersje
stabilne są przeznaczone dla osób ceniących sprawdzony, nie zawierający większych błędów szkielet
systemu. Zalecane są także dla początkujących użytkowników, gdyż nie powinny sprawiać większych
problemów i są bardzo dobrze udokumentowane.
Wersje rozwojowe przeznaczone są dla programistów zajmujących się rozwojem jądra systemowego
oraz dla użytkowników pragnących wzbogacić swoją wiedzę na temat jego funkcjonowania oraz budowy
w systemie GNU/Linux. Bardzo często zawierają implementacje dla obsługi najnowszych trendów
ze świata informatyki (sterowniki do najnowszych urządzeń, obsługa nowych protokołów itp.).
Ze względu na ten podział, zastosowano specyficzną numerację. W wersjach stabilnych środkowa
liczba jest liczbą parzystą (np. 2.2.14, 2.4.19, 2.6.3), a w wersjach rozwojowych jest to liczba nieparzysta
(np. 2.3.40, 2.5.43). Pierwsza liczba definiuje rodzinę i zwiększa się jedynie przy rewolucyjnych
zmianach w architekturze całego jądra (aktualnie jest to dwójka), natomiast trzecia określa liczbę
zestawów poprawek (patches), które zostały dodane od opublikowania wersji określonej dwiema
pierwszymi liczbami.
4.
Źródła
Standardowo każda, świeżo zainstalowana dystrybucja systemu GNU/Linux posiada
już rozpakowane źródła w katalogu /usr/src/linux. Jednak nie zawsze jest to najnowsza wersja.
Wersję najnowszą (zarówno stabilną jak i rozwojową) najprościej można pobrać z Internetu. Pod adresem
opracował: Marcin Bensz
Systemy operacyjne
GNU/Linux
1
http://www.kernel.org/ znajduje się strona, gdzie dostępne są wszystkie wersje jądra systemowego,
począwszy od wersji 0.01, a skończywszy na najnowszej wersji oznaczonej numerem 2.6.5.
Kiedy źródła wybranej wersji jądra zostaną już w całości pobrane na lokalny dysk twardy,
należy zalogować się jako administrator (root) i je rozpakować. W tym celu wystarczy przekopiować plik
ze źródłami do katalogu /usr/src, a następnie jeżeli są to źródła, których rozszerzeniem
jest *.tar.gz, wydać z konsoli polecenie:
$ tar –zxvf linux-pobrana.wersja.jądra.tar.gz
W przypadku, gdy pobrana wersja jest zarchiwizowana przy pomocy bzip2 (rozszerzenie
*.tar.bz2), należy je rozpakować za pomocą polecenia:
$ tar –jxvf linux-pobrana.wersja.jądra.tar.bz2
Po rozpakowaniu źródeł, w katalogu /usr/src powinien pojawić się nowy katalog:
linux-pobrana.wersja.jądra.
Kolejnym krokiem jest utworzenie dowiązania symbolicznego dla katalogu ze źródłami nowej wersji
jądra. W tym celu należy wejść do katalogu /usr/src i wydać polecenie:
$ ln –s linux-pobrana.wersja.jadra linux
Jego utworzenie jest potrzebne dla kompilatora gcc (GNU/C), gdyż podczas kompilacji jądra,
gcc odwołuje się do katalogu /usr/src/linux, gdzie standardowo powinny znajdować się
nagłówki jądra. Istnieje możliwość zmiany tego katalogu poprzez przypisanie nowej wartości
dla zmiennej KERNEL_DIR.
5. Sposoby konfiguracji jądra systemowego
Przy konfiguracji jądra, w zależności od zainstalowanych składników w systemie, istnieją
do wyboru trzy możliwości. Najwygodniejszą jest program konfigurujący działający w systemie
X Window, a wywoływany na terminalu za pomocą polecenia:
$ make xconfig
Podobnie jak kolejne dwa konfiguratory, posiada wbudowany system pomocy objaśniający w języku
angielskim znaczenie każdej opcji oraz wygodny interfejs, dzięki któremu można bez trudu zaznaczyć
interesujące pozycje.
Drugą możliwością jest program konfigurujący wywoływany przez polecenie:
$ make menuconfig
Pomimo, iż nie jest już tak efektowny jak program konfigurujący działający w systemie X Window,
to jest na tyle przejrzysty oraz wygodny, że znakomicie spełnia swoją rolę na systemach, gdzie
nie ma zainstalowanego środowiska graficznego (głównie na serwerach). Konfiguracja odbywa się
poprzez zaznaczenie potrzebnych opcji dzięki trzem reprezentacjom graficznym:
<*>
< >
<M>
- podana opcja zostanie wdrążona do jądra na stałe,
- podana opcja nie zostanie wdrążona do jądra,
- podana opcja zostanie wdrążona do systemu jako moduł.
Ostatnią możliwością jest konfigurator wywoływany poprzez komendę:
$ make config
W przeciwieństwie do obu poprzednich nie ma budowy w stylu menu, lecz jest zbiorem
pojedynczych pytań z możliwością wyboru odpowiedniej pozycji.
Wszystkie wybrane opcje są zapisywane w pliku konfiguracyjnym .config znajdującym się
w katalogu ze źródłami jądra systemowego. Możliwy jest także zapis do określonego pliku.
opracował: Marcin Bensz
Systemy operacyjne
GNU/Linux
2
6.
Kompilacja
Po zakończeniu konfiguracji potrzebnych opcji dla nowego jądra systemowego, za pomocą jednego
z w/w programów konfigurujących, należy je skompilować. Umożliwiają to następujące komendy:
- sprawdzenie zależności,
- usunięcie pozostałości po starej kompilacji jądra,
- kompilacja jądra wraz z zapisaniem go w katalogu
/usr/src/linux/arch/i386/boot,
$ make modules
- kompilacja modułów,
$ make modules_install - instalacja modułów i przekopiowanie ich do katalogu
/lib/modules/pobrana.wersja.jądra
$ make dep
$ make clean
$ make bzImage
7.
Instalacja
Nowe jądro znajduje się w katalogu usr/src/linux/arch/i386/boot/bzImage.
Aby je zainstalować należy przekopiować plik bzImage do katalogu /boot za pomocą polecenia:
$ cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage
a następnie zmienić mu nazwę:
$ mv /boot/bzImage /boot/bzImage-pobrana.wersja.jądra
Kolejnym krokiem jest przekopiowanie do katalogu /boot pliku System.map:
$ cp /usr/src/linux/System.map /boot/System.map
oraz, jak to miało miejsce w poprzednim przypadku, dla łatwiejszej orientacji należy
zmienić mu nazwę:
$ mv /boot/System.map /boot/System.map-pobrana.wersja.jądra
Plik System.map jest listą symboli oraz ich adresów w kodzie jądra. W przypadku problemów
z jądrem można na jego podstawie określić, gdzie nastąpił problem. Plik ma charakter informacyjny
i jest jedynie wykorzystywany przez program klogd.
Ostatnim etapem jest utworzenie dowiązań symbolicznych dla pliku jądra oraz dla pliku mapy
systemu:
$ ln –s /boot/bzImage-pobrana.wersja.jądra /boot/bzImage
$ ln –s /boot/System.map-pobrana.wersja.jądra /boot/System.map
Aby uruchomić system GNU/Linux z nowym jądrem należy dodać wpis do pliku konfiguracyjnego
programu LILO (LInux LOader), który znajduje się w katalogu /etc/lilo.conf. Oto przykładowy
wpis umożliwiający poprawne uruchomienie systemu:
image = /boot/bzImage
label = jadro_testowe
read-only
root = /dev/hdXY
Ostatnia linia w tym przykładzie informuje program LILO na jakiej partycji znajduje się wpisane
powyżej jądro systemowe. Oznaczenie hdXY jest nazwą urządzenia. W tym przypadku jest to dysk
twardy działający za pomocą interfejsu IDE. Znak X jest literą oznaczającą dysk fizyczny (a – Primary
Master, b – Primary Slave, c – Secondary Master, d – Secondary Slave). Drugi znak, czyli Y,
jest odpowiedzialny za partycje zainstalowane na danym dysku fizycznym. Informacje o wszystkich
dyskach oraz ich partycjach można uzyskać wpisując komendę:
$ df -h
opracował: Marcin Bensz
Systemy operacyjne
GNU/Linux
3
Wydając polecenie:
$ lilo
program czyta z pliku /etc/lilo.conf ustawienia i konfiguruje obszar rozruchowy dysku
twardego.
Podczas dopisywania nowego jądra do pliku konfiguracyjnego programu LILO,
nie zaleca się usuwać wpisu dotyczącego starego jądra. Gdy nowe jądro okaże się wadliwe (np. przy
konfiguracji została pominięta opcja odpowiedzialna za wyświetlanie tekstu konsoli na ekranie),
wówczas można powrócić do starego jądra wybierając je z menu wyboru systemów w programie LILO.
8.
Uwagi końcowe
Sama kompilacja jądra zazwyczaj przebiega bez problemów. Najczęściej popełnianym błędem jest
zapomnienie wkompilowania potrzebnej dla użytkownika usługi. Drugim równie często spotykanym
błędem jest brak aktualizacji pliku System.map. Zdarza się także zapomnieć o instalacji modułów
dostosowanych do nowej wersji jądra. Również należy zwrócić uwagę na fakt, iż nie każdą wersję jądra
można zainstalować na danym systemie. Jeśli system pracuje na bardzo starym jądrze, to należy
uaktualnić jego źródła instalując odpowiednie poprawki. Mimo, że jądro jest dostarczane wraz z obszerną
dokumentacją w języku angielskim, to w razie jakichkolwiek wątpliwości wystarczy przeglądnąć plik
README, gdzie można dowiedzieć się podstawowych rzeczy na temat instalacji i konfiguracji jądra.
opracował: Marcin Bensz
Systemy operacyjne
GNU/Linux
4

Podobne dokumenty