Systemy operacyjne 2009

Transkrypt

Systemy operacyjne 2009
Systemy operacyjne 2009
Pracownia, lista nr 1 dla grupy MSq
Marcin Skórzewski
Web: http://www.ii.uni.wroc.pl/~msq/so09/lab1/: HTML, PDF i TEXMACS
14 listopad 2009
Spis treści
1. Zadanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2. User-Mode Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2.1.
2.2.
2.3.
2.4.
Kompilacja jądra UM... . . . . . . . . . . . . . . . . . . . . . . . .
Gdy jestem na pracowni linuksowej... . . . . . . . . . . . . . . .
Na pracowni brak miejsca na dysku . . . . . . . . . . . . . . . .
Kompilowanie jądra / modułów w katalogu innym niż źródła
3. Komunikacja przez /proc i /dev
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
3
3
3
. .. .. .. .. .. .. .. ... .. .. .. .. .. .. ... . 3
1. Zadanie
Problem 1. (Na pracowni) Skompiluj i uruchom na pracowni User-Mode Linux w konfiguracji możliwie
na jbliższej do działającej. Przetestuj rozwiązanie problemu 1 pod UML.
Problem 2. (W domu) Napisz moduł będący interfejsem dla problemu „producent–konsument”. Nasz interfejs
ma się komunikować z konsumentami i producentami przez system /proc. Wielkość kolejki produktów ma być
ustalana podczas działania modułu w pliku /proc/proco/max. Producenci to procesy, które produkują liczby
całkowite i przekazują do naszego modułu zapisując do pliku /proc/proco/data. Konsumenci to procesy, które
potrzebują używać liczb generowanych przez producentów i mogą je pobierać odczytując (za każdym razem po
jednej) z pliku /proc/proco/data. Zadanie polega na zapewnieniu synchronizacji. Każda dodana liczba powinna
być tylko raz odebrana.
2. User-Mode Linux
2.1. Kompilacja jądra UM...
Celem jest otrzymanie dwóch podobnych jąder: jednego natywnego do używania, drugiego UserMode o jak najbardziej zbliżonej konfiguracji do testowania.
→
mamy dostęp do skompilowanego jądra w katalogu /usr/src/linux/,
→
zakładamy, że jądro ma w konfiguracji włączone opcje:
General setup > Kernel .config support (dostęp do konfiguracji przez /proc/config)
Enable loadable module support (obsługa sterowników czyli modułów)
→
TODO: parametry dla make, żeby mógł kompilować w katalogu, do którego
mamy uprawnienia,
→
oczyszczam źródła jądra:
1
2
Systemy operacyjne 2009
# make ARCH=um mrproper
→
odzyskuje jak najwięcej z dotychczasowej konfiguracji i ustalam parametry specyficzne dla
trybu użytkownika (User-Mode):
# cp /proc/config .config
# make ARCH=um oldconfig
→
warto zaopiekować się parametrami:
Force a static link (STATIC_LINK): Y
Host filesystem (HOSTFS): Y
Management console (MCONSOLE): Y
Virtual block device (BLK_DEV_UBD): Y
stderr console (STDERR_CONSOLE): Y
port channel support (PORT_CHAN): Y
pty channel support (PTY_CHAN): Y
tty channel support (TTY_CHAN): Y
xterm channel support (XTERM_CHAN): Y
→
ostatnie spojrzenie na konfigurację:
# make ARCH=um menuconfig
→
w menu konfiguracyjnym dodaję do opcji „General setup/Local version” prefiks „-um”,
→
wreszcie mogę kompilować:
# make ARCH=um
→
widzę, że jest plik uruchamialny o nazwie „linux” — to jest mój własny User-Mode Linux
→
instaluję sterowniki (moduły) do katalogu „/lib/modules/2.6.26-gentoo-r3-msq1-um/”
(„2.6.*-um” to wersja jądra zwracana przez „uname -r”):
# make ARCH=um modules_install
→
nasz Linuks dla trybu UM powinien być gotowy do uruchomienia, testujemy:
$ ./linux rootfstype=hostfs rw init=/bin/bash
→
wewnątrz UML jestem administratorem, ale proces UML „linux” z punktu widzenia
„zewnętrznego” systemu gospodarza ma niewielkie uprawnienia zwykłego użytkownika,
→
potrzebuję w UML własnego systemy „/proc/”:
# mount -t proc /proc /proc
→
dygresja: jeśli na jakimś systemie komenda „mount” się nie powiedzie, to system macierzysty
nie daje użytkownikowi uprawnień do czytania pliku programu „mount” — żeby uruchomić
program normalnie wystarczy uprawnienie +x, ale UML musi umieć przeczytać plik, który
będzie wewnątrz niego uruchomiony, więc musi być +r,
→
testuję ładowanie sterowników — może być moduł „NTFS”:
# modprobe ntfs
→
wszystko działa, jestem szczęśliwy i gotów do zabawy z modułami
Marcin Skórzewski
3
2.2. Gdy jestem na pracowni linuksowej...
Jak w wariancie wcześniejszym. Różnica polega na braku uprawnień administratora. Jedyną operacją, która wymaga wysokich uprawnień jest instalowanie modułów. Jednym z rozwiązań jest
wirtualna podmiana (podpięcie?) katalogu „/lib/modules/”. Na zewnątrz nie zostanie dokonana
żadna zmiana:
→
wybieram katalog docelowy na moduły:
$ mkdir /tmp/modules
→
uruchamiam UML:
$ ./linux rootfstype=hostfs rw init=/bin/bash
→
przypinam katalog na moduły:
mount -o bind /tmp/modules /lib/modules
→
instaluje moduły (na pozór do „/lib/modules/”, ale na prawdę do „/tmp/modules/”):
# cd /usr/src/linux
# make ARCH=um modules_install
2.3. Na pracowni brak miejsca na dysku
Źródła + kompilacja UML = 1.3GB. Decyduję się na całkowitą rozbieżność obecnej konfiguracji
i UML. Dostępny jest skompilowany podczas przygotowania tej pomocy UML wraz z modułami
i konfiguracją (.config.gz). Jest to wersja 2.6.26-gentoo-r3 z dystrybucji Gentoo z modyfikacją
m.in. do obsługi SquashFS (wymagane np. dla Puppy Linux). Nie znaczy to, że nie trzeba użyć
żródeł jądra. Potrzebne są żeby kompilować moduły. Po przygotowaniu ich za pomocą:
# cp /ścieżka/do/pliku/z/konfigucacją/config .config
# make ARCH=um oldconfig
# make ARCH=um prepare
w wersji i konfiguracji jak wyżej zajmują wciąż ponad 370MB. Na pracowni juz się zmieści.
2.4. Kompilowanie jądra / modułów w katalogu innym niż źródła
Moduł piszę w pliku „test.c” i mam plik „Makefile” o zawartości:
obj-m += test.o
Kompiluję „test.ko” poleceniem:
$ make -C /usr/src/linux-2.6.26-gentoo-r3 M="$PWD" ARCH=um
gdzie „/usr/src/linux-2.6.26-gentoo-r3” jest katalogiem ze źródłami jądra, a zmienna „$PWD”
przechowuje ścieżkę bieżącego katalogu.
3. Komunikacja przez /proc i /dev
W „Access the Linux kernel using the /proc filesystem” jest prosty przykład odczytywania danych
wysłanych z przestrzeni użytkownika przez plik w „/proc”. Listing 9. zawiera szkielet inicjujący
moduł, który obsługuje /proc, natomiast w listingu 10. jest funkcja wywoływana podczas pisania
do pliku.