Pozdrav svima! Nastavljamo s pokretanjem novih tečajeva prema onim koje ste već zavoljeli i sada vam želimo javiti da započinjemo novi upis za tečaj , koji će započeti krajem travnja. Ovom događaju bit će posvećen novi članak. S originalnim materijalom možete .
Virtualni datotečni sustavi igraju ulogu neke vrste čarobne apstrakcije koja omogućuje filozofiji Linuxa da kaže da je "sve datoteka".

Što je datotečni sustav? Oslanjajući se na riječi jednog od prvih doprinositelja i autora Linuxa , "Datotečni sustav je hijerarhijska pohrana podataka organizirana prema određenoj strukturi". Ipak, ova definicija jednako dobro odgovara za VFAT (Virtual File Allocation Table), Git i (). Što zapravo definira pojam "datotečni sustav"?
Osnove datotečnih sustava
Jezgra Linuxa ima određene zahtjeve prema entitetu koji se može smatrati datotečnim sustavom. Mora implementirati metode open(), read() i write() za stalne objekte koji imaju imena. Sa stajališta objektno-orijentiranog , jezgra definira opći datotečni sustav (generic filesystem) kao apstraktni sučelje, a te tri velike funkcije smatraju se "virtualnima" i nemaju konkretno definiranje. Stoga, implementacija datotečnog sustava prema zadanim postavkama naziva se virtualnim datotečnim sustavom (VFS).

Ako možemo otvoriti, čitati i pisati u entitet, taj entitet se smatra datotekom, kao što vidimo iz primjera u konzoli iznad.
Fenomen VFS samo naglašava zapažanje karakteristično za Unix-slične sustave, koje kaže da je "sve datoteka". Razmislite o tome koliko je čudno što taj mali primjer iznad s /dev/console pokazuje kako zapravo konzola radi. Na slici je prikazana interaktivna Bash sesija. Slanje retka u konzolu (virtualni uređaj konzole) prikazuje ga na virtualnom ekranu. VFS ima i druge, još čudnije osobine. Na primjer, omogućuje pretraživanje kroz .
Poznati sustavi, poput ext4, NFS i /proc imaju tri važne funkcije u strukturi podataka C koja se naziva . Osim toga, određeni datotečni sustavi proširuju i redefiniraju funkcije VFS na uobičajen objektno-orijentirani način. Kao što Robert Love ističe, apstrakcija VFS omogućuje Linux korisnicima da bez brige kopiraju datoteke u ili iz vanjskih operativnih sustava ili apstraktnih entiteta poput cijevi, ne brinući se o njihovom internom formatu podataka. S korisničke strane, putem sistemskog poziva, proces može kopirati iz datoteke u strukture podataka jezgre koristeći metodu read() jednog datotečnog sustava, a zatim koristiti metodu write () drugog datotečnog sustava za ispis podataka.
Definicije funkcija koje pripadaju osnovnim tipovima VFS nalaze se u datotekama izvornog koda jezgre, dok poddirektoriji fs/ sadrže određene datotečne sustave. U jezgri se također nalaze entiteti poput cgroups, /dev i tmpfs, koji su potrebni u procesu pokretanja i stoga se definiraju u poddirektoriju jezgre init/. Primijetite da cgroups, /dev i tmpfs ne pozivaju «veliku trojku» funkcija file_operations, već izravno čitaju i pišu u memoriju.
Na donjoj dijagrami prikazano je kako userspace pristupa različitim vrstama datotečnih sustava koje se obično montiraju u Linux sustavima. Nisu prikazane konstrukcije poput pipes, dmesg i POSIX satova, koje također implementiraju strukturu file_operations, a pristup im ide kroz sloj VFS.

VFS je «sloj omota» između sistemskih poziva i implementacija određenih file_operations, kao što su ext4 i procfs. Funkcije file_operations mogu komunicirati ili s upravljačkim programima uređaja ili s uređajima za pristup memoriji. tmpfs, devtmpfs i cgroups ne koristi file_operations, a izravno pristupaju memoriji.
Postojanje VFS omogućuje ponovnu upotrebu koda, budući da osnovne metode povezane s datotečnim sustavima ne moraju biti ponovno implementirane za svaku vrstu datotečnog sustava. Ponovna upotreba koda je široko rasprostranjena praksa među inženjerima! Ipak, ako ponovo korišteni kod sadrži , svi će se implikacije kojima je zajedničke metode naslijedile suočiti s tim problemima.
/tmp: Простая подсказка
Jednostavan način da se otkrije da su VFS prisutni u sustavu je unijeti mount | grep -v sd | grep -v :/, što će prikazati sve montirane (mounted) datotečne sustave koji nisu rezidentni na disku i nisu NFS, što vrijedi za većinu računala. Jedan od navedenih montaža (mounts) VFS, zasigurno će biti /tmp, zar ne?

Svi znaju da pohrana / tmp na fizičkom nositelju – ludilo! .
Zašto nije preporučljivo pohranjivati /tmp na fizičkom nositelju? Zato što su datoteke u /tmp privremene, a uređaji za pohranu su sporiji od memorije gdje se kreira tmpfs. Štoviše, fizički nositelji su skloniji trošenju prilikom prepisivanja nego memorija. Na kraju, datoteke u /tmp mogu sadržavati povjerljive informacije, pa je njihovo nestajanje pri svakom ponovnom podizanju sustava neizostavna funkcija.
Nažalost, neki instalacijski skripti Linux distribucija po defaultu kreiraju /tmp na uređaju za pohranu. Ne očajavajte ako se to dogodilo i vašem sustavu. Izvršite nekoliko jednostavnih uputa s , da biste to ispravili, i zapamtite da memorija dodijeljena za tmpfs ne postaje dostupna za druge svrhe. Drugim riječima, sustav s ogromnim tmpfs-om i velikim datotekama u njemu može potrošiti svu memoriju i srušiti se. Drugi savjet: tijekom uređivanja datoteke /etc/fstab, zapamtite da bi trebala završiti novim retkom, inače se vaš sustav neće podići.
/proc и /sys
Osim /tmp, VFS (virtualni datotečni sustavi), koji su najpoznatiji korisnicima Linux-a – to su /proc i /sys. (/dev smješteni u zajedničkoj memoriji i nemaju file_operations). Zašto baš ova dva komponente? Razjasnimo ovo pitanje.
procfs stvara snimak trenutnog stanja jezgre i procesa koje kontrolira za userspace. U /proc jezgra ispisuje informacije o sredstvima koja ima na raspolaganju, poput prekida, virtualne memorije i rasporeda. Osim toga, /proc/sys – to je mjesto gdje su opcije konfigurirane pomoću naredbe sysctl, dostupne za userspace. Status i statistika pojedinih procesa ispisuju se u direktorijima /proc/.

Ovdje /proc/meminfo — to je prazna datoteka koja ipak sadrži dragocjene informacije.
Ponašanje /proc datoteka pokazuje kako se diskovni datotečni sustavi VFS mogu jako razlikovati. S jedne strane, /proc/meminfo sadrži informacije koje se mogu pregledati pomoću naredbe free. S druge strane, tamo je prazno! Kako to? „Postoji li mjesec kada ga nitko ne gleda? Stvarnost i kvantna teorija” /proc, koji je napisao profesor fizike s Cornell univerziteta David Mermin 1985. godine. Naime, jezgra prikuplja statistiku memorije kada dođe do zahtjeva za /proc nema ničega kada nitko ne gleda. Kako je rekao , "Osnovna kvantna doktrina kaže da mjerenje, u pravilu, ne otkriva prethodno postojeću vrijednost mjerenog svojstva." (A razmislite o pitanju o mjesecu kao domaću zadaću!)
Čini se kao praznina procfs ima smisla jer je informacije koje se tamo nalaze dinamične. Malo drugačija situacija je s sysfs. Uporedimo koliko datoteka veličine barem jedan bajt ima u /proc i u /sys.

Procfs ima jednu datoteku, a to je exportirana konfiguracija kernela, koja je iznimka jer se mora generirati samo jednom po pokretanju. S druge strane, u /sys ima mnogo većih datoteka, od kojih mnoge zauzimaju cijelu stranicu memorije. Obično datoteke sysfs sadrže točno jedan broj ili niz, za razliku od tablica informacija dobivenih čitanjem takvih datoteka kao /proc/meminfo.
Cilj sysfs – pruža svojstva koja su dostupna za čitanje i pisanje onoga što kernel naziva "kobjects" u userspaceu. Jedini cilj kobjects je brojanje referenci: kada se posljednja referenca na kobject ukloni, sustav će osloboditi resurse povezane s njim. Ipak, /sys čin čin kernela, koji nitko nikada, ni pod kojim okolnostima ne može . To ne znači da su datoteke u sysfs statične, što bi bilo u suprotnosti s brojanjem referenci na nestabilne objekte.
Stabilno binarno sučelje aplikacija kernela (kernel’s stable ABI) ograničava ono što može biti prisutno u /sys, a ne ono što je zapravo prisutno u tom određenom trenutku. Popis dopuštenja za datoteke u sysfs omogućava razumijevanje kako se konfigurabilni parametri uređaja, modula, datotečnih sustava itd. mogu postaviti ili pročitati. Izvlačimo logički zaključak da je procfs također dio stabilnog ABI-ja kernela, iako to nije izričito navedeno u .

Datoteke u sysfs opisuju jednu konkretnu osobinu za svaki entitet i mogu biti čitljive, prepisive ili oboje u isto vrijeme. "0" u datoteci ukazuje da SSD ne može biti uklonjen.
Drugi dio prijevoda započinjemo s time kako promatrati VFS pomoću alata eBPF i bcc, a sada čekamo vaše komentare i tradicionalno vas pozivamo na , koji će 9. travnja održati naš predavač — .
Izvor: habr.com
