Înainte Înapoi Cuprins

11. Cum ține calculatorul meu lucruri pe disc?

Când vă uitați la un hard disc sub Unix, vedeți un arbore de directoare și fișiere cu nume. Normal nu o să aveți nevoie să vă uitați mai adânc de atât, dar devine folositor de știut ce se întâmplă dedesubt dacă aveți un crash (prăbușire) a discului și aveți nevoie să încercați să vă salvați fișierele. Din nefericire, nu este nici o cale bună de a descrie organizarea discului de la nivelul de fișiere în jos, așa că o să încerc să o fac de la hardware în sus.

11.1 Discul la nivelul de jos (low-level) și structura sistemului de fișiere

Zona de suprafața a discului dvs, unde ține datele, este divizată asemenea unei table de dart -- în piste circulare care sunt apoi tăiate precum plăcintele în sectoare. Deoarece pistele apropiate de capătul exterior au mai mult spațiu decât cele apropiate de axul din centrul discului, pistele exterioare au mai multe felii de sector în ele decât cele interioare. Fiecare sector (sau disk block - bloc de disc) are aceași mărime, care sub Unixurile moderne este în general 1 K binar (1024 cuvinte de 8 biți). Fiecare bloc de disc are o adresă unică sau numar de bloc de disc.

Unix împarte discul în partiții de disc. Fiecare partiție este o întindere continuă de blocuri care e folosită separat de orice altă partiție, fie ca sistem de fișiere sau ca spațiu de swap. Partiția cu numărul cel mai mic este deseori tratată special, ca o partiție de boot unde puteți pune un kernel care să fie bootat.

Fiecare partiție este fie spatiu de swap (folosit pentru a implementa memoria virtuală sau un sistem de fișiere folosit pentru a ține fișiere. Parițiile cu spațiu de swap doar sunt tratate ca o secvență liniară de blocuri. Sistemele de fișiere, pe cealaltă parte, au nevoie de o cale de a potrivi numele de fișiere la secvențe de blocuri de disc. Deoarece fișierele cresc, scad, și se schimbă cu timpul, blocurile de date ale unui fișier nu vor fi o secvență liniară ci pot fi împrăștiate pe toată partiția sa (de oriunde sistemul de operare poate să găsească un bloc liber când are nevoie).

11.2 Numele de fișiere și directoare

În fiecare sistem de fișiere, potrivirea de la nume la blocuri este realizată printr-o structură numită un i-node. Este o mulțime din lucrurile acestea lânga ``fundul'' (blocurile cu numerele cele mai mici) fiecărui sistem (cele mai mici sunt folosite pentru menajeria casei și scopuri de etichetare pe care nu le vom descrie aici). Fiecare i-node descrie un fișier. Blocurile de date ale fișierului se află deasupra i-nodeurilor.

Fiecare i-node conține o listă a numerelor blocurilor în fișierul pe care îl descrie. (De fapt aceasta este pe jumătate adevărat, corect numai pentru fișiere mici, dar restul detaliilor nu sunt importante aici). Notați că i-nodeul nu conține numele fișierului.

Numele fișierului se află în structurile de directoare. O structură de directoare potrivește numele la numerele i-node. De aceasta, în Unix, un fișier poate avea nume adevărate multiple (legături hard); sunt doar intrări multiple de directoare care se întâmplă să indice același inode.

11.3 Puncte de mount

În cazul cel mai simplu, întregul dvs. sistem de fișiere Unix se află doar într-o singură partiție de disc. O să vedeți această aranjare pe unele sisteme Unix mici, personale, dar este neobișnuită. Mai tipic este să se întindă de-a lungul a câteva partiții de disc, posibil pe discuri fizice diferite. Astfel, de exemplu, sistemul dvs. s-ar putea să aibă o partiție mică unde se află kernelul, una ceva mai mare unde se află utilitarele SOului, și una mult mai mare unde se află directoarele home (acasă) ale utilizatorilor. Singura partiție la care o să aveți acces imediat după bootarea (pornirea) sistemului este partiția de root, ( root = rădacină ) care este (aproape mereu) cea de pe care ați bootat. Ea ține directorul root al sistemului de fișiere, nodul din vârf de care atârna tot restul.

Celelalte partiții în sistem trebuie să fie atașate la acest root pentru ca întregul dvs. sistem de fișiere multiplu să fie accesibil. Pe la jumătatea procesului de bootare, Unixul dvs. va face aceste partiții non-root accesibile. O să le monteze fiecare într-un director de pe partiția de root.

De exemplu, dacă aveți un director Unix numit `/usr', este probabil un punct de montare pentru o partiție care conține multe programe instalate cu Unixul dvs. dar de care nu este nevoie la bootare.

11.4 Cum se găsește un fișier

Acum putem să ne uităm la sistemul de fișiere de sus în jos. Când deschideți un fișier (precum, de exemplu, /home/esr/WWW/ldp/fundamentals.sgml) iată ce se întâmplă :

Kernelul începe la rădăcina sistemului de fișiere (în partiția de root). Se uită acolo după un director numit `home'. De obicei `home' este un punct de montare pentru o mare partiție pentru utilizatori în altă parte, așa că o să se ducă acolo. În nivelul de vârf al structurii de directoare a acelei partiție, o să se uite după o intrare numită `esr' și o să extragă un numar de inode. O să se ducă la acel i-node, o să-și dea seama că este o structură de directoare, și o să caute `WWW'. Extrăgând acel i-node, o să se ducă la subdirectorul corespunzător și o să caute `ldp'. Acesta o să-l ducă la alt inode de director. Deschizându-l, o să găsească un număr i-node pentru `fundamentals.sgml'. Acel inode nu este un director, ci ține lista blocurilor asociate cu fișierul.

11.5 Deținerea de fișiere, permisiuni și securitate

Pentru a împiedica programele de a nu călca accidental sau rău-intenționat pe date pe care nu ar trebui, Unix are facilități de permisii. Acestea au fost concepute original pentru a suporta împărțirea în timp, protejând utilizatorii multipli pe aceași mașină unii de alții, înapoi în zilele când Unix rula în principal pe minicomputere scumpe împărțite.

Pentru a înțelege permisiile de fișiere, trebuie să vă aduceți aminte de descrierea noastră de utilizatori și grupuri în secțiunea Ce se întâmplă când vâ logați?. Fiecare fișier are un utilizator deținător și un grup deținător. Acestea sunt inițial cele ale creatorului de fișiere; ele pot fi schimbate cu programele chown(1) (schimbă deținator) și chgrp(1) (schimbă grup).

Permisiunile fundamentale care pot fi asociate cu un fișier sunt `read' (permisia de a citi date din el), `write' (permisia de a-l modifica) și `execute' (permisia de a-l rula ca program). Fiecare fișier are trei seturi de permisii; unul pentru utilizatorul deținător, unul pentru orice utilizator din grupul său deținător, și unul pentru oricine altcineva. `Privilegiile' pe care le obțineți când vă logați sunt doar posibilitatea de a citi, scrie și executa acele fișiere pentru care biții de permisiuni se protrivesc cu IDul (identidatea) dvs. de utilizator sau a unui grup din care faceți parte.

Pentru a vedea cum acestea pot interacționa și cum Unix le afișează, să ne uităm la câteva listări de fișiere pe un sistem Unix ipotetic. Iată una:

snark:~$ ls -l notes
-rw-r--r--   1 esr      users         2993 Jun 17 11:00 notes

Aceasta este un fișier de date obișnuit. Listarea ne spune că este deținut de utilizatorul `esr' și a fost creat cu grupul deținător `users' (utilizatori). Probabil mașina pe care suntem pune fiecare utilizator obișnuit în acest grup ca standard; alte grupuri pe care le puteți vedea în mod obișnuit pe mașinile cu împărțire în timp sunt `staff' (conducere), `admin' (administratori) sau `wheel' (roată) (pentru motive evidente, grupurile nu sunt foarte importante pe stațiile de lucru pentru un singur utilizator sau PCuri). Unixul dvs. poate să folosească alt grup standard, poate unul numit după IDul dvs. de utilizator.

Șirul `-rw-r--r--' reprezintă permisiunea biților pentru fișier. Primul minus este poziția bitului de director; ar fi un `d' dacă fișierul ar fi fost un director. După acesta, primele trei locuri sunt permisiuni ale utilizatorului, al doilea grup de trei sunt permisiunile grupului, și al treilea sunt permisiunile pentru others (alții) (deseori numite permisii pentru `lume'). Pe acest fișier, utilizatorul deținător poate citi sau scrie, alți oameni din grupul `users' pot să citească, și toți oamenii din lume pot să-l citească. Acest este un set tipic de permisiuni pentru un fișier obișnuit.

Acum să ne uităm la un fișier cu permisii foarte diferite. Acest fișier este GCC, compilatorul GNU pentru limbajul C.

snark:~$ ls -l /usr/bin/gcc
-rwxr-xr-x   3 root     bin         64796 Mar 21 16:41 /usr/bin/gcc

Acest fișier aparține unui utilizator numit `root' și un grup numit `bin'; poate să fie scris (modificat) numai de root, dar citit sau executat de oricine. Acesta este un set tipic de deținători și permisiuni pentru o comandă sistem pre-instalată. Grupul `bin' există pe unele Unixuri pentru a grupa împreună comenzile sistem (numele este o relicvă istorică, scurtătura de la `binar'). Unixul dvs. poate folosi un grup `root' în loc (nu chiar același lucru cu utilizatorul `root' !).

Utilizatorul `root' este numele convențional pentru IDul numeric 0, un cont special, privilegiat, care poate să supra-scrie toate privilegiile. Accesul la root este folositor dar periculos; o greșeală de tastare când sunteți logat ca root poate să strice un sistem critic de fișiere pe care aceeași comandă executată de un utilizator obișnuit nu ar putea să-l atingă.

Deoarece contul de root este așa puternic, accesul la el ar trebui păzit foarte atent. Parola dvs. de root este singura informație cea mai critică de pe sistemul dvs., și este ceea ce orice crackeri sau persoane neautorizate care vor veni după dvs. o să încerce să obțină.

(Despre parole: Nu le scrieți -- și nu alegeți parole care pot fi ghicite ușor, precum prenumele prietenei/prietenului/soției/soțului. Aceasta este o practică proastă uimitoare care îi ajută pe crackeri la nesfârșit...)

Acum să ne uităm la al treilea caz:

snark:~$ ls -ld ~
drwxr-xr-x  89 esr      users          9216 Jun 27 11:29 /home2/esr
snark:~$ 

Acest fișier este un director (notați `d'-ul în primul slot de permisiuni). Vevdem că poate fi supra-scris numai de esr, dar citit și executat de oricine altcineva. Permisiunile sunt interpretate într-un fel special la directoare; ele controlează accesul la fișierele de sub ele din director.

Permisiunea de citire pe un director este simplă; înseamnă doar că puteți trece prin director pentru a deschide fișierele și directoarele de sub el. Permisiunea de scriere vă dă abilitatea de a crea și șterge fișiere din director. Permisiunea de execuție vă dă abilitatea de a căuta directorul -- adică de a-l lista și a vedea numele fișierelor și directoarelor pe care le conține. Ocazional o să vedeți un director care este citibil de toată lumea dar nu executabil de toată lumea; aceasta înseamnă că un utilizator oarecare poate să ajungă la fișierele și directoarele din el, dar numai dacă le știe numele lor exacte.

În sfârșit, să ne uităm la permisiunile programului de logare însuși.

snark:~$ ls -l /bin/login
-rwsr-xr-x   1 root     bin         20164 Apr 17 12:57 /bin/login

Acesta are permisiunile pe care le-am aștepta pentru o comandă sistem -- excepție făcând acel `s' unde bitul de execuție al utilizatorului ar trebui să fie. Aceasta este manifestarea vizibilă pentru o permisiune specială numită `set-user-id' (setează IDul utilizatorului) sau bitul setuid.

Bitul setuid este normal atașat la programe care au nevoie să dea utilizatorilor obișnuiți privilegii de root, dar într-un fel controlat. Când este setat pe un program executabil, primiți privilegiile deținătorului acelui fișier program cât timp programul este rulat de dvs., chiar dacă se potrivesc sau nu cu ale dvs.

Precum contul de root însuși, programele setuid sunt folositoare dar periculoase. Oricine poate corupe sau modifica un program setuid deținut de root poate să-l folosească pentru a porni un shell cu privilegii de root. Pentru acest motiv, deschiderea unui fișier pentru scriere dezactivează în mod automat bitul setuid pe cele mai multe Unixuri. Multe atacuri la securitatea Unix încearcă să profite de buguri (defecte de programare) în programele setuid pentru a le corupe. Administratorii de sistem conștiincioși referitor la securitate sunt așadar foarte atenți în legătură cu aceste programe și relocvenți la a instala unele noi.

Sunt câteva detalii importante peste care am trecut când am discutat persmisiuni mai sus; anume, cum grupul deținător și permisiunile sunt asignate când un fișier este creat prima oară. Grupul este o problemă deoarece utilizatorii pot fi membri unor grupuri multiple, dar unul din ele (specificat în linia utilizatorului din /etc/passwd) este grupul standard al utilizatorului și în mod normal va deține fișierele create de utilizator.

Povestea cu biții permisiunilor inițiale este un pic mai complicată. Un program care creează un fișier va specifica în mod normal permisiunile cu care să se nască. Dar acestea vor fi modificate de o variabilă în mediul utilizatorului numită umask (mască utilizator). Umask specifică care biți de permisiuni să dezactiveze când se creează un fișier; cea mai obișnuită valoare, și standard pe cele mai multe sisteme, este -------w- sau 002, care dezactivează bitul de scriere de către toată lumea. Vedeți documentația pentru comanda umask în paginile manualului de shell pentru detalii.

11.6 Cum lucrurile pot să meargă greșit

Mai devreme am sugestionat că sistemele de fișiere pot fi lucruri fragile. Acum știm că pentru a ajunge la un fișier trebuie cotrobăit prin ce ar putea fi un lanț de lungime arbitrară de directoare și referințe i-node. Dar dacă pee hard discul dvs. apare un punct prost ?

Dacă sunteți norocos, o să strice numai niște date dintr-un fișier. Dacă aveți ghinion, o să strice o structură de directoare sau numere i-node și o să lase un întreg sub-arbore al sistemului dvs. atârnând în limbo -- sau, mai rău, rezultă o structură defectă care indică căi multiple la același bloc de disc sau inode. Asemenea defecte pot să fie răspândite de operații normale cu fișiere, stricând date care nu erau original în punctul prost.

Din fericire, această posibilitate a devenit destul de rară pe măsură ce hardwareul de disc devine din ce în ce mai sigur. Totuși, înseamnă că Unixul dvs. o să vrea să verifice integritatea sistemului de fișiere periodic pentru a se asigura că totul este în regulă. Unixurile moderne fac un test de integritate rapid pe fiecare partiție la bootare, chiar înainte de a o monta. La fiecare câteva rebootări o să facă o verificare mult mai în detaliu care durează câteva minute mai mult.

Dacă toate acestea sună ca Unix este teribil de complex și invincibil la erori, poate fi reasigurător de știut că aceste verificări la bootare descoperă și corectează problemele normale înainte ca ele să devină dezastruoase cu adevărat. Alte sisteme de operare nu au aceste facilități, care mărește viteza de bootare un pic dar vă poate lăsa mult mai serios afectat când încearcați să recuperați de mână (și asta presupune că aveți o copie ale Utilitarelor Norton de la bun început...).


Înainte Înapoi Cuprins