Uniwersytet w Białymstoku
Wydział Matematyki i Informatyki
Instytut Informatyki
Materiały bazowe do zajęć z przedmiotu:
Systemy operacyjne
Laboratorium nr 01
Temat:
Systemy Operacyjne,
System unix/linux - wiadomości wstępne
mgr Adam Bonda
Białystok 2008
Cel laboratorium: Zapoznanie się z podstawowymi definicjami, przyswojenie ogólnej wiedzy na temat rozwoju systemów operacyjnych, wstępne zapoznanie się z strukturą systemu i podstawowe komendy Linux'a.
(1) Wiadomości ogólne:
System komputerowy – zestaw sprzętu (hardware) i „ożywiającego” go oprogramowania (software). Oba te elementy tworzą zasoby systemu.
Zasoby systemu komputerowego to:
✔
procesor (ang. CPU – Central Processing Unit) – element wykonujący program
✔
pamięć operacyjna – umieszczane są w niej wykonywane programy
✔
program →
✔
dane
✔
urządzenia zewnętrzne: drukarki, terminale, pamięci dyskowe, taśmowe itp.
Program – zbiór instrukcji zrozumiałych dla komputera przechowywanych na odpowiednim nośniku danych i przenoszonych do pamięci operacyjnej na czas wykonywania programu.
Wykonywanie programu polega na postępowaniu zgodnie z zapisaną instrukcją (algorytmem).
Elementem umożliwiającym pracę całego systemu komputerowego jest pewien minimalny zestaw oprogramowania określany powszechnie mianem systemu operacyjnego (ang.
operating system – OS).
Do najbardziej znanych rodzin i typów systemów operacyjnych należą:
✔
Amiga: AmigaOS, AROS Research Operating System (AROS), MorphOS
✔
Apple: Apple DOS, ProDOS, GS/OS, Mac OS, Mac OS X, Mac OS X Server, A/UX, Lisa OS
✔
Atari: Atari TOS, MultiTOS, FreeMiNT
✔
Be: BeOS, BeIA, NewOS/Haiku, yellowTAB Zeta
✔
DEC/Compaq: AIS, OS-8, RSTS/E, RSX, RT-11, TOPS: TOPS-10, TOPS-20, VMS
(później przemianowany na OpenVMS)
✔
IBM: OS/2, AIX, OS/400, OS/390, VM/CMS, DOS/VSE, DOS/360, OS/360, MFT,
MVT, PC-DOS, SVS, MVS, TPF, ALCS, z/OS
✔
ICL: EXEC, JEAN, MINIMOP, GEORGE
✔
Microsoft: MS-DOS (PC-DOS, DR-DOS, FreeDOS, DOS, QDOS), Microsoft Windows: 1.0, 2.0, 3.x, 95/98/98 SE/Me, CE, NT/2000/XP/2003/2008/FLP/Vista
✔
Novell: NetWare, Novell DOS
✔
NeXT: NeXTStep
✔
Unisys: MCP(Master Control Program), OS 2200.
✔
UNIX i jego pochodne: AIX, BSD, FreeBSD, NetBSD, OpenBSD, DragonFly BSD, DesktopBSD, PC-BSD, Digital UNIX, HP-UX, IRIX, Mac OS X, Minix, OSF/1, SCO
UNIX, Sun Solaris (dawniej SunOS), System V, QNX, Ultrix, Venix, Xenix, GNU/Linux (system GNU z jądrem Linux), GNU/Hurd (system GNU z jądrem
Hurd),, Linux
✔
systemy czasu rzeczywistego (ang. realtime systems): LynxOS, OS9, Phoenix-RTOS, QNX, Nut/OS, RT-Linux, SenseOS, VxWorks, Suse Linux Enterprise Real Time, MicroC/OS-II
Zadaniem każdego systemu operacyjnego jest:
✔
efektywne wykorzystywanie sprzętu (procesora, pamięci itp.)
✔
koordynowanie pracy sprzętu, programów i użytkowników
✔
ułatwienie użytkownikom korzystania z komputera
Poprzez realizację tych zadań OS kontroluje niemal wszystkie czynności komputera i urządzeń doń podłączonych. Decyduje w jaki sposób są wykorzystywane zasoby komputerowe, a więc i co wyświetlane jest na ekranie monitora.
Ze względu na wysoki stopień komplikacji budowy sprzętu komputerowego, zazwyczaj nie zezwala się programom na bezpośredni dostęp do zasobów sprzętowych, a jedynie poprzez OS. Rozwiązuje to wiele problemów np. umożliwia OS zachowanie kontroli nad pracą komputera, zwalnia z gruntownej znajomości zasad pracy komputera i urządzeń peryferyjnych programistów i użytkowników.
Budowa OS determinowana jest ich typem i przeznaczeniem. System operacyjny może stanowić jeden program, lub kilka, czy kilkanaście, z których pewien wyróżniony, bądź ich grupa nosi nazwę jądra systemu (ang. kernel). Kernel uruchamiany jest jako proces pierwotny i sprawując kontrolę nad całym systemem komputerowym. OS dostarczane są z pewnym zestawem programów usługowych, które wspomagają działanie jądra. Składają się na nie zarówno proste, odpowiedzialne za wykonywanie pojedynczych poleceń użytkownika, jak i bardziej rozbudowane programy o szerszym zastosowaniu (określane są one terminem aplikacji użytkowych lub oprogramowania aplikacyjnego)
Do końca lat 60-ych większość z powstałych przed Unix'em systemów operacyjnym dedykowana była określonemu typowi komputerów – wiązało się to z wysokimi nakładami kosztów i szybkim starzeniem się OS, wraz z unowocześnianiem konstrukcji sprzętowych.
Doprowadziło to do unifikacji (zmniejszenia różnorodności) konstrukcji sprzętu komputerowego i przystosowania systemów operacyjnych do pracy na całej rodzinie, a nie (jak do tej pory) na jednym typie komputerów.
Wprowadzono więc ujednolicenie koncepcyjne w zakresie danej rodziny komputerów, na których można było uruchamiać OS jak i aplikacje użytkowe. Dana rodzina komputerów charakteryzuje się podobną architekturą (konstrukcją) oraz tym samym lub zbliżonym typem zastosowanego procesora. Mówimy więc o platformie komputerów osobistych klasy PC, które bazują na procesorach typu x86 firmy Intel, zapoczątkowanych przez 16-bitowy procesor 8086, które z kolei wywodził się z 8-bitowego układu 8085. Nazwa architektury wywodzi się od nazw pierwszych modeli z tej rodziny, których numery kończyły się liczbą 86.
W zakresie unifikacji konstrukcji sprzętu najbardziej znaczącą rolę odegrały firmy DEC i IBM, natomiast w zakresie OS Laboratoria Bella w których opracowana system Unix i udostępniono go nieodpłatnie amerykańskim uniwersytetom. Zapoczątkowało to szybki rozwój Unixa i przystosowanie go do pracy z różnymi komputerami. Dalsze modyfikacje i migracja systemu możliwa była dzięki zastosowaniu języka C w znacznej części kodu (fragmenty assemblera – wewnętrzny język komputera – realizowały tylko te, najbardziej zależne od sprzętu części kodu).
(2) Struktura systemu plików, powłoka systemowa i podstawowe komendy
Po zalogowaniu się do systemu, automatycznie uruchamiana jest powłoka systemu (ang.
shell). Najpopularniejszą obecnie stosowaną powłoką jest bash ( Bourne-Again Shell) jej
starczym odpowiednikiem jest sh ( Bourne Shell).
To, jaka powłoka jest automatycznie uruchamiana podczas logowania określone jest w następującej lokalizacji:
/etc/passwd
Aby, móc jednak wyświetlić zawartości plików potrzebna jest znajomość:
✔
zestawu komend umożliwiających sprawne poruszanie się po systemie plików,
✔
narzędzi do podglądu,
✔
wiedzy o strukturze drzewa katalogów systemów Unix'owych, w tym Linux'a (aktualnie używanej dystrybucji).
Pomoc systemowa
Systemy Unix oferują pomoc systemową (man, apropos, whatis) w postaci tekstowych dokumentów opisujących działanie, składnię wywołania programów i narzędzi zainstalowanych w systemie. Dokumentacja dostępna jest po wpisaniu polecenia man (ang. manual) i podaniu jako pierwszego argumentu nazwy programu, usługi, lub pliku (systemowego), dla którego pomoc chcemy uzyskać, np.:
man passwd
Dokumentacja podzielona jest na sekcje, których ilość zależy upodobań twórcy.
Główne części opisu to:
NAME: zawiera zwięzły opis działania polecenia
SYNOPIS: składnia poleceniach
AVAILABILITY: platforma sprzętowa, na której dostępne jest polecenie
DESCRIPTION: pełny opis wywoływanego polecenia
EXAMPLES: przykłady użycia polecenia
FILES: pliki np.: konfiguracyjne
SEE ALSO: powiązania, polecenia pokrewne
więcej na temat samej pomocy można dowiedzieć się wpisując:
man man
Nawigacja stron pomocy kontrolowana jest poleceniem more przy pomocy następujących skrótów: spacja (kolejna strona), Ctrl+B (poprzednia strona), q – zamknięcie i opuszczenie przeglądarki, / - wyszukiwanie tekstu w przód lub ? w tył, n,N – przejście do następnego (n) lub poprzedniego (N) wystąpienia poszukiwanego wyrażenia
Zadanie 1:
Zapoznaj się z zawartymi powyżej poleceniami. Sprawdź jak nazywa się przedostatnia sekcja dokumentacji man, podaj nazwę pierwszego powiązania występującego w tej sekcji. Jaka komenda wyświetla ostatni rozdział tego powiązania?
Struktura drzewa katalogów
Rodzinę systemów Unix'owych cechuje hierarchiczna (drzewiasta) struktura plików i katalogów przypominająca odwrócone drzewo. Skoro występuje tu jakieś „drzewo” to musi być i korzeń (ang. root). W rzeczy samej Unix'y posiadają korzeń, jest nim katalog główny (ang. Root directory) oznaczany symbolem „/” (ang. slash). Użyte sformułowania
„hierarchiczna” nie jest do końca ścisłe, ponieważ występować mogą tutaj dowiązania danego pliku do różnych katalogów, jak i plików do plików.
Na ogół system plików (ang. file system – fs) głównego katalogu większości dystrybucji Linux'owych posiada następującą strukturę:
— katalog główny ( root dir)
|—/bin
— katalog bazowego zestawu poleceń
|—/boot
— katalog plików rozruchu systemu
|—/dev
— katalog plików specjalnych, reprezentujących urządzenia
|—/etc
— katalog plików konfiguracyjnych systemu
|—/home
— katalog kont użytkowników (poza root'em)
|—/lib
— katalog bibliotek systemowych i plików nagłówkowych
|—/mnt
— punkt mount'owania systemu plików i urządzeń
|—/opt
— katalog instalacji oprogramowania zewnętrznego
|—/proc
— katalog specjalny, informacje systemowe (wirtualny fs)
|—/lost+found — pliki odzyskane podczas sprawdzania spójności fs
|—/root
— katalog domowy administratora
|—/sbin
— katalog programów systemowych
|—/tmp
— katalog plików tymczasowych
|—/usr
— katalog podkatalogów systemowych
|—/bin
— podkatalog uzupełniającego zestawu poleceń
|—/lib
— podkatalog bibliotek narzędziowych
|—/sbin
— podkatalog uzupełniających programów systemowych
|—/tmp
— podkatalog plików tymczasowych
/var
— katalog zmieniających się plików systemowych (logi, kolejki)
Unix posiada 3 rodzaje plików:
(a) zwykłe pliki dyskowe (ang. files) są to pliki binarnej lub tekstowej.
(b) katalogi (ang. directory) zawierają (lub nie) pliki dowolnego z wymienionych typów.
(c) pliki specjalne (ang. special files) – mogą dotyczyć:
●
urządzeń zewnętrznych zainstalowanych w komputerze (dyski,
karty muzyczne itp.)
●
łączy nazwanych (pliki FIFO) służących do porozumiewania się procesów niespokrewnionych. Łącze musi zostać jawnie utworzone, jako plik specjalny poprzez funkcję mknod(). Dalsze mechanizmy porozumiewania się są analogiczne jak w przypadku plików. Usunięcie łącza następuje poprzez funkcję unlink()
Nazwy rozpoczynające się ukośnikiem „/” określają pełną ścieżkę (ang. absolute pathname) do pliku:
/etc/passwd
określa, że plik passwd znajduje się w katalog etc, do którego dostęp jest bezpośrednio z głównego katalogu. Jeśli w linii nie było by pierwszego ukośnika:
etc/passwd
to o pliku passwd wiedzielibyśmy tylko tyle, że znajduje się w katalogu (ang. relative pathname) etc. Gdyby był to jakiś mniej charakterystyczny katalog i plik to jedyną nadzieją na znalezienie znajdującego się nim pliku byłoby skorzystanie z programu umożliwiającego wyszukiwanie.
Prócz charakterystycznego symbolu / oznaczającego katalog główny, używa się także innych symboli dla określenia wybranych katalogów:
. - oznacza katalog bieżący,
.. - oznacz katalog bezpośrednio nadrzędny;
~ - oznacz katalog domowy użytkownika.
Nazwa pliku zwykłego i katalogu może składać się z dowolnego ciągu znaków ASCII.
Wielkie i małe litery są rozróżnialne. Ze względu na specjalne znaczenie niektórych znaków dla shella, zaleca się używanie w nazwach tylko znaków przenaszalnych: liter, cyfr, podkreślenia i kropki. Znaki o specjalnym znaczeniu dla powłoki (zwane metaznakami) to:
* ? ; | & \ < > [ ] ` ' ”
użycie ich w nazwach plików wiąże się z tym, że w poleceniach odwołujących się do takich nazwa muszą być „cytowane” z użyciem:
znaku backslash \, apostrofów ' lub cudzysłowów ”.
Jeśli nazwa pliku zaczyna się od znaku kropki, to dla pewnej grupy poleceń plik jest traktowany jako ukryty.
Poruszanie się po systemie plików
pwd (ang. print working directory)
– wyświetla nazwę aktualnego katalogu roboczego
cd arg (ang. change directory)
– zmienia katalog na podany w argumencie (o ile
istnieje)
mkdir arg (ang. make directory)
– tworzy katalog podany w argumencie (o ile nie
istnieje)
rmdir arg (ang. remove directory) – usuwa katalog podany w argumencie (o ile istnieje) mv arg1 arg2 (ang. move)
– przenosi, bądź zmienia nazwę, jako pierwszy
argument podaje się przenoszony pliku/katalog, jako
drugi miejsce lub docelową nazwę
ls (ang. list)
– listuje standardową zawartość bieżącego katalogu
Przykłady:
login@nazwa:~$ pwd
wyświetla aktualny kat. roboczy
/home/login
wychodzi do katalogu
login@nazwa:~$ cd ..
nadrzędnego
login@nazwa:/home$ pwd
/home
login@nazwa:/home$ mkdir ./login/test01
tworzy katalog test01 w kat.
login@nazwa:/home$ cd ~/test01
domowym przy użyciu ścieżki
login@nazwa:~/test01$ pwd
bezwzględnej
/home/login/test01
login@nazwa:~/test01$ cd /
wychodzi o głównego kat.
login@nazwa:/$ pwd
/
zmienia nazwę kat. test01
login@nazwa:/$ mv ~/test01 ~/test02
znajdującego się w kat.
domowym na test02
login@nazwa:/$ mkdir ~/test02/x1
tworzy podkatalog x1, a
login@nazwa:/$ mv ~/test02/x1 ~/x1
następnie przenosi go katalogu
domowego
login@nazwa:/$ cd /home/login/test02
login@nazwa:~test02$ pwd
/home/login/test02
login@nazwa:~test02$ rmdir ../test02 ~/x1
usuwa zarówno katalog test02,
login@nazwa:~$ cd ..
jak i x1
login@nazwa:~$ cd test02
-bash: cd: test02: No such file or directory
Przy użyciu pojedynczej komendy wyjdź do głównego katalogu. Wejdź do katalogu domowego używając ścieżki bezwzględnej. Stwórz katalog o nazwie wg wzoru dzien'miesiąc`pierwszaliteranazwiska|pierwszeliteraimienia
np.: 1'10`B|A
wejdź do stworzonego tego katalogu i wyświetl nazwę aktualnego katalogu roboczego, a następnie wyjdź do katalogu nadrzędnego i wyświetl listę wszystkich! plików i katalogów.
Używając ścieżki bezwzględnej, jednym poleceniem stwórz w wewnątrz ostatnio powstałego katalogu podkatalog o nazwie test, a następnie usuń go w ten sam sposób.
Działania na plikach (katalogach)
* zastępuje ciąg dowolnych znaków
? zastępuje dokładnie jeden znak
[lista] – zastępuje dokładnie jeden znak z podanej listy znaków w nawiasie kwadratowym
[abc] – na określonej pozycji nazwy pliku może wystąpić tylko jedna z liter a, b lub c
[a-z] – na określonej pozycji nazwy pliku mogą wystąpić liter od a do z
[19] – na określonej pozycji nazwy pliku może wystąpić tylko cyfra 1 lub 9
touch arg1
tworzy plik o podanej nazwie, lub zmienia datę stworzenia pliku
login@nazwa:~$ touch plik1
login@nazwa:~$ ls
plik1
head arg1
wyświetla 10 pierwszych linii pliku podanego jako argument
-c, --bytes=[-]ILE wypisanie pierwszych ILE bajtów z każdego pliku
-n, --lines=[-]ILE wypisanie pierwszych ILE linii zamiast 10
z `-' - wypisanie wszystkich oprócz ostatnich ILE bajtów/linii każdego pliku tail arg1
wyświetla 10 ostatnich linii pliku podanego jako argument
-c, --bytes=N wypisanie ostatnich N bajtów
-f, --follow[={name|descriptor}] wypisywanie nowych danych kiedy plik rośnie;
-f, --follow i --follow=descriptor są równoważne
-n, --lines=N wypisanie ostatnich N linii zamiast ostatnich 10
cat arg1 arg2 ...
wyświetla zawartość pliku(ów) podanego(ych) jako argument(y)
-b,
numeracja niepustych linii
more arg1 arg2...
wyświetla zawartość pliku(ów) podanego(ych) jako argument(y)
stronami
Po wyświetleniu ekranu z zawartością pliku, program oczekuje instrukcji od użytkownika: h
wyświetla help
<spacja> to samo co f
przewija ekran do dołu
<enter>
przewija linię w dół
3b
przewija 3 ekrany do tyłu
q
kończy pracę przeglądarki more
less arg1 arg2...
podobny do more, pozwalającym na poruszanie się w tył w pliku
tak samo jak w przód
Zmiana standardowych wyjść i wejść (przekierowania)
W czasie wykonywania danego polecenia strumienie danych wyjściowych, wejściowych i diagnostycznych mogą zostać skojarzone z innymi wejściami, wyjściami niż domyślne, dla określonego polecenia.
Strumień danych wyjściowych przekierowany jest do argumentu (może to być plik lub urządzenie), natomiast potencjalne błędy (strumień diagnostyczny) w dalszym ciągu kierowane będą na ekran.
login@nazwa:~$ cat plik1 > plik2
Zawartość pliku plik1 przekierowana została to stworzonego automatycznie pliku plik2
Jeżeli plik2 już istniał i posiadał jakieś informacje to zostały one nadpisane!
login@nazwa:~$ cat plik1 plik2 plik3 > plik4
Strumień danych wyjściowych przekierowany jest do argumentu i dopisywany jest na jego końcu (w przypadku pliku). Strumień diagnostyczny wędruje na ekran terminala.
login@nazwa:~$ cat plik1 >> plik2
Strumień danych wejściowy przekierowany jest z argumentu (pliku) do polecenia, a błędy kierowane są na ekran.
login@nazwa:~$ mail -s „temat” do_kogo@com.pl < zawartosc
Na określony adres pocztowy z podanym tematem, zostanie wysłana wiadomość znajdująca się pliku zawartosc.
Strumień zarówno danych wyjściowych i diagnostyczny przekierowane są do argumentu login@nazwa:~$ cat plik1 >& plik2
Symbol potoku „|” stosuje się do przetwarzania strumieni danych. Możliwe jest tworzenie łańcuchów poleceń, które wzajemnie przerabiają dane.
login@nazwa:~$ ls -l /etc/* | more
Bez użycia przekierowania wyników komendy ls do more, można by było zobaczyć tylko ostatni ekran wyniku listowania zawartości katalogu /etc/. Jeszcze lepszym rozwiązaniem jest zastąpienie komendy more przez less, dlaczego?
Zadanie 3: W stworzonym poprzednio katalogu utworzyć plik o nazwie test03. Umieścić w tym pliku listę wszystkich plików kończących się na litery „g” i „h” z katalogu /etc, a następnie dopisać do tego pliku listę wszystkich urządzeń z katalogu /dev w nazwach których dwie pierwsze litery to „hd”.
Usunąć wszystkie pliki i katalogi tworzone podczas tego laboratorium.
Wreszcie można się przekonać jakiej domyślnej powłoki używamy:
login@nazwa:~$ cat /etc/passwd | less
...
jas:x:1000:1000:jas,,,:/root:/bin/bash
...
Plik ten ma następującą konstrukcję:
login_name:hasło:uid:gid:imie_nazwisko:katalog_domowy:powłoka
login_name
nazwa użytkownika w systemie
hasło
zakodowane hasło przypisane do login_name, jeśli w tym miejscu stoi
„x” oznacza to, że hasło znajduje się w zaszyfrowanej postaci w pliku
/etc/shadow, do którego dostęp mają tylko administratorzy.
uid
liczbowy identyfikator użytkownika
gid
identyfikator grupy do której użytkownik należy
imię_nazwisko
dane teleadresowe, używane głównie przez programy pocztowe
katalog_domowy macierzysty katalog użytkownika, tworzony podczas zakładania konta powłoka
domyślnie uruchamiana powłoka podczas logowania do systemu (nie
każdy użytkownik musi mieć shellowy dostęp do systemu, czasem jest
to tylko poczta, lub ftp i w tym miejscu jest to określone)