9. Procesy, urządzenia i system plików w systemie Linux 9.1. Procesy Z systemami unixowymi związane jest pojęcie procesu. W takim ujęciu, proces, rozumiany jest jako wykonywany w systemie program. Każdy proces charakteryzuje się pewnymi atrybutami: przestrzeń adresowa, licznik programu, stanu rejestrów, deskryptory plików (unikalny identyfikator pliku wykorzystywany przez system operacyjny), dane procesu, zależności rodzinne, liczniki statystyczne. Wynikiem obecności w systemie procesów jest to, że jądro systemu może nim sterować tak i może go ustawiać w kilku stanach: Pracujący w trybie użytkownika - proces znajduje się na procesorze i wykonuje swój kod. Pracujący w trybie jądra - jądro wykonuje wywołanie systemowe wykonane przez proces. Uśpiony - proces czeka na jakieś zdarzenie, na przykład na odczyt danych z dysku lub otrzymanie danych z sieci. Gotowy do wykonania - może być uruchomiony w każdej chwili, jednak nie ma jeszcze przydzielonego procesora. Zombie - proces zakończył działanie i czeka na odebranie kodu powrotu przez proces macierzysty. Wszystkie procesy w Unixie powstają jako procesy potomne procesu głównego init o numerze 1, który tworzony przez jądro podczas uruchamiania systemu. Każdy proces może być zarówno procesem potomnym jak i procesem macierzystym innego procesu. System wykonuje każdy proces przez określony czas, następnie pobiera kolejny proces do wykonania. W tym czasie grupa procesów oczekuje na wykonanie. Sprawne działanie zapewnia szeregowanie z wywłaszczaniem oraz system priorytetów, pozwalający tak ustawić intensywnie używające procesor procesy tła, aby nie blokowały pracy procesom interakcyjnym. Podstawowym poleceniem do zarządzania procesami prze użytkownika jest: ps ps [-] [lujsvmaxscewhrnu] [txx] [O[+ -]k1[[+ -]k2...]] [pids] l - długi format u - format użytkownika: podaje nazwę użytkownika i czas startu j - format prac: pgid sid s - format sygnału v - format vm Systemy operacyjne - Procesy, urządzenia i system plików w systemie Linux 1
m - wyświetla informację o pamięci (połącz z flagą p aby uzyskać ilość stron). f - format drzewiasty a - pokaż także procesy innych użytkowników x - pokaż procesy bez kontrolującego terminala S - dodaj czas cpu potomka i błędy stron c - nazwa komendy z task_struct e - pokaż środowisko za linią komend i ' + ' w - szerokie wyjście: nie skracaj linii komend aby mieściły się w jednej linii. Można podawać więcej niż jedno w. h - bez nagłówka r - tylko pracujące procesy n - wyjście numeryczne dla USER i WCHAN. Przykład 9.1.1 ps PID TTY TIME CMD 12369 pts/1 00:00:00 bash 17270 pts/1 00:00:00 ps Wyświetlany jest numer PID, terminal sterujący procesu, całkowity czas, w którym proces zajmował procesor, oraz komenda, za pomocą, której proces został uruchomiony. Wyświetlono jedynie te procesy, które pracują na tym samym terminalu, co użytkownik. Przykład 9.1.2 ps ax PID TTY STAT TIME COMMAND 1? S 0:04 init [2] 2? SW 0:19 [keventd] 3? SW 0:00 [kapmd] 4? SWN 0:14 [ksoftirqd_cpu0] 5? SW 2:16 [kswapd] 6? SW 0:00 [bdflush] 7? SW 0:04 [kupdated] 11? SW 2:58 [kjournald] (...) Wyświetla wszystkie procesy pracujące w systemie. Systemy operacyjne - Procesy, urządzenia i system plików w systemie Linux 2
Przykład 9.1.3 ps f PID TTY STAT TIME COMMAND 19376 pts/17 S 0:00 bash 30005 pts/17 R 0:00 \_ ps f 20673 pts/13 S 0:00 bash 32152 pts/13 S 0:00 \_ mc 15158 pts/15 S 0:00 \_ bash -rcfile.bashrc (...) Wykorzystanie opcji f powoduje wyświetlenie drzewa procesów, uwzględniających zależność proces macierzysty - proces potomny Za pomocą polecenie pstree można wyświetlić drzewo procesów w systemie. Przykład 9.1.4 pstree init-+-mailscanner---5*[mailscanner] -Server -aacraid -acpid -arpwatch -atd -aveserver -clamd -crond -dbus-daemon-1 -dccm -dovecot-+-dovecot-auth W wielu przypadkach zachodzi potrzeba usunięcia przez użytkownika procesu z systemu Unix. Użytkownik ma takie prawo w stosunku do swoich procesów natomiast użytkownik root do wszystkich. Polecenia do tego służące ma następującą składnię: kill [ -s sygnał -p ] [ -a ] pid... Po wydaniu polecenia kill z właściwym sygnałem, proces przerywa pracę i wykonuje kod obsługi sygnału. Część sygnałów służy do komunikowania procesu o kluczowych wydarzeniach przez jądro. W tabeli znajdują się najczęściej wykorzystywane sygnały: nazwa numer domyślna akcja opis SIGHUP 1 zakończenie Wyłączenie terminala sterującego bądź śmierć procesu kontrolującego SIGINT 2 zakończenie Przerwanie z klawiatury (CTRL+C) SIGQUIT 3 zrzut core Wyjście nakazane z klawiatury SIGILL 4 zrzut core Próba wykonania nieprawidłowej instrukcji Systemy operacyjne - Procesy, urządzenia i system plików w systemie Linux 3
SIGABRT 6 zrzut core Sygnał przerwania pracy procesu wywołany przez abort() SIGKILL 9 zakończenie Natychmiastowe usunięcie procesu; niemożliwy do złapania ani zignorowania. SIGSEGV 11 zrzut core Nieprawidłowe odwołanie do pamięci wirtualnej SIGPIPE 13 zakończenie Zerwany potok: pisanie do potoku, który nie posiada procesu po stronie czytania SIGALRM 14 zakończenie Sygnał alarmowy wywołany przez funkcję alarm() SIGTERM 15 zakończenie Sygnał zakończenia pracy procesu SIGCHLD 17 ignorowanie Zatrzymanie bądź wyłączenie procesu potomnego SIGCONT 18 start Kontynuacja zatrzymanego procesu SIGSTOP 19 zatrzymanie Zatrzymanie procesu; niemożliwy do złapania ani ignorowania Przykład 9.1.5 cat /dev/zero > /dev/null & [1] 8606 kill -9 8606 jobs [1]+ Unicestwiony cat /dev/zero >/dev/null top jest programem działającym w czasie rzeczywistym, prezentującym najbardziej absorbujące procesor i pamięć procesy w systemie. Po uruchomieniu, ekran terminala wygląda następująco: 20:50:46 up 21 days, 5:22, 35 users, load average: 0,66, 0,54, 0,43 242 processes: 239 sleeping, 2 running, 1 zombie, 0 stopped CPU states: 9,3% user, 18,4% system, 0,1% nice, 72,2% idle Mem: 386248K total, 369808K used, 16440K free, 34032K buffers Swap: 457844K total, 170436K used, 287408K free, 112924K cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 9248 gin 19 0 1916 1916 1584 R 12,4 0.4 0:00 top 1 root 8 0 808 772 752 S 0,0 0.1 Systemy operacyjne - Procesy, urządzenia i system plików w systemie Linux 4
0:04 init 2 root 9 0 0 0 0 SW 0,0 0.0 0:19 keventd 3 root 9 0 0 0 0 SW 0,0 0.0 0:00 kapmd (...) Standardowo, procesy sortowane są według zużycia procesora. Można jednak przełączyć sortowanie, naciskając jeden z klawiszy: N - według numeru PID A - według wieku P - według użycia procesora M - według użycia pamięci T - według czasu pracy Pozostałe polecenia związane z procesami: nice, bg, fg, jobs, killall 9.2. Urządzenia i system plików w systemie Linux W systemie Linux wszystkie urządzenia są reprezentowane przez odpowiednie pliki znajdujące się w katalogu /dev. Urządzenia te dzielą się na blokowe i znakowe. Urządzenia blokowe służą do przechowywania danych i pozwalają na swobodny dostęp do nich. Urządzeniami tego typu są na przykład dyski twarde lub stacje dyskietek. Urządzenia te zachowują się podobnie jak pliki z tym, że długość plików określona jest przez ilość zapisanych w nich danych, a długość urządzenia blokowego przez jego pojemność. Wadą takiego rozwiązania jest to, że jeśli zapiszemy plik o rozmiarze 10MB do urządzenia blokowego o pojemności 100MB, to po odczytaniu tego urządzenia otrzymamy 10MB naszych danych i 90MB danych zapisanych wcześniej. Wadę tę można ominąć kodując informację o długości pliku w nim samym. Urządzenia znakowe służą do odczytu lub zapisu sekwencji znaków. Charakterystyczną cechą tych urządzeń jest to, że danych z nich nie można odczytywać w dowolnej kolejności tylko w kolejności takiej, w jakiej docierają one do komputera. Dobrym przykładem takiego urządzenia jest łącze szeregowe. Oznaczenia niektórych urządzeń z katalogu /dev: hda - pierwszy dysk twardy (IDE/EIDE) hda1 - pierwsza partycja na pierwszym dysku twardym hdb - drugi dysk twardy lub CD-ROM sda - pierwszy dysk twardy (SCSI) sda1 - pierwsza partycja na pierwszym dysku twardym sdb - drugi dysk twardy (SCSI) fd0 - pierwsza stacja dysków elastycznych fd1 - druga stacja dysków elastycznych cua0 - COM1 cua1 - COM2 lp0 - LPT1 lp1- LPT2 tty1 - terminal 1 Systemy operacyjne - Procesy, urządzenia i system plików w systemie Linux 5
tty2 - terminal 2 null - urządzenie puste kmem - pamięć operacyjna System plików System plików to metody i struktury danych używane przez system operacyjny w celu zapisania i zorganizowania plików na danym urządzeniu. System Linux obsługuje wiele różnych systemów plików, ale podstawowym systemem jest ext2. Montowanie i odmontowywanie systemu plików Aby móc używać systemu plików należy go wcześniej zamontować. Do montowania systemu plików służy polecenie mount o składni : mount -t typ urządzenie punkt_montowania gdzie : typ rodzaj systemu plików, np.: ext2, msdos urządzenie musi być urządzeniem blokowym punkt_montowania nazwa pliku, pod którym będzie zainstalowany dany system. Aby zamontować dyskietkę wydajemy polecenie: mount -t msdos /dev/fd0 /mnt/floppy Do odmontowania systemu plików służy polecenie umount: umount /mnt/floppy Konfiguracja systemu plików Informacje o systemach plików, które mają lub mogą być zamontowane i o ich konfiguracji zawiera plik /etc/fstab. Każdy system plików opisany jest w osobnej linii, a pola w każdej linii oddzielone są znakami spacji lub tabulatora. Przykładowy plik fstab może wyglądać następująco: /dev/hda1 / ext2 defaults 1 1 /dev/hda2 /usr ext2 defaults 1 2 /dev/hdb /mnt/cdrom iso9660 user,noauto,ro 0 0 /dev/fd1 /mnt/floppy msdos user,noauto 0 0 /dev/hda2 none swap sw Pole pierwsze opisuje specjalne urządzenie blokowe lub zdalny system plików przeznaczony Systemy operacyjne - Procesy, urządzenia i system plików w systemie Linux 6
do zamontowania. Pole drugie wskazuje na miejsce, w którym ma być dany system plików zamontowany. Dla partycji wymiany pole to powinno zawierać wartość none. Pole trzecie opisuje typ systemu plików. Najczęściej używane systemy plików to: ext2 standardowy system plików dla Linuxa msdos system plików dla partycji MS-DOS iso9660 system plików używany przez stacje CD-ROM nfs system plików służący do montowania partycji z systemów zdalnych Pole czwarte zawiera opcje montowania danego systemu plików. Opcje podaje się jako listę oddzieloną przecinkami. Najważniejsze opcje to: swap partycja dysku używana jako przestrzeń wymiany auto oznacza, że polecenie mount -a powinno zamontować dany system plików noauto zabrania montowania systemu, gdy wydano opcję mount -a user opcja ta pozwala użytkownikowi na montowanie danego systemu plików dev pozwala na używanie plików urządzeń zapisanych w systemie plików exec zwykle wykorzystywany w systemach NFS. Opcja ta zezwala na uruchamianie plików zapisanych w danym systemie noexec przeciwieństwo opcji exec ro montuje system plików w trybie tylko do odczytu rw montuje system plików w trybie do odczytu i zapisu sync wszystkie operacje zapisu będą oczekiwać na potwierdzenie ich zakończenia przez sprzęt. Tryb ten jest wolniejszy, ale za to bezpieczniejszy async przeciwieństwo opcji sync suid pozwala na korzystanie z flag suid nosuid przeciwieństwo suid defaults włącza opcje rw, exec, auto, nouser, async, suid Pole piąte jest używane przez program dump do wykrycia, który system plików musi być odłączony. Wartość 0 oznacza, że dany system nie musi być odłączony. Pole szóste jest używane przez program fsck do określenia kolejności sprawdzania systemu plików podczas ładowania systemu. Główny system plików powinien mieć wartość 1, zaś inne systemy plików wartość 2. Wartość 0 oznacza, że dany system nie będzie sprawdzany. Inne polecenia związane z systemem plików df [-aht] urządzenie Opis: sprawdzenie ilości wolnego miejsca na dysku -a wyświetla informacje o każdym systemie plików -h wyświetlane informacje są podawane w łatwych do odczytania jednostkach -t=typ wyświetla informacje tylko o systemie danego typu fsck [-n N y Y] urządzenie Opis: testowanie i naprawa systemu plików -n -N - odpowiada "nie" na wszystkie pytania zadane przez program -y -Y - odpowiada "tak" na wszystkie pytania zadane przez program Systemy operacyjne - Procesy, urządzenia i system plików w systemie Linux 7
fdisk [-lv] [-s partycja] urządzenie Opis: obsługa partycji -l drukuje tablice partycji -v drukuje numer wersji fdiska -s partycja jest partycją wybranego dysku urządzenie jest plikiem z katalogu /dev wskazującym na nasz dysk fdformat [-n] urządzenie Opis: niskopoziomowy format dyskietki -n wyłączenie weryfikacji sformatowanej dyskietki Zadania: 1. Zapoznaj się z urządzeniami znajdującymi się w katalogu /dev? 2. Ile plików hd* znajduje się w tym katalogu? 3. Ile partycji ma dysk hda? 4. Włóż do stacji dyskietkę/czytnika CD płytę CD i ją/go zamontuj. Nie zapomnij podać odpowiedniego systemu plików. Dyskietkę zamontuj w katalogu /mnt/floppy. Płytę CD zamontuj w katalogu /mnt/cdrom. Wejdź do tego katalogu i wylistuj jego zawartość. 5. Wyjmij dyskietkę/płytę CD (o ile się da :-)) i spróbuj ponownie wylistować zawartość katalogu /mnt/floppy. 6. Odmontuj stację dyskietek/płytę CD. 7. Zapoznaj się z zawartością pliku /etc/fstab. Jakie dyski zostały zamontowane w momencie startu systemu? Gdzie one zostały zamontowane? 8. Korzystając z informacji zawartych w pliku /etc/fstab znajdź i wyświetl zawartość partycji z systemem Windows. 9. W którym ze stanów jest bezpośrednio wykonywany proces? 10. Jaki jest stan końcowy procesu? 11. Który proces w Unixie jest procesem macierzystym wszystkich procesów i jaki jest jego PID? 12. Utwórz konto o nazwie gonzo. Niech Twój kolega/koleżanka zaloguje się na tym koncie. Jakie polecenie służy do wyświetlania wszystkich procesów użytkownika gonzo na terminalu tty2. 13. W jaki sposób usuniemy wszystkie procesy użytkownika gonzo? 14. Podaj nazwę sygnału kończącego definitywnie wykonywanie procesu. 15. Jakie informacje dostarcza program top, jaka jest różnica pomiędzy top i ps? 16. Jaka postać powinno mieć polecenie ps by przedstawiało podobny wynik jak polecenie pstree? Systemy operacyjne - Procesy, urządzenia i system plików w systemie Linux 8