---
# System prepended metadata

title: Systemy Operacyjne Lista 11

---

# 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

![](https://i.imgur.com/C8fwzLY.png)


:::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ń).

![](https://i.imgur.com/kX21Lvx.png)

![](https://i.imgur.com/M55xjF9.png)


## 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.

![](https://i.imgur.com/EU4KYe8.png)

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).

![](https://i.imgur.com/w7TfhV4.png)
 
 (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.



