---
# System prepended metadata

title: Lista 11
tags: [SO2022]

---

# Lista 11
###### tags: `SO2022`

![](https://i.imgur.com/RO19sUT.png)
https://www.nongnu.org/ext2-doc/ext2.html

## Deklaracja
:::spoiler

| Zadanie   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|-----------|---|---|---|---|---|---|---|---|---|----|
|Deklaracja |:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:||:heavy_check_mark:|||

:heavy_check_mark:
:::

## Zadanie 1
![](https://i.imgur.com/rfoRktI.png)

* ### Wyjaśnij czym są punkty montażowe.
    **Punkt Montażowy** jest to katalog który jest logicznie połączony z innym systemem plików, np. procfs, Dysk USB, itp/

* ### Wyświetl listę zamontowanych systemów plików i wyjaśnij co znajduje się w poszczególnych kolumnach wydruku.
    `findmnt`
    ```
        TARGET                         SOURCE              FSTYPE          OPTIONS
    /                              /dev/nvme1n1p3[/root]
                                                       btrfs           rw,relatime,seclabel,compress=zstd:1,ssd,space_cache=v2,subvolid=257,subvol=/root
    ├─/proc                        proc                proc            rw,nosuid,nodev,noexec,relatime
    │ └─/proc/sys/fs/binfmt_misc   systemd-1           autofs          rw,relatime,fd=35,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=18354
    │   └─/proc/sys/fs/binfmt_misc binfmt_misc         binfmt_misc     rw,nosuid,nodev,noexec,relatime
    ├─/sys                         sysfs               sysfs           rw,nosuid,nodev,noexec,relatime,seclabel
    │ ├─/sys/kernel/security       securityfs          securityfs      rw,nosuid,nodev,noexec,relatime
    │ ├─/sys/fs/cgroup             cgroup2             cgroup2         rw,nosuid,nodev,noexec,relatime,seclabel,nsdelegate,memory_recursiveprot
    │ ├─/sys/fs/pstore             pstore              pstore          rw,nosuid,nodev,noexec,relatime,seclabel
    │ ├─/sys/firmware/efi/efivars  efivarfs            efivarfs        rw,nosuid,nodev,noexec,relatime
    │ ├─/sys/fs/bpf                bpf                 bpf             rw,nosuid,nodev,noexec,relatime,mode=700
    │ ├─/sys/fs/selinux            selinuxfs           selinuxfs       rw,nosuid,noexec,relatime
    │ ├─/sys/kernel/debug          debugfs             debugfs         rw,nosuid,nodev,noexec,relatime,seclabel
    │ ├─/sys/kernel/tracing        tracefs             tracefs         rw,nosuid,nodev,noexec,relatime,seclabel
    │ ├─/sys/fs/fuse/connections   fusectl             fusectl         rw,nosuid,nodev,noexec,relatime
    │ └─/sys/kernel/config         configfs            configfs        rw,nosuid,nodev,noexec,relatime
    ├─/dev                         devtmpfs            devtmpfs        rw,nosuid,seclabel,size=4096k,nr_inodes=1048576,mode=755,inode64
    │ ├─/dev/shm                   tmpfs               tmpfs           rw,nosuid,nodev,seclabel,inode64
    │ ├─/dev/pts                   devpts              devpts          rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000
    │ ├─/dev/mqueue                mqueue              mqueue          rw,nosuid,nodev,noexec,relatime,seclabel
    │ └─/dev/hugepages             hugetlbfs           hugetlbfs       rw,relatime,seclabel,pagesize=2M
    ├─/run                         tmpfs               tmpfs           rw,nosuid,nodev,seclabel,size=3262756k,nr_inodes=819200,mode=755,inode64
    │ └─/run/user/1000             tmpfs               tmpfs           rw,nosuid,nodev,relatime,seclabel,size=1631376k,nr_inodes=407844,mode=700,uid=1000,gid=1000,inode64
    │   ├─/run/user/1000/gvfs      gvfsd-fuse          fuse.gvfsd-fuse rw,nosuid,nodev,relatime,user_id=1000,group_id=1000
    │   └─/run/user/1000/doc       portal              fuse.portal     rw,nosuid,nodev,relatime,user_id=1000,group_id=1000
    ├─/tmp                         tmpfs               tmpfs           rw,nosuid,nodev,seclabel,size=8156892k,nr_inodes=1048576,inode64
    ├─/mnt/Dane                    /dev/sdb2           fuseblk         rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,blksize=4096
    ├─/home                        /dev/nvme1n1p3[/home]
    │                                                  btrfs           rw,relatime,seclabel,compress=zstd:1,ssd,space_cache=v2,subvolid=256,subvol=/home
    ├─/boot                        /dev/nvme1n1p2      ext4            rw,relatime,seclabel
    │ └─/boot/efi                  /dev/nvme1n1p1      vfat            rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro
    ├─/var/lib/nfs/rpc_pipefs      sunrpc              rpc_pipefs      rw,relatime
    ├─/mnt/HDD                     /dev/sda1           fuseblk         rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,blksize=4096
    └─/mnt/Stary                   /dev/sdc1           fuseblk         rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other,blksize=4096
    ```

    Jeżeli mamy do czynienia z pseudo systemem plików, to SOURCE == FSTYPE


* ### Które z punktów montażowych dają dostęp do instancji pseudo systemów plików?
    [PseudoFileSystem](https://wiki.st.com/stm32mpu/wiki/Pseudo_filesystem)
    * Pseudosystemy Plików - Pliki nie jestnieją i są generowane podczas dostępu do nich
        * sysfs (/sys)
        * procfs (/proc)
        * debugfs (/sys/kernel/debug)
        * configfs (/sys/kernel/config)
        * tracefs (/sys/kernel/tracing)
    * Tymczasowe systemy Plików - Systemu w ktorych pliki są usuwane podczas restartu systemu
        * tmppfs (/dev/shm, /run, /sys/fs/cgroup, /tmp/, /var/volatile, /run/user/< id >)
        * devtmpfs (/dev)
    
* ### 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.
    
    * relatime
        ![](https://i.imgur.com/48qXF6o.png)
        Czas dostępu do pliku nie jest aktualizowany przy każdym dostępie do pliku, a jedynie wtedy gdy:
        * czas modyfikacji lub zmiany jest nowszy niż czas dostępu
        * czas dostępu jest starszy niż określony przedział (domyślnie 1 dzień)
        
        Zastosowanie: Serwer WWW który wielokrotnie odczytuje ten sam plik, natomiast, natomiast czas dostępu jest zmieniany raz dziennie
        
    * noexec
        ![](https://i.imgur.com/klkj50Y.png)
        Nie zezwala na wykonywanie plików binarnych w filesystemie
        Zastosowanie: Zabezpiecznie przy montowaniu niepewnych Pendrivów
        
    * nodev
        ![](https://i.imgur.com/RQQnKMv.png)
        Nie zezwala na interpretacje przez system użądzeń znakowych i blokowych
        Zastosowanie: Zabezpieczenie przy montowaniu niepewnych Pendrivów. Wykonywanie specjalnych urządzeń znakowych lub blokowych z niezaufanych systemów plików zwiększa szansę nieuprzywilejowanych użytkowników na uzyskanie nieautoryzowanego dostępu administracyjnego.


## Zadanie 2
![](https://i.imgur.com/EZ9kKl2.png)

* ### Korzystając z pól superbloku (ang. superblock) podaj wzór na wyliczenie wartości: 
    * rozmiaru bloku
        [s_log_block_size](https://www.nongnu.org/ext2-doc/ext2.html#s-log-block-size)
        `block size = 1024 << s_log_block_size;`

    * liczby i-węzłów i bloków przechowywanych w grupie bloków (ang. block group) 
        [s_inodes_per_group](https://www.nongnu.org/ext2-doc/ext2.html#s-inodes-per-group)
        `((1024<<s_log_block_size)/s_inode_size)`
        [s_blocks_per_group](https://www.nongnu.org/ext2-doc/ext2.html#s-blocks-per-group)
    * liczby wpisów tablicy deskryptorów grup bloków (ang. block group descriptor table)
        tablica ta tak samo jak superblok jest zprzechowywana w każdej grupie bloków w velu uniknięcia uszkodzenia systemu plików
        `s_blocks_count/s_blocks_per_group`

* ### Wymień składowe należące do grupy bloków oraz podaj ich rozmiar w blokach.
    ![](https://i.imgur.com/xVMK43J.png)


    * SuperBlock -  1 blok
    * Group Descriptors - s_blocks_count/s_blocks_per_group
    * Block Bitmap 1 blok
    * Inode Bitmap 1blok
    * Inode Table s_inodes_per_group
    * Data Blocks s_blocks_per_group


    Two blocks near the start of each group are reserved for the block usage bitmap and the inode usage bitmap which show which blocks and inodes are in use. Since each bitmap is limited to a single block, this means that the maximum size of a block group is 8 times the size of a block.

    https://www.science.unitn.it/~fiorella/guidelinux/tlk/node95.html

* ### Które grupy bloków przechowują kopie zapasową superbloku i tablicy deskryptorów grup bloków?
    Grupy bloków 0, 1 oraz grupy powstałe z potęg liczb 3, 5 i 7 przechowują kopię zapasową superbloku i tablicy deskryptorów grup bloków.



## Zadanie 3
![](https://i.imgur.com/cGtOjuO.png)
* **Blok pośredni** (ang. indirect block) to blok zawierający wskaźniki na inne bloki pośrednie lub na bloki danych, zwykle jest używany przy pracy z dużymi plikami.
* **Zapis synchroniczny** wymuszamy czekanie na zakończenie operacji wejścia-wyjścia. Niestety mogą powstawać wycieki pamięci dyskowej! Szybkość operacji ograniczona przepustowością dysku.
* **Spójność systemu plików** pod wystąpieniu awarii system plików powinien posiadać spójne metadane (struktórę katalogów inodów itp.)

* ### Podaj listę kroków niezbędnych do realizacji funkcji dopisującej n bloków na koniec pliku.
    ![](https://i.imgur.com/aQMeFwQ.png)

    1. Wczytaj Inode Pliku
    2. Znajdź Wolny Blok
    3. Oznacz blok jako używany w bitmapie
    4. Jeśli miejsce w Tablicy Direct Blocks
        a. Dopisz blok do tablicy
    5. Idz do Indirect Bloku
    6. Idź do liścia
    7. jeśli brak miejsca 
        a. utwórz nowy indirect block
        b. Oznacz nowy indirect block jako używany w bitmapie
        c. podepnij liścia 
        d. blok to dodania to teraz nasz indirect block
        e. jeśli wiele bloków pośrednich powtarzaj
    8. Dodaj blok do tablicy
    9. Zapisz inode
    
    ```
    Insert Algorithm
    Insertion of new entries into the directory is considerably more complex than lookup, due to the need to split leaf blocks when they become full, and to satisfy the conditions that allow hash key collisions to be handled reliably and efficiently. I'll just summarize here:

    - Probe the index as for lookup
    - If the target leaf block is full, split it and note the block
      that will receive the new entry
    - Insert the new entry in the leaf block using the normal Ext2
      directory entry insertion code.

    The details of splitting and hash collision handling are somewhat messy, but I will be happy to dwell on them at length if anyone is interested.
    ```

## Zadanie 4
![](https://i.imgur.com/utDeNLl.png)

* ### Czemu «rename» zakończy się błędem «EXDEV» kiedy próbujemy przenieść plik do innego systemu plików? 
    Ponieważ rename modyfikuje przypisania inode do katalogów, same dane pliku nie zmieniają położenia. W przypadku róźnych filesystemów to niemożliwe

* 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. 
    1. Znajdujemy Inode pliku
    2. Zwiększamy licznik dowiązań
    3. Dodajemy wpis do katalogu
        a. Przechodzimy po wpisach i jeśli znajdziemy taki z inode 0 podmieniamy go
        b. wpp. dodajemy na koniec katalogu wpis (w razie potrzeby dodajemy bloki zad3)
    4. zapisujemy katalog
    5. zminiejszamy licznik dowiązań pliku
    6. Usuwamy (wpisujemy 0) do wpisu statego katalogu
    7. Zapisujemy katalog

## Zadanie 5
![](https://i.imgur.com/ATKRIDc.png)

* ### Powtórz polecenia z zadania 3 dla funkcji usuwającej plik zwykły z katalogu. 
    1. Ustaw wpis katalogu na 0
    2. Zmiejsz i_links_count o 1
    4. Jeśli i_links_count > 0 Zakończ
    5. Odczekaj aż wszystkie deksyptory zostaną zamknięte
    6. Zwalniamy bloki inoda
    7. Zwalniamy inode
    8. Aktualizujemy Superblok

* Kiedy możliwe jest odwrócenie operacji usunięcia pliku tj. odkasowania (ang. undelete)? 
    * Gdy nie wszystkie hardlinki zostały usunięte
    * Gdy Bloki nie zostały nadpisane
* 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?
    Gdy wszystkie deskryptory zostaną zamknięte

## Zadanie 6
![](https://i.imgur.com/hZICjFt.png)

* ### Wyjaśnij co robi system plików ext2 przy tworzeniu dowiązania twardego (ang. hard link) i symbolicznego (ang. symbolic link). 
    * Przy hardlinku dodajemy nowy wpis katalogu wskazujący na inode
    * Przy symbolic linku we wpisie w katalogu zawieramy wartość linku 

* Gdzie jest przechowywana zawartość dowiązania symbolicznego? 
    Zawartość linku symblocznego jest przechowywana bezpośrednio we wpiśie katalogu

* Jak za pomocą dowiązania symbolicznego stworzyć w systemie plików pętlę?
    ```
    link -s loop1 loop2
    link -s loop2 loop1
    cat loop1
    ```
* Kiedy jądro systemu operacyjnego ją wykryje i zwróci błąd `ELOOP`? 
    Istnieje maksymalna głębogość rozwinięcia rekurencyjnego ścierzki,
    gdy zostanie osiągnięta jądro zwraca `ELOOP`

* Czemu pętli nie da się zrobić z użyciem dowiązania twardego?
    Systemy Plików nie pozwalają na tworzenie wielu dowiązań do katalogu, między innymi aby uniknąć tworzenia pętli

## Zadanie 7
![](https://i.imgur.com/YDItNR2.png)

* ### Czemu fragmentacja systemu plików jest szkodliwym zjawiskiem?
* ### Opisz w jaki sposób odroczony przydział bloków (ang. delayed allocation) zapobiega powstawaniu fragmentacji. 
* ### Wytłumacz jak zakresy (ang. extents) pomagają w ograniczaniu rozmiaru metadanych przechowujących adresy bloków należących do danego pliku.
* ### Czy po defragmentacji systemu plików ext4 liczba wolnych bloków może wzrosnąć? 
* ### Jak mógłby wyglądać najprostszy algorytm defragmentacji?

## Zadanie 8
![](https://i.imgur.com/2LUw3wc.png)
    `sudo debugfs /dev/nvme1n1p2`
* ### Pokaż fragmentację systemu plików (freefrag) i informacje o grupach bloków (stats)
    `freefrag`
    `stats`
* ### Pokaż zakresy bloków z których składa się wybrany duży plik (extents)
    `extents plik`
* ### Pokaż że dowiązanie symboliczne może być przechowywane w i-węźle (idump)
    `idump plik`
* ### Pokaż do jakiego pliku należy wybrany blok (blocks, icheck, ncheck),
    `blocks` wypisuje wszystkie bloki w pliku
    `icheck` mapuje blok na inode
    `ncheck` mapuje węzeł na nazwę
* ### Pokaż reprezentację liniową małego katalogu (bdump).
    `blocks plik`
    `bdump`

## Zadanie 9
![](https://i.imgur.com/uoSgJ13.png)

## Zadanie 10
![](https://i.imgur.com/tiEz1nE.png)
