Sisteme de fișiere virtuale în Linux: de ce sunt necesare și cum funcționează? Partea 1

Salutare tuturor! Continuăm să lansăm noi fluxuri pentru cursurile de care te-ai îndrăgostit deja și acum ne grăbim să anunțăm că începem un nou set de cursuri „Administrator Linux”care se va lansa la sfarsitul lunii aprilie. O nouă publicație va fi datată pentru acest eveniment. Cu materialul original, poți citeste aici.

Sistemele de fișiere virtuale servesc ca un fel de abstractizare magică care permite filozofiei Linux să spună că „totul este un fișier”.

Sisteme de fișiere virtuale în Linux: de ce sunt necesare și cum funcționează? Partea 1

Ce este un sistem de fișiere? Bazat pe cuvintele unuia dintre primii contribuitori și autori ai Linux Roberta Lava, „Un sistem de fișiere este o stocare ierarhică a datelor asamblate conform unei structuri specifice.” Oricum ar fi, această definiție este la fel de potrivită pentru VFAT (Virtual File Allocation Table), Git și Cassandra (Baza de date NoSQL). Deci, ce definește exact un astfel de lucru ca „sistem de fișiere”?

Bazele sistemului de fișiere

Nucleul Linux are anumite cerințe pentru o entitate care poate fi considerată un sistem de fișiere. Trebuie să implementeze metodele open(), read() и write() pentru obiectele persistente care au nume. Din punct de vedere orientat pe obiecte programare, nucleul definește un sistem de fișiere generic ca o interfață abstractă, iar aceste trei funcții mari sunt considerate „virtuale” și nu au o definiție concretă. În consecință, implementarea implicită a sistemului de fișiere se numește sistem de fișiere virtual (VFS).

Sisteme de fișiere virtuale în Linux: de ce sunt necesare și cum funcționează? Partea 1

Dacă putem deschide, citi și scrie într-o entitate, atunci acea entitate este considerată un fișier, așa cum putem vedea din exemplul din consola de mai sus.
Fenomenul VFS subliniază doar observația Unix-like că „totul este un fișier”. Gândiți-vă cât de ciudat că acel mic exemplu /dev/console de mai sus arată cum funcționează de fapt consola. Imaginea arată o sesiune interactivă Bash. Trimiterea unui șir către consolă (dispozitiv de consolă virtuală) îl afișează pe un ecran virtual. VFS are alte proprietăți, chiar mai ciudate. De exemplu, vă permite să căutați după ним.

Sistemele familiare precum ext4, NFS și /proc au trei funcții importante într-o structură de date C numită operațiuni_fișier. În plus, anumite sisteme de fișiere extind și redefinesc funcționalitatea VFS într-un mod familiar orientat pe obiecte. După cum subliniază Robert Love, abstracția VFS permite utilizatorilor Linux să copieze cu nonșalanță fișiere pe sau de pe sisteme de operare terțe sau entități abstracte, cum ar fi conductele, fără a-și face griji cu privire la formatul lor intern de date. Pe partea utilizatorului (spațiu utilizator), folosind un apel de sistem, un proces poate copia dintr-un fișier în structurile de date ale nucleului folosind metoda read() un sistem de fișiere și apoi utilizați metoda write () un alt sistem de fișiere pentru ieșirea datelor.

Definițiile funcției care aparțin tipurilor de bază VFS sunt în fișiere fs/*.c codul sursă al nucleului, în timp ce subdirectoarele fs/ conţin anumite sisteme de fişiere. Nucleul conține, de asemenea, entități precum cgroups, /dev и tmpfs, care sunt necesare în timpul procesului de pornire și, prin urmare, sunt definite în subdirectorul kernelului init/. Observa asta cgroups, /dev и tmpfs nu numiți funcțiile „trei mari”. file_operations, dar citiți și scrieți direct în memorie.
Diagrama de mai jos arată modul în care spațiul utilizatorului accesează diferitele tipuri de sisteme de fișiere montate în mod obișnuit pe sistemele Linux. Structuri nu sunt afișate pipes, dmesg и POSIX clocks, care implementează și structura file_operations, accesat prin stratul VFS.

Sisteme de fișiere virtuale în Linux: de ce sunt necesare și cum funcționează? Partea 1

VFS este un „layer de înveliș” între apelurile de sistem și implementările anumitor file_operationscum ar fi ext4 и procfs. Funcții file_operations poate interacționa fie cu driverele de dispozitiv, fie cu dispozitivele de acces la memorie. tmpfs, devtmpfs и cgroups nu folosi file_operations, dar accesați direct memoria.
Existența VFS oferă o oportunitate de reutilizare a codului, deoarece metodele de bază asociate sistemelor de fișiere nu trebuie să fie reimplementate de fiecare tip de sistem de fișiere. Reutilizarea codului este o practică comună în rândul inginerilor de software! Totuși, dacă codul reutilizabil conține greseli grave, toate implementările care moștenesc metode comune suferă de ele.

/tmp: Sugestie simplă

O modalitate ușoară de a detecta dacă VFS sunt prezente pe un sistem este să tastați mount | grep -v sd | grep -v :/, care va afișa toate montate (mounted) sisteme de fișiere care nu sunt rezidente pe disc și non-NFS, ceea ce este valabil pe majoritatea computerelor. Unul dintre monturile enumerate (mounts) VFS va, fără îndoială /tmp, dreapta?

Sisteme de fișiere virtuale în Linux: de ce sunt necesare și cum funcționează? Partea 1

Toată lumea știe acel depozit / tmp pe un mediu fizic - nebunie! Sursă.

De ce nu este de dorit să se depoziteze /tmp pe medii fizice? Pentru că fișierele din /tmp sunt temporare, iar dispozitivele de stocare sunt mai lente decât memoria în care este creat tmpfs. Mai mult, mediile fizice sunt mai susceptibile de a fi uzate atunci când sunt suprascrise decât memoria. În cele din urmă, fișierele din /tmp pot conține informații sensibile, astfel încât să le facă să dispară la fiecare repornire este o caracteristică esențială.

Din păcate, unele scripturi de instalare a distribuției Linux creează /tmp pe dispozitivul de stocare în mod implicit. Nu disperați dacă acest lucru s-a întâmplat și cu sistemul dvs. Urmați câteva instrucțiuni simple cu Arch Wikipentru a remedia acest lucru și fiți conștienți de faptul că memoria alocată pentru tmpfs devine indisponibilă pentru alte scopuri. Cu alte cuvinte, un sistem cu un tmpfs gigant și fișiere mari pe el poate rămâne fără memorie și să se prăbușească. Un alt indiciu: în timp ce editați un fișier /etc/fstab, amintiți-vă că trebuie să se încheie cu o linie nouă, altfel sistemul dumneavoastră nu va porni.

/proc și /sys

În afară de /tmp, VFS (sisteme de fișiere virtuale) care sunt cele mai familiare utilizatorilor Linux sunt /proc и /sys. (/dev rezidă în memoria partajată și nu are file_operations). De ce aceste două componente? Să ne uităm la această problemă.

procfs creează un instantaneu al nucleului și al proceselor pe care le monitorizează userspace. În /proc nucleul imprimă informații despre ceea ce are disponibil, cum ar fi întreruperi, memoria virtuală și planificatorul. In afara de asta, /proc/sys este locul unde sunt configurați parametrii cu comanda sysctl, Disponibil pentru userspace. Starea și statisticile proceselor individuale sunt afișate în directoare /proc/.

Sisteme de fișiere virtuale în Linux: de ce sunt necesare și cum funcționează? Partea 1

Aici /proc/meminfo este un fișier gol care conține totuși informații valoroase.

comportament /proc fișierele arată cât de diferite pot fi sistemele de fișiere de disc VFS. Pe de o parte, /proc/meminfo conțin informații care pot fi vizualizate cu comanda free. Pe de altă parte, e gol! Cum functioneazã? Situația amintește de celebrul articol intitulat Există luna când nimeni nu se uită la ea? Realitatea și teoria cuantică”scris de profesorul de fizică de la Universitatea Cornell, David Mermin, în 1985. Faptul este că nucleul colectează statistici de memorie atunci când i se face o solicitare /proc, și de fapt în fișiere /proc nu există nimic când nimeni nu se uită. După cum s-a spus Mermin, „Doctrina cuantică fundamentală spune că măsurarea, în general, nu dezvăluie o valoare preexistentă a proprietății măsurate”. (Și luați în considerare întrebarea despre lună ca teme!)
Părea de gol procfs are sens deoarece informațiile de acolo sunt dinamice. O situație puțin diferită cu sysfs. Să comparăm câte fișiere care au dimensiunea de cel puțin un octet se află /proc și /sys.

Sisteme de fișiere virtuale în Linux: de ce sunt necesare și cum funcționează? Partea 1

Procfs are un singur fișier, și anume configurația kernel-ului exportată, care este o excepție deoarece trebuie generată o singură dată per pornire. Pe de altă parte, în /sys există multe fișiere mai mari, dintre care multe ocupă o întreagă pagină de memorie. De obicei fișiere sysfs conțin exact un număr sau o linie, spre deosebire de tabelele de informații obținute din citirea fișierelor precum /proc/meminfo.

Scop sysfs - furnizați proprietăți de citire/scriere a ceea ce apelează nucleul «kobjects» în spațiul utilizatorului. Singurul scop kobjects este contorizarea linkurilor: când ultima legătură către un kobject este eliminată, sistemul va restaura resursele asociate cu acesta. Cu toate acestea, /sys alcătuiește majoritatea celebrilor „ABI stabil pentru spațiul utilizator” nucleu, pe care nimeni nu o poate face niciodată, sub nicio formă "pauză". Acest lucru nu înseamnă că fișierele din sysfs sunt statice, ceea ce ar fi incompatibil cu numărarea referințelor obiectelor instabile.
ABI stabil al nucleului limitează ceea ce poate apărea în /sys, nu ceea ce este de fapt prezent în acel moment anume. Listarea permisiunilor de fișiere în sysfs oferă o perspectivă asupra modului în care setările configurabile pentru dispozitive, module, sisteme de fișiere etc. poate fi configurat sau citit. Concluzia logică este că procfs face, de asemenea, parte din ABI stabil al nucleului, deși acest lucru nu este menționat în mod explicit în documentație.

Sisteme de fișiere virtuale în Linux: de ce sunt necesare și cum funcționează? Partea 1

Fișiere în sysfs descrie o proprietate particulară pentru fiecare entitate și poate fi citită, scrisă sau ambele. „0” din fișier înseamnă că SSD-ul nu poate fi îndepărtat.

Să începem a doua parte a traducerii cu cum să monitorizăm VFS folosind instrumentele eBPF și bcc, iar acum așteptăm comentariile dvs. și vă invităm în mod tradițional să webinar deschis, care va avea loc de profesorul nostru pe 9 aprilie - Vladimir Drozdetsky.

Sursa: www.habr.com

Adauga un comentariu