CATEGORII DOCUMENTE |
Montarea/demontarea sistemelor de fisiere - UNIX
Dupa cum se cunoaste, un disc fizic poate contine mai multe partitii logice, realizate de catre driverul de disc. Fiecare partitie are un nume de fisier dispozitiv. Un proces poate accesa datele unei partitii deschizand fisierului asociat acesteia, fisier tratat ca o succesiune de blocuri disc in care se poate scrie sau citi (pentru detalii vezi capitolul 6). O astfel de partitie disc poate contine un sistem logic de fisiere ce consta din: un bloc de boot, superblocul, lista de inoduri, si blocuri de date. Prezentarea acestor structuri s-a facut in capitolul 2. Un sistem de fisiere poate fi conectat logic (montat) intr-unul din nodurile arborelui unui alt sistem de fisiere prin intermediul apelului sistem mount. Demontarea se face folosind apelul sistem umount.
Sintaxa apelului sistem mount este:
mount (cale-speciala, cale-director, optiuni);
unde caleIspeciala este numele fisierului dispozitiv special corespunzator partitiei disc ce contine sistemul de fisiere ce va fi montat, caleIdirector este directorul din ierarhia existenta in care se va efectua montarea, numit si punct de montare (mount point), iar optiuni indica daca sistemul de fisiere ar trebui montat "read-only" (sistemul de fisiere va putea fi accesat doar pentru citire, iar apeluri sistem cum ar fi write si creat care modifica sistemul de fisiere vor esua).
Daca un proces executa apelul sistem mount ('/dev/dsk1','/usr',0), nucleul ataseaza sistemul de fisiere continut in partitia disc numita '/dev/dsk1' in directorul '/usr' din arborele existent al unui sistem de fisiere (vezi figura 5.22). Fisierul '/dev/dsk1' este un fisier special bloc, adica el este numele unui dispozitiv bloc, uzual o partitie disc. Nucleul considera ca partitia disc indicata contine un sistem de fisiere. Dupa conectare, radacina sistemului de fisiere montat este accesata prin numele "/usr", iar procesele pot accesa fisierele partitiei in mod normal.
Figura 5.22 Sistemul de fisiere inainte si dupa montare
Nucleul dispune de o tabela de montare (Mount Table - MT) cu intrari pentru fiecare sistem de fisiere montat. Fiecare intrare contine:
un numar de dispozitiv care identifica sistemul de fisiere conectat (acesta este numarul logic al sistemului de fisiere mentionat anterior);
un pointer la un buffer ce contine superblocul sistemului de fisiere (orice sistem de fisiere activ are superblocul in memoria interna);
un pointer la inodul radacina al sistemului de fisiere ce va fi montat ("/" al sistemului de fisiere "/dev/dsk1" din figura 5.22);
un pointer la inodul directorului in care se va monta sistemul de fisiere ("usr" din sistemului de fisiere radacina, vezi figura 5.22)
Asocierea ce se realizeaza pe durata apelului sistem mount intre inodul punctului de montare si inodul radacina al sistemului de fisiere montat permite nucleului sa traverseze cu usurinta noua structura de directoare creata.
In figura 5.23 este prezentat algoritmul pentru montarea unui sistem de fisiere. Nucleul acorda numai superutilizatorului dreptul de a monta si demonta sisteme de fisiere.
Nucleul gaseste inodul fisierului special corespunzator sistemului de fisiere ce trebuie montat, extrage numerele major si minor care identifica partitia disc corespunzatoare, iar apoi gaseste inodul directorului in care se va face montarea.
algoritm mount
intrari: numele fisierului bloc special
numele directorului in care se face montarea
optiuni de montare (read only)
iesire: niciuna
gaseste o intrare libera in MT;
/* pentru citirea superblocului */
apeleaza rutina de deschidere a fisierului special;
obtine un buffer liber din buffer-ul cache (varianta algoritm getblk);
initializeaza campurile superblocului;
obtine nodul pentru radacina al dispozitivului montat (algoritm iget) si-l
salveaza in MT;
marcheaza inodul directorului in care se face montarea ca punct de
montare;
elibereaza inodul fisierului special (algoritm iput);
deblocheaza inodul directorului punct de montare;
}
Figura 5.23 Algoritmul pentru montarea unui sistem de fisiere
Contorul de referinta al inodului nu trebuie sa fie mai mare decat 1 (trebuie sa fie cel putin 1). Apoi, nucleul aloca o intrare libera in tabela de montare, marcheaza intrarea ca fiind "in curs de folosire" si asigneaza campul care contine numarul de dispozitiv din tabela de montare. Asignarile de mai sus se fac imediat deoarece operatia de montare nu este atomica (procesul apelator se poate pune in asteptare in decursul executiei procedurii de deschidere a fisierului dispozitiv sau la citirea superblocului sistemului de fisiere, iar un alt proces poate incerca sa monteze un sistem de fisiere). Marcand intrarea din tabela de montare ca fiind in curs de folosire, nucleul previne ca doua operatii de montare sa utilizeze aceeasi intrare. Prin notarea in intrare a numarului de dispozitiv, se previne montarea unui sistem de fisiere de mai multe ori.
Procedura de deschidere a dispozitivului bloc ce contine sistemul de fisiere verifica daca dispozitivul este corespunzator, uneori initializand structurile de date ale driverului si transmitand comenzi de initializare catre hardware. Nucleul aloca apoi un buffer liber din sistemul de buffere pentru citirea superblocului sistemului de fisiere ce va fi montat. Citirea superblocului se face utilizand o varianta a algoritmului read. Pentru a permite traversarea punctului de montare in ambele sensuri se pastreaza in intrarea din tabela de montare un pointer catre inodul directorului din arborele de fisiere unde se executa montarea (pentru traversare spre radacina arborelui), si un pointer catre radacina sistemului de fisiere montat (pentru traversare spre baza arborelui). Directorul in care se realizeaza montarea si radacina sistemului de fisiere ce se monteaza sunt echivalente din punct de vedere logic, iar nucleu stabileste aceasta echivalenta prin pastrarea lor in intrarea din tabela de montare. Dupa montare, procesele nu vor mai accesa inodul directorului in care se face montarea.
Nucleul initializeaza campurile superblocului punand pe zero campurile de blocare pentru lista blocurilor libere si cea a inodurilor libere, si stabilind numarul inodurilor libere din superbloc la zero. Scopul initializarilor este de a minimiza pericolul de alterare a sistemului de fisiere datorita folosirii acestuia pe durata montarii.
Daca sistemul de fisiere este montat cu optiunea "numai citire" pentru a nu permite modificarea sa, nucleul seteaza un indicator in superbloc. In final, nucleul marcheaza inodul in care s-a facut montarea ca punct de montare pentru ca alte procese sa-l poata identifica ulterior. Figura 5.24 prezinta legaturile ce se stabilesc intre structurile de date ale nucleului dupa apelul sistem mount.
Figura 5.24 Structurile de date dupa montare
Sa rescriem algoritmii namei si iget pentru cazurile in care numele fisierului traverseaza un punct de montare.
Cele doua sensuri de traversare sunt: de la sistemul de fisiere in care se face montarea la cel montat (de la radacina sistemului global catre nodurile frunza) si invers. Urmatoarea secventa de comenzi shell ilustreaza cele doua cazuri.
mount /dev/dsk1 /usr
cd /usr/src/uts
cd ../../..
algoritm iget
intrare: numarul inodului din sistemul de fisiere
iesire: inodul blocat
/* in caz ca inodul este punct de montare */
if (inodul este punct de montare)
if (inodul se afla in lista inodurilor libere)
scoate inodul din lista;
incrementeaza contorul de referinta al inodului;
return (inod);
}
/* inodul nu este in cache */
scoate un nou inod din lista de inoduri libere;
reseteaza numarul inodului si sistemul de fisiere;
scoate inodul din vechea lista hash si il plaseaza in cea noua;
citeste inodul de pe disc (algoritmul bread);
initializeaza inodul (contor=1);
return (inod);
}
}
Figura 5.25 Algoritmul revizuit pentru accesarea unui inod
Comanda mount invoca apelul sistem mount dupa ce executa in prealabil unele verificari, si monteaza in directorul '/usr' sistemul de fisiere identificat prin fisierul special '/dev/dsk1'. Prima comanda shell cd (care lanseaza apelul sistem chdir) detrmina traversarea punctului de montare atunci cand nucleul analizeaza calea, de la "/usr" spre 'uts'. A doua comanda cd determina traversarea punctului de montare atunci cand nucleul analizeaza calea de la "uts "spre radacina sistemului de fisiere ( "/" ). Pentru traversarea punctului de montare in primul caz este prezentat algoritmul iget modificat (vezi figura 5.25), care este identic cu cel din figura 4.3, exceptand faptul ca se verifica daca inodul este un punct de montare. Daca inodul este marcat "punct de montare", nucleul va gasi intrarea din tabela de montare corespunzatoare inodului in care s-a facut montarea si va memora numarul dispozitivului pentru sistemul de fisiere montat. Folosind numarul de dispozitiv si numarul inodului radacina (care este comun tuturor sistemelor de fisiere), se acceseaza inodul radacina al dispozitivului montat si se returneaza acel inod. In prima schimbare de director din exemplul anterior, nucleul acceseaza mai intai inodul lui "/usr" din sistemul de fisiere in care s-a executat montarea, il gaseste marcat "punct de montare", gaseste in tabela de montare inodul radacina al sistemului de fisiere montat, si apoi il acceseaza.
Pentru al doilea caz de traversare a punctului de montare este prezentat algoritmul revizuit namei (vezi figura 5.26). El este similar celui prezentat in figura 4.11. Totusi, dupa gasirea numarului inodului corespunzator componentei din calea specificata pentru numele fisierului, nucleul verifica daca numarul inodului este al inodului radacina al unui sistem de fisiere. In caz afirmativ, daca inodul de lucru curent este de asemenea radacina si componenta din cale este "..", nucleul identifica inodul ca fiind un punct de montare. Apoi, gaseste intrarea din tabela de montare a carui numar de dispozitiv este egal cu numarul de dispozitiv al ultimului inod gasit, obtine inodul directorului in care s-a facut montarea si continua cautarea pentru ".." folosind ca inod de lucru inodul in care s-a facut montarea.
algoritm namei /* converteste numele caii in inod */
intrare: numele fisierului
iesire: inod blocat
elibereaza inodul de lucru (algoritmul iput);
inodul de lucru = inodul pentru noul numar de inod (algoritm
iget);
}
else /* componenta nu este in director */
return (nu a fost gasit nici un inod);
}
return (inodul de lucru);
}
Figura 5.26 Algoritmul revizuit pentru parcurgerea unui nume de fisier
In exemplul anterior (cd "../../..") presupunem ca directorul curent de inceput al procesului este "/usr/src/uts". Cand se analizeaza calea conform algoritmului namei, inodul de lucru cu care se incepe este cel al directorului curent. Nucleul schimba inodul de lucru dupa analiza primei componente ".." din cale, devenind "/usr/src". Cand se analizeaza urmatoarea componenta "..", nucleul gaseste inodul radacina corespunzator unui sistem de fisiere montat, "usr", iar el devine inod de lucru in namei. La analiza ultimei componente ".." nucleul determina ca numarul inodului pentru ".." este numarul inodului radacina, inodul sau de lucru este inodul radacina si ca ".." este componenta curenta a numelui fisierului. Nucleul determina intrarea in tabela de montare pentru punctul de montare "usr", elibereaza inodul de lucru curent (radacina sistemului de fisiere "usr") si aloca inodul in care s-a facut montarea (inodul directorului "usr" din sistemul de fisiere radacina) ca noul inod de lucru.Apoi, cauta intrarea ".." in structura directorului "/usr" si gaseste numarul inodului pentru radacina sistemului de fisiere ("/").
Demontarea sistemului de fisiere
Apelul sistem destinat pentru realizarea acestei operatii este umount, iar sintaxa sa este urmatoarea:
umount (nume fisier special);
unde nume fisier special reprezinta sistemul de fisiere ce va fi demontat.
algoritm umount
intrare: numele fisierului special ce contine sistemul de fisiere ce va fi demontat
iesire: niciuna
Figura 5.27 Algoritmul pentru demontarea unui sistem de fisiere
Cand demontam un sistem de fisiere (figura 5.27), nucleul acceseaza inodul dispozitivului ce va fi demontat, stabileste numarul dispozitivului pentru fisierul special, elibereaza inodul (algoritmul iput) si gaseste intrarea in tabela de montare a carui numar de dispozitiv este egal cu cel al fisierului special. Daca in momentul demontarii exista procese ce acceseaza fisiere din sistemul de fisiere ce urmeaza a fi demontat, atunci apelul umount va esua. In caz contrar fisierele active ar deveni inaccesibile. Anumite aspecte referitoare la aceasta situatie pot fi gasite in capitolul 8.
Daca in sistemul de buffere mai exista date care nu au fost scrise pe disc (blocuri marcate "intarziere la scriere"), nucleul le va scrie. Nucleul sterge intrarile de text partajat din tabela regiunilor care nu sunt operationale (pentru detalii vezi capitolul 8), salveaza pe disc toate superblocurile recent modificate si actualizeaza copiile disc pentru toate inodurile care trebuie actualizate. Apoi, nucleul elibereaza inodul radacina al sistemului de fisiere montat (pastrat de la executia apelului sistem mount) si invoca driverul dispozitivului ce contine sistemul de fisiere pentru inchiderea dispozitivului. Dupa aceea, buffere-le din cache ce contin blocuri de date corespunzatoare sistemului de fisiere demontat vor fi invalidate. Invalidarea buffere-lor presupune mutarea lor la inceputul listei buffere-lor libere, pentru ca cele valide sa ramana mai mult timp in cache. Se sterge semnalizatorul "punct de montare" din inodul in care s-a facut montarea (setat in apelul mount) si se elibereaza inodul. Dupa eliberarea intrarii corespunzatoare din tabela de montare, apelul umount se incheie.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1290
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved