UNIX, Linux system plików - kurs

W tym post-cie, opiszę teoretycznie system plików UNIX-a.
Jest to druga część na moim blogu dotycząca teorii systemów operacyjnych.
W kolejnych częściach opiszę: powłokę UNIX-a, jądro UNIX-a oraz funkcje systemowe związane z procesami na bazie UNIX-a.
W części pierwszej opisałem: wstęp do UNIX-a.

Uwaga - materiał pochodzi z mojej skarbnicy wiedzy zgromadzonej podczas studiów na UAM w Poznaniu na przełomie lata 1999-2002 i wtedy też był redagowany. Stanowi doskonałe teoretyczne uzupełnienie wiedzy dla studentów kierunku informatyka.

Proszę traktować tego posta, jako opis systemu operacyjnego UNIX bez podziału na wersje i rodzaje. Tam gdzie jest potrzeba wyraźnie zaznaczam jakiej wersji i jakiego rodzaju systemu operacyjnego UNIX-a dotyczy opis.


Materiał bazuje na książkach:
1. Podstawy systemów operacyjnych - wydawnictwo WNT, autorzy: Abraham Silberschatz i Peter B. Galvin
2. System operacyjny UNIX dla początkujących i zaawansowanych - wydawnictwo BUM, autorzy: Zbyszko Królikowski i Michał Sajkowski

Według mnie najlepsza książka dla osób rozpoczynajacych przygodę z systemem operacyjnym UNIX zarówno pod względem praktycznym jak i teoretycznym dla administratorów i programistów.



W systemie UNIX jeden logiczny system plików widziany przez użytkownika może składać się z kilku fizycznych systemów plików znajdujących się na kilku urządzeniach fizycznych. Z kolei każde urządzenie fizyczne może być podzielone na urządzenie logiczne, a każde z nich może zdefiniować własny system plików. Jednakże w systemie musi istnieć jeden wyróżniony system plików zawierający katalog pierwotny - korzeń całego systemu. System ten znajduje się na dyskach niewymiennych i do niego są dołończone inne systemy plików przechowywane na nośnikach wymiennych.

Logiczny system plików:

[Rysunek jest przerysowny osobiście prze zemnie, część oryginalna znajduje się w książce, pt.: "System operacyjny UNIX dla początkujących i zaawansowanych" - Autorzy: Zbyszko Królikowski i Michał Sajkowski - str 28.]

Dany logiczny system plików jest ciągiem bloków ponumerowanych kolejno 0..n, przy czym kolejne bloki stanowią:
 - blok 0 (boot block) - jest zawsze zarezerwowany dla programu ładującego i sterującego systemem,
 - blok nadrzędny (super block),
 - lista tzw. i-węzłów plików (i-node list),
 - bloki danych,
 - obszar do wymiatania programów (swapping space).

W bloku nadrzędnym zawarte są następujące informacje o systemie plików:
 - rozmiar w blokach,
 - nazwa urządzenia logicznego,
 - nazwa systemu plików,
 - rozmiar listy węzłów plików,
 - wskaźnik na pierwszy element listy wolnych bloków,
 - wskaźnik na pierwszy element listy wolnych węzłów plików,
 - data ostatniej modyfikacji,
 - data ostatniego dostępu,
 - rozmiar bloku.

System operacyjny UNIX zaprojektowano tak, aby przede wszystkim przetwarzał pliki, a więc każdy zbiór informacji traktuje on jako plik, przy czym nie ważne, jak i na czym ta informacja jest zapisana. Informacja zewnętrzna o plikach (tj. nazwa, wielkość, właściciel, czas powstania i prawa dostępu) jest zapisana w katalogu który sam jest plikiem w ogólności, katalog jest plikiem zawierającym listę nazw plików wraz z odpowiednimi numerami węzłów informacyjnych (i-node). Węzły informacyjne pliku będziemy nazywać i-węzłami pliku.

Budowa katalogu w systemie UNIX:
 
[Rysunek jest przerysowny osobiście prze zemnie, część oryginalna znajduje się w książce, pt.: "System operacyjny UNIX dla początkujących i zaawansowanych" - Autorzy: Zbyszko Królikowski i Michał Sajkowski - str 29.]

Informacja wewnętrzna pliku (dane, program, tekst dokumentu, itp.) stanowi zawartość pliku. Interesujące jest, że plik w systemie UNIX nie ma struktury wewnętrznej, w szczególności nie dzieli się na mniejsze jednostki. Formalnie jest on ciągiem znaków zakończonych EOF. Jedynymi znakami zawartymi w pliku są znaki umieszczone tam przez użytkownika.  Ponieważ nie ma wstępnej alokacji miejsca na dysku, plik może mieć dowolną długość. System plików jest zorganizowany hierarchicznie, tzn. każdy plik wyższego poziomu może zawierać odsyłacze do plików niższego poziomu, a każdy plik niższego poziomu musi znajdować się w wykazie co najmniej jednego pliku wyższego poziomu.

W praktyce katalogiem nadrzędnym wobec wszystkich innych jest tzw. katalog pierwotny (root-korzeń), zawierający wykaz katalogów kilku podstawowych rodzajów:
 - bin (programy  usługowe w wersji gotowej do wykonania - binarnej),
 - dev (pliki specjalne odpowiadające urządzenia zewnętrznym,
 - lib ( programy biblioteczne, związane z językiem wysokiego poziomu, wywołaniami systemowymi, obsługą I/O),
 - usr (wykaz wszystkich katalogów niższego poziomu, w których przechowują w swoje pliki użytkownicy, zazwyczaj sporządzony według nazw użytkowników),
 - tmp (pliki tymczasowe),
 - etc (dane i programy podlegające ścisłej ochronie),
 - inne katalogi (np. lost+found - zawiera pliki utracone, tzn. takie, które straciły właściwe powiązanie z systemem plików).

Oprócz wymienionych katalogów w katalogu pierwotnym znajduje się jeden plik o nazwie unix - nie będący katalogiem. Jest to jądro systemu operacyjnego. Pliki specjalne reprezentujące urządzenia zgrupowane są w katalogu /dev. Wpisane są w nim pliki pseudourządzeń i urządzeń rzeczywistych.

Do pseudourządzeń należą między innymi:
 - /dev/console (konsola systemowa, na którą są wyprowadzane komunikaty systemowe),
 - /dev/kmem (odwzorowanie wirtualnej pamięci operacyjnej),
 - /dev/tty (wirtualny terminal, z którego został zainicjowany proces).

Urządzenia rzeczywiste to:
 - /dev/fdn (stacja dysków elastycznych),
 - /dev/hdn (stacja dysków twardych),
 - /dev/lp (drukarka).

Przy rejestrowaniu nazwy użytkownika w systemie zostaje z nią związany katalog osobisty danego użytkownika. Katalog ten staje się katalogiem bieżącym w chwili rozpoczęcia przez użytkownika sesji przy terminalu. Jak wynika z podstawowych powyżej rozważań, z punktu widzenia użytkownika plik jest identyfikowany przez nazwę sieciową. Na jej podstawie system musi zlokalizować bloki dyskowe pliku, czyli miejsce, w którym plik jest przechowywany na dysku. Podstawą lokalizacji bloków dyskowych pliku są węzły informacyjne pliku. Zawiera ona zestaw informacji opisujących plik (tzn. atrybuty pliku) oraz opis organizacji fizycznej pliku (wskaźniki do dyskowych bloków danych). Atrybuty pliku zawarte w jego węźle informacyjnym przedstawia rysunek.

Struktura węzła informacyjnego pliku:

[Rysunek jest przerysowny osobiście prze zemnie, część oryginalna znajduje się w książce, pt.: "System operacyjny UNIX dla początkujących i zaawansowanych" - Autorzy: Zbyszko Królikowski i Michał Sajkowski - str 33.]

Wszystkie adresy dyskowe plików o rozmiarze nie przekraczającym 10 bloków są przechowywane bezpośrednio węźle informacyjnym pliku. Jeśli plik jest większy niż 10 bloków, potrzebny jest dodatkowy blok zawierający adresy pozostałych bloków pliku, natomiast w węźle informacyjnym przechowywany jest adres tego bloku, tzn. wskaźnik na wskaźnik pośredni. W zależności od rozmiaru bloku dyskowego i długości adresu pojedynczy blok pośredni może zawierać od 128 do 256 adresów. Pliki specjalne (np. pliki urządzeń) nie mają bloków danych alokowanych na dysku. Jądro systemu odnotowuje pliki tego typu na podstawie informacji z i-węzłów, a następnie wywołuje odpowiednie moduły obsługi urządzeń w celu wykonania operacji wejścia/wyjścia dla tych plików. Aby zapisać plik na dysku, system plików musi dysponować informacją o rozmieszczeniu bloków wolnych tego dysku. Informacja  o blokach wolnych w systemie UNIX jest najczęściej utrzymywana w postaci listy łańcuchowej przechowywanej w bloku nadrzędnym. W systemie UNIX ten sam plik może występować pod dwiema lub więcej nazwami, a co więcej - z możliwością ich występowania w różnych katalogach. Typowym wykorzystaniem jest tutaj pozwolenie np. kilku członkom jednego zespołu programistycznego na współdzielenie tego samego pliku, przy czym może on występować w różnych katalogach pod różnymi nazwami (nie są to prywatne kopie). Zmiany w pliku dokonywane przez jednego użytkownika są widoczne dla innych. Taką możliwość uzyskuje się przez mechanizm tzw. łączników. Łączniki do pliku tworzy się po to, aby uniknąć niepotrzebnego kopiowania i przechowywania wielokrotnych kopii tego samego pliku. W przypadku utworzenia łącznika specjalnym poleceniem plik otrzymuje drugą nazwę (traktowaną jako synonim), lecz jego właścicielem pozostaje poprzedni użytkownik.
Po znalezieniu pliku związane z nim informację, takie jak rozmiar, właściciel, prawa dostępu i umiejscowienie bloków danych są z reguły kopiowane do tablicy nazwanej tablicą otwartych plików, znajdującej się w pamięci operacyjnej i zawierającej informację o wszystkich bieżąco otwartych plikach. Pierwsze odwołanie do pliku (zazwyczaj operacja jego otwarcia - open) powoduje przeszukanie katalogu i przekopiowanie wpisu katalogowego dotyczącego danego pliku do tablicy otwartych plików. Do programu użytkownika zostaje przekazany indeks do tej tablicy, wszystkie dalsze odwołania są więc wykonywane za pomocą tego indeksu, a nie nazwy symbolicznej. W systemach uniksowych nazywa się go deskryptorem pliku. Tak więc dopóki nie nastąpi zamknięci pliku, dopóty wszystkie operacje plikowe są wykonywane z użyciem tablicy otwartych plików. Po zamknięciu pliku przez wszystkich korzystających z niego użytkowników uaktualniane informacje o nim są z powrotem kopiowane do dyskowej struktury katalogowej. W niektórych systemach schemat ten komplikuje się jeszcze bardziej wskutek zastosowania w p.o. tablic wielopoziomowych. Podstawowym elementem wykorzystywanym przez system w zarządzaniu plikami są węzły informacyjne plików. Prócz nich system wykorzystuje również tablice otwartych plików bieżącego procesu, tablicę struktury pliku oraz wewnętrzny i-węzeł (węzeł informacyjny przechowywany w pamięci operacyjnej). Wywołania systemowe, które dotyczą otwartych plików, wskazują pliki poprzez tzw. deskryptor pliku. Deskryptor pliku jest używany przez jądro do indeksowania tablicy otwartych plików bieżącego procesu. Każdy zapis w tej tablicy zawiera wskaźnik do tablicy struktury pliku i dalej do wewnętrznego i-węzła. Tablica struktury plików została wprowadzona ze względu na to, że kilka procesów działających na danym pliku "widzi" go inaczej; mówimy, że proces dysponuje określonym przesunięciem (offset) w obrębie pliku.

Bloki kontrolne systemu plików - schemat:

[Rysunek jest przerysowny osobiście prze zemnie, część oryginalna znajduje się w książce, pt.: "System operacyjny UNIX dla początkujących i zaawansowanych" - Autorzy: Zbyszko Królikowski i Michał Sajkowski - str 35.]