Acest articol se dorește a fi o discuție la nivel foarte înalt a conceptelor sistemului de fișiere Linux. Nu se dorește a fi o descriere de nivel scăzut a modului în care funcționează un anumit tip de sistem de fișiere, cum ar fi EXT4, și nici nu se dorește a fi un tutorial de comenzi de sistem de fișiere.
Care calculator de uz general trebuie să stocheze date de diferite tipuri pe o unitate de hard disk (HDD) sau un echivalent, cum ar fi un stick de memorie USB. Există câteva motive pentru acest lucru. În primul rând, memoria RAM își pierde conținutul atunci când calculatorul este oprit. Există tipuri de memorie RAM non-volatilă care pot menține datele stocate acolo după ce este întreruptă alimentarea cu energie electrică (cum ar fi memoria RAM flash care este utilizată în stick-urile de memorie USB și în unitățile cu stare solidă), dar memoria RAM flash este mult mai scumpă decât memoria RAM standard, volatilă, cum ar fi DDR3 și alte tipuri similare.
Al doilea motiv pentru care datele trebuie să fie stocate pe hard disk-uri este faptul că și memoria RAM standard este în continuare mai scumpă decât spațiul pe disc. Atât costurile RAM, cât și cele ale discurilor au scăzut rapid, dar RAM este încă lider în ceea ce privește costul pe octet. Un calcul rapid al costului pe octet, bazat pe costurile pentru 16GB de RAM față de un hard disk de 2TB, arată că RAM-ul este de aproximativ 71 de ori mai scump pe unitate decât hard disk-ul. Un cost tipic pentru RAM este de aproximativ 0,0000000043743750 dolari pe octet în prezent.
Pentru o scurtă notă istorică pentru a pune în perspectivă costurile actuale ale RAM, în primele zile ale informaticii, un tip de memorie se baza pe puncte pe un ecran CRT. Acest lucru era foarte scump, la aproximativ 1,00 $ pe bit!
Definiții
Puteți auzi oameni vorbind despre sistemele de fișiere în mai multe moduri diferite și confuze. Cuvântul în sine poate avea mai multe sensuri și este posibil să trebuiască să discerneți sensul corect din contextul unei discuții sau al unui document.
Voi încerca să definesc diferitele sensuri ale cuvântului „sistem de fișiere” pe baza modului în care am observat că este folosit în diferite circumstanțe. Rețineți că, deși încerc să mă conformez semnificațiilor „oficiale” standard, intenția mea este de a defini termenul pe baza diferitelor sale utilizări. Aceste semnificații vor fi explorate mai detaliat în următoarele secțiuni ale acestui articol.
- Întreaga structură de directoare Linux începând cu directorul rădăcină de sus (/).
- Un tip specific de format de stocare a datelor, cum ar fi EXT3, EXT4, BTRFS, XFS și așa mai departe. Linux acceptă aproape 100 de tipuri de sisteme de fișiere, inclusiv unele foarte vechi, precum și unele dintre cele mai noi. Fiecare dintre aceste tipuri de sisteme de fișiere utilizează propriile structuri de metadate pentru a defini modul în care sunt stocate și accesate datele.
- O partiție sau un volum logic formatat cu un tip specific de sistem de fișiere care poate fi montat pe un punct de montare specificat pe un sistem de fișiere Linux.
Funcții de bază ale sistemului de fișiere
Stocarea pe disc este o necesitate care aduce cu sine câteva detalii interesante și inevitabile. În mod evident, un sistem de fișiere este conceput pentru a oferi spațiu pentru stocarea nevolatilă a datelor; aceasta este funcția sa finală. Cu toate acestea, există multe alte funcții importante care decurg din această cerință.
Toate sistemele de fișiere trebuie să furnizeze un spațiu de nume – adică o metodologie de denumire și organizare. Aceasta definește modul în care un fișier poate fi numit, în special lungimea unui nume de fișier și subsetul de caractere care pot fi utilizate pentru nume de fișiere din setul total de caractere disponibile. De asemenea, definește structura logică a datelor de pe un disc, cum ar fi utilizarea directoarelor pentru organizarea fișierelor în loc de a le aduna pe toate într-un singur conglomerat uriaș de fișiere.
După ce spațiul de nume a fost definit, este necesară o structură de metadate pentru a oferi fundația logică pentru acest spațiu de nume. Aceasta include structurile de date necesare pentru a susține o structură ierarhică de directoare; structuri pentru a determina ce blocuri de spațiu de pe disc sunt utilizate și care sunt disponibile; structuri care permit menținerea numelor fișierelor și directoarelor; informații despre fișiere, cum ar fi dimensiunea lor și orele la care au fost create, modificate sau accesate ultima dată; și locația sau locațiile datelor aparținând fișierului pe disc. Alte metadate sunt utilizate pentru a stoca informații de nivel înalt despre subdiviziunile discului, cum ar fi volumele logice și partițiile. Aceste metadate de nivel superior și structurile pe care le reprezintă conțin informații care descriu sistemul de fișiere stocat pe unitatea de disc sau pe partiție, dar sunt separate și independente de metadatele sistemului de fișiere.
Sistemele de fișiere necesită, de asemenea, o interfață de programare a aplicațiilor (API) care oferă acces la apelurile funcțiilor de sistem care manipulează obiectele sistemului de fișiere, cum ar fi fișierele și directoarele. API-urile asigură sarcini precum crearea, mutarea și ștergerea fișierelor. De asemenea, oferă algoritmi care determină lucruri precum locul în care un fișier este plasat într-un sistem de fișiere. Astfel de algoritmi pot ține cont de obiective precum viteza sau minimizarea fragmentării discului.
Sistemele de fișiere moderne oferă, de asemenea, un model de securitate, care este o schemă pentru definirea drepturilor de acces la fișiere și directoare. Modelul de securitate al sistemului de fișiere Linux ajută la asigurarea faptului că utilizatorii au acces numai la propriile fișiere și nu la cele ale altora sau la sistemul de operare însuși.
Celebrul final este reprezentat de software-ul necesar pentru a implementa toate aceste funcții. Linux utilizează o implementare software în două părți ca modalitate de a îmbunătăți atât eficiența sistemului, cât și a programatorului.
Figura 1: Implementarea software a sistemului de fișiere Linux în două părți.
Prima parte a acestei implementări în două părți este sistemul de fișiere virtual Linux. Acest sistem de fișiere virtual oferă un singur set de comenzi pentru nucleu, și pentru dezvoltatori, pentru a accesa toate tipurile de sisteme de fișiere. Software-ul sistemului de fișiere virtual apelează driverul de dispozitiv specific necesar pentru a realiza interfața cu diferitele tipuri de sisteme de fișiere. Driverele de dispozitiv specifice sistemului de fișiere reprezintă a doua parte a implementării. Driverul de dispozitiv interpretează setul standard de comenzi de sistem de fișiere în comenzi specifice tipului de sistem de fișiere de pe partiție sau volum logic.
Structura directoarelor
Ca o Fecioară de obicei foarte organizată, îmi plac lucrurile stocate în grupuri mai mici și organizate, mai degrabă decât într-o singură găleată mare. Folosirea directoarelor mă ajută să pot stoca și apoi să localizez fișierele pe care le doresc atunci când le caut. Directoarele sunt cunoscute și sub numele de foldere, deoarece pot fi gândite ca niște dosare în care sunt păstrate fișierele, într-un fel de analogie cu un desktop fizic.
În Linux și în multe alte sisteme de operare, directoarele pot fi structurate într-o ierarhie de tip arbore. Structura directoarelor Linux este bine definită și documentată în Linux Filesystem Hierarchy Standard (FHS). Referirea la aceste directoare la accesarea lor se realizează prin utilizarea numelor de directoare secvențial mai profunde, conectate prin bară oblică (/), cum ar fi /var/log și /var/spool/mail. Acestea se numesc căi de acces.
Tabelul următor oferă o listă foarte scurtă a directoarelor Linux de nivel superior standard, bine cunoscute și definite, precum și a scopurilor lor.
Directoriu | Descriere | |
---|---|---|
/ (sistem de fișiere rădăcină) | Sistemul de fișiere rădăcină este directorul de nivel superior al sistemului de fișiere. Acesta trebuie să conțină toate fișierele necesare pentru a porni sistemul Linux înainte ca alte sisteme de fișiere să fie montate. Acesta trebuie să includă toate executabilele și bibliotecile necesare pentru a porni celelalte sisteme de fișiere. După ce sistemul este pornit, toate celelalte sisteme de fișiere sunt montate pe puncte de montare standard, bine definite, ca subdirectoare ale sistemului de fișiere rădăcină. | |
/bin | Directorul /bin conține fișiere executabile de utilizator. | |
/boot | Conține fișierele executabile statice de bootloader și kernel și fișierele de configurare necesare pentru a porni un calculator Linux. | |
/dev | Acest director conține fișierele de dispozitiv pentru fiecare dispozitiv hardware atașat la sistem. Acestea nu sunt drivere de dispozitiv, ci mai degrabă sunt fișiere care reprezintă fiecare dispozitiv de pe calculator și facilitează accesul la aceste dispozitive. | |
/etc | Conține fișierele de configurare a sistemului local pentru calculatorul gazdă. | |
/home | Directorul home de stocare a fișierelor utilizatorului. Fiecare utilizator are un subdirector în /home. | |
/lib | Conține fișiere de bibliotecă partajate care sunt necesare pentru a porni sistemul. | |
/media | Un loc de montare a dispozitivelor media externe detașabile, cum ar fi unitățile USB, care pot fi conectate la gazdă. | |
/mnt | Un punct de montare temporar pentru sisteme de fișiere obișnuite (ca și în cazul în care nu sunt suporturi amovibile) care poate fi utilizat în timp ce administratorul repară sau lucrează la un sistem de fișiere. | |
/opt | Arhivele opționale, cum ar fi programele de aplicații furnizate de furnizor, ar trebui să fie localizate aici. | |
/root | Acesta nu este sistemul de fișiere rădăcină (/). Este directorul de domiciliu pentru utilizatorul root. | |
/sbin | Filiere binare de sistem. Acestea sunt executabile utilizate pentru administrarea sistemului. | |
/tmp | Director temporar. Folosit de sistemul de operare și de multe programe pentru a stoca fișiere temporare. Utilizatorii pot, de asemenea, să stocheze aici temporar fișiere. Rețineți că fișierele stocate aici pot fi șterse în orice moment, fără notificare prealabilă. | |
/usr | Acestea sunt fișiere partajabile, numai pentru citire, inclusiv fișiere binare executabile și biblioteci, fișiere man și alte tipuri de documentație. | |
/var | Filele de date variabile sunt stocate aici. Acestea pot include lucruri cum ar fi fișiere de jurnal, MySQL și alte fișiere de baze de date, fișiere de date ale serverelor web, căsuțe de e-mail și multe altele. |
Directoarele și subdirectoarele lor prezentate în tabelul 1, împreună cu subdirectoarele lor, care au un fundal de culoare albăstreleu, sunt considerate o parte integrantă a sistemului de fișiere rădăcină. Adică, nu pot fi create ca un sistem de fișiere separat și nu pot fi montate la pornire. Acest lucru se datorează faptului că ele (în mod specific, conținutul lor) trebuie să fie prezente la momentul pornirii pentru ca sistemul să pornească în mod corespunzător.
Directoarele /media și /mnt fac parte din sistemul de fișiere rădăcină, dar nu trebuie să conțină niciodată date. Mai degrabă, ele sunt pur și simplu puncte de montare temporare.
Registrele rămase, cele care nu au culoare de fundal în tabelul 1, nu trebuie să fie prezente în timpul secvenței de pornire, dar vor fi montate mai târziu, în timpul secvenței de pornire care pregătește gazda pentru a efectua lucrări utile.
Asigurați-vă că consultați pagina web oficială Linux Filesystem Hierarchy Standard (FHS) pentru detalii despre fiecare dintre aceste directoare și numeroasele lor subdirectoare. Wikipedia are, de asemenea, o bună descriere a FHS. Acest standard ar trebui urmat cât mai îndeaproape posibil pentru a asigura coerența operațională și funcțională. Indiferent de tipurile de sisteme de fișiere utilizate pe o gazdă, această structură ierarhică de directoare este aceeași.
Structura de directoare unificată Linux
În unele sisteme de operare pentru PC care nu sunt Linux, dacă există mai multe hard disk-uri fizice sau mai multe partiții, fiecărui disc sau partiție i se atribuie o literă de unitate. Este necesar să se știe pe ce hard disk se află un fișier sau un program, cum ar fi C: sau D:. Apoi se emite litera de unitate ca o comandă, D:, de exemplu, pentru a trece la unitatea D:, iar apoi se utilizează comanda cd pentru a trece la directorul corect pentru a localiza fișierul dorit. Fiecare hard disk are propriul său arbore de directoare separat și complet.
Sistemul de fișiere Linux unifică toate hard disk-urile fizice și partițiile într-o singură structură de directoare. Totul începe în partea de sus – directorul rădăcină (/). Toate celelalte directoare și subdirectoarele lor sunt situate sub unicul director rădăcină Linux. Acest lucru înseamnă că există un singur arbore de directoare în care se pot căuta fișiere și programe.
Acest lucru poate funcționa numai pentru că un sistem de fișiere, cum ar fi /home, /tmp, /var, /opt sau /usr, poate fi creat pe hard disk-uri fizice separate, pe o partiție diferită sau pe un volum logic diferit de sistemul de fișiere / (rădăcină) și apoi poate fi montat pe un punct de montare (director) ca parte a arborelui sistemului de fișiere rădăcină. Chiar și unitățile detașabile, cum ar fi o unitate de memorie USB sau un hard disk extern USB sau ESATA, vor fi montate pe sistemul de fișiere rădăcină și vor deveni parte integrantă a acelui arbore de directoare.
Un motiv întemeiat pentru a face acest lucru este evident în timpul unei actualizări de la o versiune a unei distribuții Linux la alta, sau în timpul schimbării de la o distribuție la alta. În general, și în afară de orice utilități de actualizare, cum ar fi dnf-upgrade în Fedora, este înțelept să reformatați ocazional hard disk-ul (hard disk-urile) care conțin sistemul de operare în timpul unei actualizări pentru a elimina în mod pozitiv orice greșeală care s-a acumulat în timp. În cazul în care /home face parte din sistemul de fișiere rădăcină, acesta va fi, de asemenea, reformatat și va trebui apoi restaurat dintr-o copie de rezervă. Dacă /home este un sistem de fișiere separat, programul de instalare va ști că este un sistem de fișiere separat, iar formatarea lui poate fi omisă. Acest lucru se poate aplica și la /var, unde sunt stocate baza de date, căsuțele de e-mail, site-ul web și alte date variabile ale utilizatorului și ale sistemului.
Există și alte motive pentru a menține anumite părți ale arborelui de directoare Linux ca sisteme de fișiere separate. De exemplu, cu mult timp în urmă, când nu eram încă conștient de potențialele probleme legate de a avea toate directoarele Linux necesare ca parte a sistemului de fișiere / (rădăcină), am reușit să-mi umplu directorul de acasă cu un număr mare de fișiere foarte mari. Deoarece nici directorul /home și nici directorul /tmp nu erau sisteme de fișiere separate, ci doar subdirectoare ale sistemului de fișiere rădăcină, întregul sistem de fișiere rădăcină s-a umplut. Nu mai rămăsese loc pentru ca sistemul de operare să creeze fișiere temporare sau să extindă fișierele de date existente. La început, programele de aplicații au început să se plângă că nu mai era loc pentru a salva fișiere, iar apoi sistemul de operare însuși a început să se comporte foarte ciudat. Pornirea în modul pentru un singur utilizator și ștergerea fișierelor incriminate din directorul meu personal mi-au permis să pornesc din nou. Apoi am reinstalat Linux folosind o configurație multi-filesystem destul de standard și am reușit să împiedic blocarea completă a sistemului să apară din nou.
Am avut odată o situație în care o gazdă Linux a continuat să ruleze, dar a împiedicat utilizatorul să se logheze folosind desktop-ul GUI. Am reușit să mă loghez folosind interfața de linie de comandă (CLI) local, folosind una dintre consolele virtuale, și de la distanță folosind SSH. Problema era că sistemul de fișiere /tmp se umpluse, iar unele fișiere temporare necesare pentru desktop-ul GUI nu puteau fi create în momentul conectării. Deoarece autentificarea prin CLI nu a necesitat crearea de fișiere în /tmp, lipsa de spațiu acolo nu m-a împiedicat să mă autentific folosind CLI. În acest caz, directorul /tmp era un sistem de fișiere separat și exista suficient spațiu disponibil în grupul de volume din care făcea parte volumul logic /tmp. Pur și simplu am extins volumul logic /tmp la o dimensiune care să se potrivească cu noua mea înțelegere a cantității de spațiu pentru fișierele temporare necesare pe acea gazdă și problema a fost rezolvată. Rețineți că această soluție nu a necesitat o repornire și, de îndată ce sistemul de fișiere /tmp a fost mărit, utilizatorul a putut să se conecteze la desktop.
O altă situație a apărut în timp ce lucram ca administrator de laborator la o mare companie de tehnologie. Unul dintre dezvoltatorii noștri instalase o aplicație în locația greșită (/var). Aplicația se bloca deoarece sistemul de fișiere /var era plin, iar fișierele jurnal, care sunt stocate în /var/log pe acel sistem de fișiere, nu puteau fi completate cu mesaje noi din cauza lipsei de spațiu. Cu toate acestea, sistemul rămânea în funcțiune pentru că sistemele de fișiere critice / (root) și /tmp nu se umpleau. Îndepărtarea aplicației incriminate și reinstalarea acesteia în sistemul de fișiere /opt a rezolvat această problemă.
Tipuri de sisteme de fișiere
Linux acceptă citirea a aproximativ 100 de tipuri de partiții; poate crea și scrie doar pe câteva dintre acestea. Dar este posibil – și foarte frecvent – să se monteze sisteme de fișiere de diferite tipuri pe același sistem de fișiere rădăcină. În acest context, vorbim despre sistemele de fișiere în termeni de structuri și metadate necesare pentru a stoca și gestiona datele utilizatorului pe o partiție a unui hard disk sau a unui volum logic. Lista completă a tipurilor de partiții de sisteme de fișiere recunoscute de comanda Linux fdisk este furnizată aici, astfel încât să vă puteți face o idee despre gradul ridicat de compatibilitate pe care Linux îl are cu foarte multe tipuri de sisteme.
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT
Scopul principal al susținerii capacității de a citi atât de multe tipuri de partiții este acela de a permite compatibilitatea și cel puțin o anumită interoperabilitate cu sistemele de fișiere ale altor sisteme informatice. Alegerile disponibile la crearea unui nou sistem de fișiere cu Fedora sunt prezentate în lista următoare.
- btrfs
- cramfs
- ext2
- ext3
- ext4
- fat
- gfs2
- hfsplus
- minix
- msdos
- ntfs
- reiserfs
- vfat
- xfs
.
Alte distribuții acceptă crearea unor tipuri diferite de sisteme de fișiere. De exemplu, CentOS 6 suportă crearea doar a acelor sisteme de fișiere evidențiate cu bold în lista de mai sus.
Montarea
Termenul „a monta” un sistem de fișiere în Linux se referă la începuturile informaticii, când un pachet de benzi sau de discuri detașabile trebuia să fie montat fizic pe un dispozitiv de unitate corespunzător. După ce era plasat fizic pe unitatea de disc, sistemul de fișiere de pe pachetul de discuri ar fi fost montat logic de către sistemul de operare pentru a face conținutul disponibil pentru a fi accesat de către sistemul de operare, programele de aplicații și utilizatori.
Un punct de montare este pur și simplu un director, ca oricare altul, care este creat ca parte a sistemului de fișiere rădăcină. Astfel, de exemplu, sistemul de fișiere home este montat pe directorul /home. Sistemele de fișiere pot fi montate în puncte de montare pe alte sisteme de fișiere care nu sunt rădăcină, dar acest lucru este mai puțin obișnuit.
Sistemul de fișiere rădăcină Linux este montat pe directorul rădăcină (/) foarte devreme în secvența de pornire. Alte sisteme de fișiere sunt montate mai târziu, de către programele de pornire Linux, fie rc sub SystemV, fie de systemd în versiunile mai noi ale Linux. Montarea sistemelor de fișiere în timpul procesului de pornire este gestionată de fișierul de configurare /etc/fstab. O modalitate ușoară de a reține acest lucru este că fstab înseamnă „file system table” (tabel de sistem de fișiere) și este o listă de sisteme de fișiere care urmează să fie montate, punctele de montare desemnate pentru acestea și orice opțiuni care ar putea fi necesare pentru anumite sisteme de fișiere.
Sistemele de fișiere sunt montate pe un director/punct de montare existent folosind comanda mount. În general, orice director care este utilizat ca punct de montare trebuie să fie gol și să nu aibă niciun alt fișier conținut în el. Linux nu va împiedica utilizatorii să monteze un sistem de fișiere peste unul care există deja sau pe un director care conține fișiere. Dacă montați un sistem de fișiere pe un director sau un sistem de fișiere existent, conținutul original va fi ascuns și doar conținutul sistemului de fișiere nou montat va fi vizibil.
Concluzie
Sper că o parte din posibila confuzie legată de termenul de sistem de fișiere a fost clarificată de acest articol. A fost nevoie de mult timp și de un mentor foarte util pentru ca eu să înțeleg și să apreciez cu adevărat complexitatea, eleganța și funcționalitatea sistemului de fișiere Linux în toate semnificațiile sale.
Dacă aveți întrebări, vă rog să le adăugați în comentariile de mai jos și voi încerca să le răspund.
Luna viitoare
Un alt concept important este că pentru Linux, totul este un fișier. Acest concept are câteva aplicații practice interesante și importante pentru utilizatori și administratori de sistem. Motivul pentru care menționez acest lucru este că s-ar putea să doriți să citiți articolul meu „Totul este un fișier” înainte de articolul pe care îl planific pentru luna viitoare despre directorul /dev.
.