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