You are on page 1of 44

Pliki i Użytkownicy

Sieci Komputerowe

dr Piotr Przymus
3 października 2019

Wydział Matematyki i Informatyki


UMK Toruń

1
System operacyjny
Systemu Operacyjny

System Operacyjny:

• jądro systemu – wykonuje i kontroluje zadania:


• planisty czasu procesora, ustalającego które zadanie i jak długo będzie
wykonywane,
• przełącznika zadań, odpowiedzialnego za przełączanie pomiędzy
uruchomionymi zadaniami,
• modułu zapewniającego synchronizacje i komunikację pomiędzy
zadaniami,
• modułu obsługi przerwań i zarządzania urządzeniami,
• modułu obsługi pamięci, zapewniającego przydział i ochronę pamięci,
• innych modułów zależnie od funkcji i przeznaczenia systemu.
• powłoka – specjalny program komunikujący użytkownika z systemem
operacyjnym,
• system plików – sposób ustrukturyzowanego zapisu danych na nośniku.

(Źródło wiki) 2
Użytkownik

Aplikacja

System operacyjny

Sprzęt
Polska wikipedia, 2009-2015

Rysunek 1: Warstwy systemu (źródło wikipedia) 3


Rysunek 2: Komunikacja z systemem (źródło wikipedia)

4
Application
POSIX-compatible
n
tio
nc
fu alls
c

Linux
memory
manager
lls
m ca
Virtual
IPC syste
file
manager
system Linux
process
scheduler
syste
m call
s
I/O Network
interface interface

fu
nc
ca tion
lls

Linux-specific

Application

Rysunek 3: Warstwy komunikacyjne (źródło wikipedia) 5


Computer game

Abstraction APIs

Vulkan SDL audio


SDL input
OpenGL OpenAL
Linux API

GNU C Library libCGroup libDRM libasound libEvdev


(wrapper subroutines) (wrapper subroutines) (wrapper subroutines) (wrapper subroutines)

Linux kernel System Call Interface (SCI)


I/O subsystem: Linux kernel Virtual File System
the «treat everything as if it was a file»-concept

Process Memory DRM: ALSA: evdev: Sockets ext4, xfs, btrfs, …


management management amdgpu emu10k1 evdev Netfilter
subsystem subsystem i915 hda-intel Generic block layer
Network protocols
nouveau snd-ctxfi
… … Linux kernel packet scheduler Linux kernel I/O scheduler

(Character device drivers) (Network device drivers) (Block device drivers)

Hardware

Rysunek 4: Przykładowa architektura gry (źródło wikipedia)

6
Interakcja z systemem operacyjnym - przykład

1 ltrace ./a . out


2 strace ./a . out
3 sudo trace−cmd record −p function −F ./a . out
4 sudo trace−cmd report trace . dat
5 kernelshark ./ trace . dat

7
Fazy kompilacji
Fazy kompilacji wyjaśnienie

• Preprocesor
• Kompilacja i optymalizacja
• Assemblacja
• Linkowanie

8
Preprocesor

Preprocesor - pierwszym krokiem jest przygotowanie kodu do kompilacji. W


tej fazie wykonywane są tzw. dyrektywy preprocesora:

• instrukcje poprzedzone znakiem “#”,


• np. #inlude , # define , # if ,
• wstawiane są definicje i makra.

Przykład
• W miejsce #include, zostanie wstawiony podany plik,
• gdy #if nie będzie spełniony, kod w tym warunku (tzn. do # endif )
zostanie usunięty,
• w miejsca użycia makr i identyfikatorów zostaną wstawione
odpowiednie dane lub rozwinięte makra.

9
Kompilacja i optymalizacja

Kompilacja i optymalizacja - to proces zamieniający kod w danym języku


programowania najpierw na:

• pośredni język kompilatora,


• później do assemblera.

Przykład
• W tym procesie kompilator usuwa takie elementy jak pętle zamieniając
je na zwykłe warunki i instrukcje goto,
• przygotowuje tłumaczenie kodu na język assemblera.

10
Assemblacja

Asemblacja - kod jest tłumaczony na kod maszynowy, ale nadal nie nadaje
się do uruchomienia:

• nie posiada potrzebnych nagłówków oraz może posiadać


niezdefiniowane referencje,
• Przykład:
• jeśli załączyliśmy plik funkcje.h z samymi deklaracjami funkcji,
• assembler nie musi jeszcze wiedzieć gdzie ta funkcja jest,
• ma tylko informację, że taka funkcja gdzieś jest, tak się nazywa i ma
daną sygnaturę.

Wynikiem tej fazy jest tzw. obiekt (rozszerzenie .o), fragment programu.

11
Konsolidacja, czyli linkowanie

Linkowanie (konsolidacja) - ostatnia faza budowania aplikacji. Polega na


zebraniu wszystkich obiektów razem i złączeniu ich w wykonywalny program.

• Linker wymaga skojarzenia symboli (nazw), musi wiedzieć gdzie


znajduje się dana funkcja, dany obiekt zewnętrzny, musi je powiązać
(zlinkować).
• Rozwiązań symboli (czy też: definicji referencji) może także szukać w
bibliotekach dzielonych
• .so, utworzy odnośnik, sam plik nie będzie dołączony,
• i statycznych (.a, ten plik zostanie dołączony do aplikacji statycznie).
• Na tym etapie wśród linkowanych obiektów musi znaleźć się funkcja
main.

12
Proces kompilacji

1 onestep :
2 gcc hello . c −o hello . out
3
4 compilation_cycle : preprocesor compilator assembler linker
5
6 preprocesor : hello . c
7 cpp hello . c > hello . i
8
9 compilator : hello . i
10 gcc −Wall −S hello . i
11
12 assembler : hello . s
13 as hello . s −o hello . o
14
15 linker : hello . o
16 gcc −v hello . o −o hello . dyn
17 gcc −v hello . o −static −o hello . static

13
Czym jest biblioteka

Biblioteka jest to zbiór funkcji, które zostały wydzielone po to, aby dało się z
nich korzystać w wielu programach.

• nie musimy np. sami tworzyć funkcji printf.

Pliki nagłówkowe zawierają deklaracje funkcji bibliotecznych oraz często


komentarze jak używać danej funkcji.

Cechy biblioteki:

• składa się co najmniej z dwóch plików: jeden nagłówkowy (źródłowy) i


jeden binarny (skompilowany),
• zawiera funkcje (deklaracje w nagłówkowym i definicje w binarnym),
• w postaci pakietu (ang. package) może dzielić się na pakiety dev i
non-dev.

14
Budowa bibliotek

Jak budować bibliotekę - laboratoria.

15
Pliki
Deskryptor

Deskryptor pliku:

• Identyfikator pliku wykorzystywany przez system operacyjny.


• Najczęściej indeks do przechowywanej przez jądro struktury danych
zawierającej informacje o wszystkich otwartych plikach.
• W standardzie POSIX ta struktura danych jest nazwana tablicą
deskryptorów plików i jest odrębna dla każdego procesu.
• Deskryptor pliku może być wykorzystywany wielokrotnie przez
wywołanie systemowe w operacjach wejścia/wyjścia.

Wartość Standardowe Nazwa uchwytu

0 wejście (stdin) STDIN


1 wyjście (stdout) STDOUT
2 wyjście diagnostyczne (stderr) STDERR

16
Pliki - operacje na deskryptorach

Tworzenie i otwieranie plików:

• open - otwarcie pliku (umożliwia również utworzenie pliku), zwraca


deskryptor
• creat - utworzenie pliku i otwarcie do zapisu,
• dup - utworzenie kopii deskryptora i nadanie jej pierwszego wolnego
numeru z tablicy otwartych plików,
• dup2 - utworzenie kopii deskryptora, umożliwiające określenie jej
identyfikatora przez użytkownika,
• close - zamknięcie deskryptora otwartego pliku,
• unlink - usunięcie dowiązania do pliku

Operacje na plikach:

• read - odczyt fragmentu pliku,


• write - zapis fragmentu pliku,
• lseek - przesunięcie wskaźnika bieżącej pozycji 17
Naiwny cat - schemat

1 // Otwieramy deskryptor pliku


2 fd = open ( . . . )
3
4 // Iteracja po zawartosci pliku
5 while (read ( . . . ) > 0) {
6 // Wyswietlenie zawartosci pliku
7 write ( fileno ( stdout ) , . . . ) ;
8 }
9
10 // Zamykamy deskryptor pliku
11 close ( fd ) ;

18
Naiwny cat - pełen przykład

Pełen przykład omawiany jest na wykładzie.

19
Obsługa błędów - errno i perror

errno to zmienna przechowująca kod ostatniego błędu (errno . h).

• Na początku działania programu ma wartość 0 oznaczającą brak


problemów.
• Jeśli w trakcie działania pojawią się błędy (na przykład na skutek
działania funkcji wejścia/wyjścia), errno zostanie ustawione na wartość
mówiącą o przyczynie wystąpienia błędu.

perror Wypisuje zrozumiały komunikat o błędzie ( stdio . h).

• Jeśli argumentem jest NULL, wypisuje na stderr tekstowy opis błędu,


opierając się na wartości zmiennej errno.
• Jeśli argumentem jest niepusty napis, napisze go najpierw, dodając
dwukropek.

strerror funkcja interpretuje wartość errnum i zwraca wskaźnik do tablicy


zawierającej słowny opis tego błędu ( string . h).
20
Pliki - stdio vs deskryptory

Większość osób powinna znać wysokopoziomowy interfejs z stdio.h

• buforowane I/O
• typowe funkcje fopen, fread, fwrite, fclose
• dostęp poprzez uchwyt pliku typu FILE*

Niskopoziomowe funkcje dla deskryptorów:

• brak buforowania I/O,


• typowe funkcje open, read, write, close
• dostęp przez deskryptor pliku, liczbę (int) będący indeksem w tablicy
deskryptorów zarządzanych przez OS.
• w Unix interfejs z stdio.h jest zbudowany za pomocą funkcji
działających na deskryptorach.

21
Praca z plikami i katalogami
Naiwny ls - schemat

Operacje na plikach i katalogach omówimy na przykładzie naiwnego ls .

Działanie ls −l
1 $ls −l
2 drwx−−−−−− 15 adam students 4096 lip 6 13:27 ./
3 drwxr−xr−x 54 adam students 4096 lip 6 11:20 . . /
4 −rwxr−−r−x 2 adam students 4096 cze 23 13:32 abc . txt

typ i prawa #dowiązań user group rozmiar cz.dostepu nazwa

drwxr-xr-x 54 eror admin 4096 lip 6 11:20 ../

Rozmiar - przechowuje faktyczny rozmiar pliku, w przypadku katalogów


oznacza to rozmiar metadanych potrzebnych do odwzorowania struktury
katalogu.

22
Praca z plikami i katalogami

• stat, fstat, lstat - zwraca informacje o pliku, struct stat


• opendir - pozwala otworzyć katalog, zwraca DIR*
• readdir - czyta zawartość katalogu, zwraca struct dirent
• closedir - zamyka deskryptor katalogu

23
Naiwny ls - schemat

Schemat naiwnego ls :

1 // Otworz strumien katalog


2 dir = opendir ( . . . )
3
4 //Iteracja po katalogu
5 while ( (dp = readdir ( dir ) ) != NULL) {
6 // Uzyskanie informacji o plikach
7 stat ( . . . )
8 // Wyswietlenie w czytelnej dla uzytkownika formie
9 // typ pliku , prawa, licznik dowiazan, user , group , rozmiar pliku , data
dostepu , nazwa
10 }
11
12 // Zamkniecie strumienia katalogu
13 closedir ( . . . )

24
readdir

• readdir - czyta zawartość katalogu, zwraca struct dirent

1 struct dirent {
2 ino_t d_ino ; /* inode number */
3 off_t d_off ; /* offset to the next dirent */
4 unsigned short d_reclen ; /* length of this record */
5 unsigned char d_type ; /* type of f i l e ; not supported
6 by all f i l e system types */
7 char d_name[256]; /* filename */
8 };

25
Typ pliku - pliki specjalne

• d_type - określa typ pliku.

Oprócz regularnych plików w systemach UNIX są też pliki specjalne:

• Katalogi
• Dowiązania symboliczne
• Abstrakcje komunikacyjne:
• Potoki z nazwą (FIFO)
• Gniazda (sockets)
• Urządzenia blokowe
• Urządzenia znakowe

26
Informacje o plikach - stat

• stat, fstat, lstat - zwraca informacje o pliku, struct stat


1 struct stat {
2 dev_t st_dev ; /* ID of device containing f i l e */
3 ino_t st_ino ; /* inode number */
4 mode_t st_mode ; /* protection */
5 nlink_t st_nlink ; /* number of hard links */
6 uid_t st_uid ; /* user ID of owner */
7 gid_t st_gid ; /* group ID of owner */
8 dev_t st_rdev ; /* device ID ( i f special f i l e ) */
9 off_t st_size ; /* total size , in bytes */
10 blksize_t st_blksize ; /* blocksize for f i l e system I /O */
11 blkcnt_t st_blocks ; /* number of 512B blocks allocated */
12 time_t st_atime ; /* time of last access */
13 time_t st_mtime ; /* time of last modification */
14 time_t st_ctime ; /* time of last status change */
15 } ;

27
Prawa pliku - przypomnienie

Czynność do wykonania Prawa

Odczytanie zawartości pliku r


Zapis do pliku w
Wykonanie pliku (np. programu lub skryptu) x

Dodatkowo:

• SetUID — dla pliku wykonywalnego, uruchomiony proces będzie miał


uprawnienia jak właściciel pliku
• SetGID — dla pliku wykonywalnego, uruchomiony proces będzie miał
uprawnienia jak grupa pliku
• sticky bit — lepki bit, dla plików dla Większości nowoczesnych
systemów nie ma żadnego znaczenia

28
Prawa katalogu - przypomnienie

Czynność do wykonania Prawa Uwagi

Przeglądanie zawartości r
katalogu
Wejście do katalogu x dziedziczone (brak x w katalogu
nadrzędnym uniemożliwia wejście
do potomka który ma x)
Tworzenie, usuanie wx samo w bez efektu
i zmiana nazw plików

• SetUID/SETGID — dla katalogu, zachowuje właściciela/grupę katalogu


dla nowo tworzonych plików
• sticky bit — lepki bit, używany dla zabezpieczenia zawartości katalogu
większa liczba użytkowników. Użytkownicy będą mogli modyfikować i
usuwać tylko i wyłącznie swoje pliki. 29
Prawa pliku przypomnienie

Informacje o prawach dostępu można uzyskać używając np. ls -l

1 $ls −l
2 drwx−−−−−− 15 adam students 4096 lip 6 13:27 ./
3 drwxr−xr−x 54 adam students 4096 lip 6 11:20 . . /
4 −rwxr−−r−x 2 adam students 4096 cze 23 13:32 abc . txt

Informacja o prawach wyświetlana jest według schematu

Użytkownik (user) Grupa (group) Inni użytkownicy (others)

rwx rwx rwx


rws rws rwt
rwS rwS rwT

30
Prawa tłumaczenie

read write execute setuid setgid sticky

4 2 1 4 2 1
100 010 001 100 010 001

symbol bity ósemkowa symbol bity ósemkowa

--- 000 0 r-- 100 4


--x 001 1 r-x 101 5
-w- 010 2 rw- 110 6
-wx 011 3 rwx 111 7

31
Przykład

Dla praw

1 −rwxrwxr−x 2 adam students 4096 cze 23 13:32


2 111111101

symbol bity ósemkowa symbol bity ósemkowa

--- 000 0 r-- 100 4


--x 001 1 r-x 101 5
-w- 010 2 rw- 110 6
-wx 011 3 rwx 111 7

W skrócie prawa dla użytkownika, grupy i innych to 775.

32
Naiwny ls - przykład

Pełen przykład omawiany jest na wykładzie.

33
Użytkownicy
Użytkownicy w systemach UNIX

Bazy danych o użytkownikach i grupach:

• użytkownicy /etc/passwd
• grupy /etc/group

Ale też inne:

• NIS,
• LDAP

Potrzebny ujednolicony interfejs dostępu do tych informacji.

34
Użytkownicy w systemach UNIX

Funkcje dostępowe w pwd.h

1 #include <pwd. h>


2
3 struct passwd *getpwuid( uid_t uid ) ;
4 int getpwuid_r ( . . . )
5 struct passwd *getpwnam( const char *name) ;

35
Użytkownicy w systemach UNIX

Plik /etc/passwd
1 root : x : 0 : 0 : root :/ root :/ bin/bash
2 daemon: x : 1 : 1 :daemon:/ usr/sbin :/ usr/sbin/nologin
3 bin : x : 2 : 2 : bin :/ bin :/ usr/sbin/nologin
4 sys : x : 3 : 3 : sys :/dev:/ usr/sbin/nologin
5 sync : x :4:65534:sync:/ bin :/ bin/sync

1 struct passwd {
2 char *pw_name; /* username */
3 char *pw_passwd; /* user password */
4 uid_t pw_uid ; /* user ID */
5 gid_t pw_gid ; /* group ID */
6 char *pw_gecos ; /* user information */
7 char *pw_dir ; /* home directory */
8 char *pw_shell ; /* shell program */
9 };

36
Użytkownicy w systemach UNIX

1 #include <grp . h>


2
3 struct group * getgrgid ( gid_t gid ) ;
4 int getgrgid_r ( . . . ) ;

37
Użytkownicy w systemach UNIX

Plik /etc/group

1 root : x : 0 :
2 daemon: x : 1 :
3 bin : x : 2 :
4 sys : x : 3 :
5 adm: x : 4 : eror

1 struct group {
2 char *gr_name; /* group name */
3 char *gr_passwd ; /* group password */
4 gid_t gr_gid ; /* group ID */
5 char **gr_mem; /* group members */
6 };

38
Informacje uwierzytelniające

System operacyjny dba o to żeby były respektowane prawa użytkowników.

Informacje mające znaczenie przy ustalaniu praw dostępu do plików oraz ich
własności:

• UID - rzeczywisty identyfikator użytkownika


• GID - rzeczywisty identyfikator grupy użytkowników

Jądro może zmienić identyfikatory na:

• Obowiązujący (effective) EUID


• Obowiązujący (effective) EGID

39

You might also like