Salut tuturor! Continuăm lansările de noi cursuri pe care le-ați îndrăgit deja și acum ne grăbim să vă anunțăm că vom începe un nou curs , care va fi lansat la sfârșitul lunii aprilie. Această ocazie va fi marcată printr-o nouă publicație. Puteți .
Sistemele de fișiere virtuale joacă rolul unei abstracții magice, care permite filozofiei Linux să afirmе că „totul este un fișier”.

Ce este un sistem de fișiere? Bazându-ne pe cuvintele unuia dintre primii contribuitori și autori ai Linux , „Un sistem de fișiere este un depozit ierarhic de date, organizat conform unei anumite structuri”. Oricum, această definiție se aplică la fel de bine pentru VFAT (Virtual File Allocation Table), Git și (). Așadar, ce anume definește conceptul de „sistem de fișiere”?
Bazele sistemului de fișiere
Kernelul Linux are cerințe specifice pentru entitatea care poate fi considerată un sistem de fișiere. Aceasta trebuie să implementeze metode open(), read() și write() pentru obiecte persistente care au nume. Din perspectiva programării orientate pe obiecte Dacă putem deschide, citi și scrie într-o entitate, atunci acea entitate este considerată un fișier, așa cum putem observa din exemplul de mai sus în consolă.

Fenomenul VFS subliniază observația caracteristică sistemelor Unix-like, care afirmă că „totul este un fișier”. Gândiți-vă cât de ciudat este că acel mic exemplu de mai sus cu /dev/console arată cum funcționează efectiv consola. Imaginea ilustrează o sesiune interactivă Bash. Trimiterea unei linii în consolă (dispozitivul consolei virtuale) o afișează pe ecranul virtual. VFS are alte, și mai ciudate, proprietăți. De exemplu, ea permite efectuarea căutărilor peste
acestea .
file_operations . În plus, anumite sisteme de fișiere extind și redefinirea funcțiilor VFS într-un mod obiectual obișnuit. Așa cum observă Robert Love, abstractizarea VFS permite utilizatorilor Linux să copieze fișiere în sau din sisteme de operare externe sau entități abstracte, cum ar fi pipes, fără a se îngrijora de formatul lor intern de date. Din perspectiva utilizatorului (userspace), printr-un apel de sistem, procesul poate copia dintr-un fișier în structuri de date ale nucleului prin metoda read() unei sisteme de fișiere, apoi folosi metoda write () a unei alte sisteme de fișiere pentru a scrie datele.
Definițiile funcțiilor care aparțin tipurilor de bază VFS se află în fișierele ale codului sursă al nucleului, în timp ce subdirectoarele fs/ conțin anumite sisteme de fișiere. În nucleu se găsesc, de asemenea, entități, cum ar fi cgroups, /dev și tmpfs, care sunt necesare în procesul de încărcare și, prin urmare, sunt definite în subdirectorul nucleului init/. Rețineți că cgroups, /dev și tmpfs nu invocă „cele trei mari” funcții file_operations, ci citesc și scriu direct în memorie.
Diagrama de mai jos arată cum userspace interacționează cu diferite tipuri de sisteme de fișiere, de obicei montate pe sistemele Linux. Construcțiile precum pipes, dmesg și ceasurile POSIX, care implementează, de asemenea, structuri file_operations, la care se accesează prin stratul VFS.

VFS este un „strat de înveliș” între apelurile de sistem și implementările anumitor file_operations, cum ar fi ext4 și procfs. Funcțiile file_operations pot interacționa fie cu driverele de dispozitive, fie cu dispozitivele de acces la memorie. tmpfs, devtmpfs și cgroups nu folosesc file_operations, având acces direct la memorie.
Existența VFS permite reutilizarea codului, deoarece metodele de bază legate de sistemele de fișiere nu trebuie să fie implementate din nou de fiecare tip de sistem de fișiere. Reutilizarea codului este o practică larg răspândită printre inginerii software! Cu toate acestea, dacă codul reutilizabil conține , toate implementările care moștenesc metodele comune sunt afectate.
/tmp: Простая подсказка
O metodă simplă de a determina că VFS este prezent în sistem este să introduceți mount | grep -v sd | grep -v :/, care va arăta toate sistemele de fișiere montate (mounted) care nu sunt rezidente pe disc și nu sunt NFS, ceea ce este adevărat în majoritatea computerelor. Una dintre montările enumerate (mounts) VFS va fi, fără îndoială, /tmp, corect?

Toți știu că stocarea / tmp pe un suport fizic este o nebunie! .
De ce nu este recomandat să stocăm /tmp pe un suport fizic? Pentru că fișierele din /tmp sunt temporare, iar dispozitivele de stocare sunt mai lente decât memoria, unde se creează tmpfs. Mai mult, suporturile fizice sunt mai predispuse la uzură la scriere decât memoria. În cele din urmă, fișierele din /tmp pot conține informații confidențiale, astfel că dispariția lor la fiecare repornire este o funcție esențială.
Din păcate, unele scripturi de instalare a distribuțiilor Linux creează /tmp pe un dispozitiv de stocare în mod implicit. Nu vă descurajați dacă s-a întâmplat și cu sistemul dumneavoastră. Urmați câteva instrucțiuni simple de pe , pentru a corecta asta, și amintiți-vă că memoria alocată pentru tmpfs devine indisponibilă pentru alte scopuri. Cu alte cuvinte, un sistem cu un tmpfs gigant și fișiere mari în el poate consuma toată memoria și se poate bloca. Un alt sfat: când editați fișierul /etc/fstab, amintiți-vă că acesta trebuie să se încheie cu un newline, altfel sistemul nu va porni.
/proc и /sys
În plus /tmp, VFS (sisteme de fișiere virtuale), care sunt cele mai cunoscute utilizatorilor Linux – este /proc și /sys. (/dev situat în memoria comună și nu are file_operations). De ce exact aceste două componente? Să încercăm să înțelegem această chestiune.
procfs creează o instantanee a stării curente a nucleului și a proceselor pe care le controlează pentru userspace. În /proc nucleul furnizează informații despre resursele disponibile, cum ar fi întreruperi, memorie virtuală și planificator. În plus, /proc/sys este locul unde parametrii setați cu comanda sysctl, sunt disponibili pentru userspace. Starea și statisticile proceselor individuale sunt afișate în directoare /proc/.

Aici /proc/meminfo — este un fișier gol care, cu toate acestea, conține informații valoroase.
Comportamentul /proc fișierelor arată cât de diferite pot fi sistemele de fișiere VFS. Pe de o parte, /proc/meminfo conțin informații care pot fi aflate prin comanda free. Pe de altă parte, acolo este gol! Cum se face asta? Situația amintește de binecunoscuta lucrare intitulată , scrisă de profesorul de fizică de la Universitatea Cornell, David Mermin, în 1985. Adevărul este că nucleul colectează statistici ale memoriei atunci când are loc o solicitare la /proc, și, de fapt, în fișiere. /proc nu este nimic atunci când nimeni nu se uită acolo. Așa cum a spus , „Doctrina fundamentală a cuantelor afirmă că măsurarea, în general, nu dezvăluie o valoare existentă anterior a proprietății măsurate.” (Iar către întrebarea despre lună, gândiți-vă ca temă pentru acasă!)
Vidul aparent procfs are sens, deoarece informația aflată acolo este dinamică. O situație ceva diferită este cu sysfs. Să comparăm câte fișiere de cel puțin un byte sunt în /proc și în /sys.

Procfs are un singur fișier, și anume configurația exportată a nucleului, care este o excepție, deoarece trebuie generată doar o dată la boot. Pe de altă parte, în /sys se află multe fișiere mai voluminoase, multe dintre ele ocupând o pagină întreagă de memorie. De obicei, fișierele sysfs conțin exact un număr sau un șir, spre deosebire de tabelele de informații obținute la citirea unor fișiere precum /proc/meminfo.
Scop sysfs – pentru a oferi proprietăți disponibile pentru citire și scriere a ceea ce nucleul denumește „kobjects” în userspace. Singurul scop al kobjects este numărarea referințelor: atunci când ultima referință la un kobject este ștearsă, sistemul va elibera resursele asociate cu acesta. Cu toate acestea, /sys reprezintă cea mai mare parte a faimosului al nucleului, care nu poate fi niciodată „stricat” Interfața binară stabilă a aplicațiilor nucleului (kernel’s stable ABI) limitează ceea ce poate apărea în
, și nu ceea ce este de fapt prezent în acel moment specific. Listarea permisiunilor fișierelor din sysfs oferă o înțelegere a modului în care parametrii configurabili ai dispozitivelor, modulelor, sistemelor de fișiere etc. pot fi setați sau citiți. Conchidem logic că procfs este de asemenea parte din stable ABI al nucleului, deși acest lucru nu este specificat explicit în /sysFișierele din .

descriu o proprietate specifică pentru fiecare entitate și pot fi citite, rescrise sau ambele simultan. „0” în fișier indică faptul că SSD-ul nu poate fi șters. sysfs Vom începe partea a doua a traducerii discutând despre observarea VFS cu ajutorul instrumentelor eBPF și bcc, iar acum așteptăm comentariile dumneavoastră și vă invităm tradițional la
, care pe 9 aprilie va fi condus de instructorul nostru — Vladimir Drozdetsky .
Sursa: habr.com
