# Systemy Operacyjne Lista 11
## Zadanie 1.
:::info
Wyjaśnij czym są **punkty montażowe**, a następnie wyświetl listę zamontowanych systemów plików i wyjaśnij co znajduje się w poszczególnych kolumnach wydruku.
:::
Katalog przesłonięty drzewem wybranego systemu plików → **punkt montażowy**
mount, cat /proc/filesystems
:::info
Które z punktów montażowych dają dostęp do instancji **pseudo systemów plików**?
:::
:::info
Na podstawie mount(8) wyjaśnij znaczenie następujących
atrybutów punktów montażowych: «relatime», «noexec» i «nodev», a następnie podaj scenariusz, w którym
ich zastosowanie jest pożądane.
Wskazówka: Rozważ semantykę wymienionych atrybutów w kontekście systemu plików na przenośnym dysku USB.
:::
## Zadanie 3.
:::info
Podstawowymi operacjami na systemie plików są: wyzeruj lub zapal bit w bitmapie i-węzłów albo bloków, wczytaj / zapisz i-węzeł albo **blok pośredni** (ang. indirect block) albo blok danych.
Podaj listę kroków niezbędnych do realizacji funkcji dopisującej n bloków na koniec pliku. Zakładamy, że poszczególne kroki funkcji są zawsze wdrażane **synchronicznie**. Zadbaj o to by funkcje nie naruszyły spójności systemu
plików w przypadku awarii zasilania. Dopuszczamy powstawanie wycieków pamięci.
:::
**Blok pośredni** (ang. indirect block) - blok zawierający wskaźniki na inne bloki pośrednie lub na bloki danych. Używany przy pracy z dużymi plikami.
**Zapis synchroniczny** wykonywany jest za pomocą polecenia fsync lub fdatasync. Oznacza to, że dane zapisywane są do deskryptora pliku fd na dysku (lub innym urządzeniu) w taki sposób, że po crashu systemu lub reboocie pliki nadal mogą zostać odzyskane.
**zapisy synchroniczne** wymuszamy czekanie na zakończenie operacji
wejścia-wyjścia. Niestety mogą powstawać wycieki pamięci dyskowej!
Szybkość operacji ograniczona przepustowością dysku
**wdrażanie synchroniczne** Jedna po drugiej są robione.
Spójność systemu plików polega na zapisie plików o podobnym zastosowaniu w grupach (lub jakiejś przestrzeni nazw, która łączy te pliki).
Dopisanie n bloków na koniec pliku: :
* Wybieramy wolne bloki i zapalamy ich bity, aby zaznaczyć, że są używane.
* Zapisujemy zawartość tych bloków
* Dodajemy bloki do i-węzła:
* Jeśli trzeba tworzymy bloki pośrednie lub modyfikujemy aktualnie istniejące
* aktualizujemy metadane i-węzła: wskaźniki na bloki, rozmiar i timestamp(czas ostatniej modyfikacji).
## Zadanie 4.
:::info
Przy pomocy wywołania systemowego rename(2) można przenieść atomowo plik do katalogu znajdującego się w obrębie tego samego systemu plików. Czemu «rename» zakończy się błędem «EXDEV» kiedy próbujemy przenieść plik do innego systemu plików?
:::
```rename``` może zakończyć się błędem ```EXDEV```, gdy
* oldpath i newpath nie są zamontowane w tym samym systemie plików
* lub gdy są zamontowane w kilku miejscach - Linux zezwala na takie zachowanie, jednak samo działanie rename jest zdefiniowane w taki sposób, że nie pozwala na przenoszenie plików między różnymi punktami montowania

:::info
Powtórz polecenia z zadania 3 dla funkcji przenoszącej plik między dwoma różnymi katalogami w obrębie tego samego systemu plików. Zakładamy, że w katalogu docelowym jest wystarczająco dużo miejsca na dodanie wpisu. Pamiętaj, że wpis katalogu nie może przecinać granicy między blokami!
:::
Algorytmem wykorzystywanym do przenoszenia pliku między dwoma różnymi katalogami może być następujący ciąg instrukcji:
* zwiększamy licznik dowiązań i_links_count w i-węźle przenoszonego pliku
* jeśli w katalogu docelowym jest wyzerowany wpis (katalog pusty), to zmieniamy go na wpis pliku, który przenosimy.
* W przeciwnym wypadku dodajemy do katalogu docelowego wpis przenoszonego pliku i modyfikujemy poprzedni w taki sposób, aby nie wskazywał na koniec bloku.
* W poprzednim katalogu “usuwamy” wpis zmieniając wartość inode na 0 i zmieniamy licznik dowiązań w i-węźle tego pliku (przed przeniesieniem i po powinien być taki sam - jest to pewnego rodzaju niezmiennik, jako że nie wykonujemy kopii, to w systemie powinno być tyle samo dowiązań).


## Zadanie 5.
:::info
Przy pomocy wywołania systemowego unlink(2) można usunąć plik niebędący katalogiem. Powtórz polecenia z zadania 3 dla funkcji usuwającej plik zwykły z katalogu.
:::
Algorytm na usuwanie pliku niebędącego katalogiem:
* Usunięcie wpisu z katalogu i zmniejszeniem licznika dowiązań i_links_count.
* Jeśli licznik ten wynosi 0, to zwalniamy i-węzeł oraz bloki, a gdy jest większy od 0, to nic nie robimy.
Problemem mogą okazać się jednak awarie
- jeśli nastąpi bezpośrednio po usunięciu wpisu z katalogu, to będziemy mieli zajęty i-węzeł, który nigdy nie zostanie zwolniony.
- Jeśli uda nam się zmniejszyć licznik, to wtedy zwolnienie będzie już możliwe (ale nadal niekoniecznie się to uda).
- Jeśli awaria nastąpi przed zwolnieniem bloków, to zostaniemy z blokami, których nie da się zwolnić.
:::info
Kiedy możliwe jest odwrócenie operacji usunięcia pliku tj. odkasowania (ang. undelete)? Zauważ, że usunięcie pliku nie odbiera procesom
możliwości czytania jego zawartości, o ile go otworzyły przed wywołaniem unlink(2). Kiedy w takim razie plik zostanie faktycznie usunięty z dysku?
:::
Aby odkasować plik:
* musimy mieć pewność, że jego bloki nie zostały nadpisane
* i-węzeł nie mógł zostać nadpisany.
Pliki zostają całkowicie skasowane w momencie, gdy ich dane zostaną nadpisane innymi plikami lub gdy wszystkie deskryptory plików wskazujące na ten plik zostaną zamknięte.
## Zadanie 6.
:::info
Wyjaśnij co robi system plików ext2 przy tworzeniu **dowiązania twardego** (ang. hard link)i **symbolicznego** (ang. symbolic link). Gdzie jest przechowywana zawartość dowiązania symbolicznego? Jak za pomocą dowiązania symbolicznego stworzyć w systemie plików pętlę? Kiedy jądro systemu operacyjnego ją wykryje i zwróci błąd «ELOOP»? Czemu pętli nie da się zrobić z użyciem dowiązania twardego?
:::
**Dowiązanie twarde** (ang. hard link) - wskaźnik na i-węzeł pliku, wlicza się do licznika referencji do pliku. W i-węźle zwiększany jest licznik dowiązań i_links_count, a w katalogu tworzone jest mapowanie name - inode, czyli wiele wpisów pliku z różnych katalogów wskazuje na ten sam i-węzeł.
**Dowiązanie symboliczne** (ang. symbolic link) - dowiązanie kodujące ścieżkę, do której należy przekierować algorytm rozwiązywania nazw. Dla wszystkich dowiązań symbolicznych krótszych niż 60 bajtów dane są przechowywane w i-węźle.

z Wikipedii: traktowane jako plik lub katalog
Aby stworzyć pętlę, należy w dowolnym katalogu stworzyć dowiązanie symboliczne (flaga -s) do katalogu ., a więc tego, w którym się aktualnie znajdujemy, lub do katalogu ../[katalog]:
~/foo$ ln -s . link
~/foo$ ln -s ../foo/ link2
ls -lia foo
ELOOP zostaje on zwracany, gdy zostanie przekroczona maksymalna głębokość rekursji (dla symlinków).

(z unlink)
Pętli nie można stworzyć za pomocą dowiązania twardego, gdyż struktura danych systemu plików jest skierowanym grafem acyklicznym, a dowiązanie twarde stworzyłoby cykl, co sobie przeczy.