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