path_resolution(7) Miscellaneous Information Manual path_resolution(7) NUME path_resolution - modul in care un nume de ruta este rezolvat pentru un fiier DESCRIERE Unele apeluri de sistem UNIX/Linux au ca parametru unul sau mai multe nume de fiiere. Un nume de fiier (sau nume de ruta) se rezolva dupa cum urmeaza. Pasul 1: iniierea procesului de soluionare In cazul in care numele de ruta incepe cu caracterul ,,/", directorul de cautare de pornire este directorul radacina al procesului de apelare. Un proces motenete directorul radacina de la parintele sau. De obicei, acesta va fi directorul radacina al ierarhiei de fiiere. Un proces poate obine un alt director radacina prin utilizarea apelului de sistem chroot(2) sau poate utiliza temporar un alt director radacina prin utilizarea openat2(2) cu fanionul RESOLVE_IN_ROOT activat. Un proces poate obine un spaiu de nume de montare complet privat in cazul in care acesta sau unul dintre stramoii sai a fost iniiat printr-o invocare a apelului de sistem clone(2) care a avut activat fanionul CLONE_NEWNS. Aceasta gestioneaza partea ,,/" din numele de ruta. Daca numele de ruta nu incepe cu caracterul ,,/", directorul de cautare de pornire al procesului de rezoluie este directorul de lucru curent al procesului - sau, in cazul apelurilor de sistem de tip openat(2), argumentul dfd (sau directorul de lucru curent daca AT_FDCWD este trecut ca argument dfd). Directorul de lucru curent este motenit de la parintele i poate fi modificat prin utilizarea apelului de sistem chdir(2). Numele de ruta care incep cu un caracter '/' se numesc nume de ruta absolute. Numele de ruta care nu incep cu un caracter '/' se numesc nume de ruta relative. Pasul 2: parcurgerea rutei Stabilete directorul de cautare curent la directorul de cautare iniial. Acum, pentru fiecare componenta nefinala a numelui de ruta, unde o componenta este un subir delimitat de caractere ,,/", aceasta componenta este cautata in directorul de cautare curent. Daca procesul nu are permisiunea de cautare in directorul de cautare curent, se trimite o eroare EACCES (,,Permisiune refuzata"). In cazul in care componenta nu este gasita, se trimite o eroare ENOENT (,,Nu exista un astfel de fiier sau director"). In cazul in care componenta este gasita, dar nu este nici un director, nici o legatura simbolica, se trimite o eroare ENOTDIR (,,Nu este un director"). In cazul in care componenta este gasita i este un director, se stabilete directorul de cautare curent la acel director i se trece la urmatoarea componenta. Daca componenta este gasita i este o legatura simbolica, mai intai se rezolva aceasta legatura simbolica (cu directorul de cautare curent ca director de cautare iniial). In caz de eroare, se returneaza aceasta eroare. Daca rezultatul nu este un director, se trimite o eroare ENOTDIR. In cazul in care rezolvarea legaturii simbolice este reuita i returneaza un director, se stabilete directorul de cautare curent in acel director i se trece la urmatoarea componenta. Reinei ca procesul de rezolvare poate implica recursivitate in cazul in care componenta de prefix (,,dirname") a unui nume de ruta conine un nume de fiier care este o legatura simbolica ce se rezolva catre un director (unde componenta de prefix a acelui director poate conine o legatura simbolica, i aa mai departe). Pentru a proteja nucleul impotriva supraincarcarii stivei i, de asemenea, pentru a proteja impotriva refuzului de serviciu, exista limite privind adancimea maxima de recursivitate i numarul maxim de legaturi simbolice urmate. O eroare ELOOP este returnata atunci cand se depaete limita maxima (,,Prea multe niveluri de legaturi simbolice"). Aa cum este implementat in prezent in Linux, numarul maxim de legaturi simbolice care vor fi urmate in timpul rezolvarii unui nume de ruta este de 40. Inainte de Linux 2.6.18, limita adancimii de recursivitate era de 5. Incepand cu Linux 2.6.18, aceasta limita a fost ridicata la 8. In Linux 4.2, codul de rezolvare a numelui de ruta din nucleu a fost reelaborat pentru a elimina utilizarea recursivitaii, astfel incat singura limita care a ramas este limita maxima de 40 de rezolvari pentru intregul nume de ruta. Rezolvarea legaturilor simbolice in timpul acestei etape poate fi blocata prin utilizarea openat2(2), cu fanionul RESOLVE_NO_SYMLINKS activat. Pasul 3: gasirea intrarii finale Cautarea componentei finale a numelui de ruta se face la fel ca i cea a celorlalte componente, aa cum a fost descrisa in etapa anterioara, cu doua diferene: (i) componenta finala nu trebuie sa fie neaparat un director (cel puin in ceea ce privete procesul de rezolvare a rutei - ar putea sa fie un director sau un non-director, din cauza cerinelor apelului de sistem specific) i (ii) nu este neaparat o eroare daca componenta nu este gasita - poate ca tocmai o cream. Detaliile privind tratamentul ultimei intrari sunt descrise in paginile de manual ale apelurilor de sistem specifice. . i .. Prin convenie, fiecare director are intrarile ,,." i ,,..", care se refera la directorul in sine i, respectiv, la directorul parinte. Procesul de rezolvare a rutei va presupune ca aceste intrari au semnificaia lor convenionala, indiferent daca acestea sunt sau nu prezente in sistemul de fiiere fizic. Nu se poate trece dincolo de radacina: ,,/.." este acelai lucru cu ,,/". Puncte de montare Dupa o comanda mount dev path, numele de ruta ,,path" se refera la radacina ierarhiei sistemului de fiiere de pe dispozitivul ,,dev", i nu la aceea ce se referea anterior. Se poate iei dintr-un sistem de fiiere montat: ,,ruta/.." se refera la directorul parinte al ,,rutei", in afara ierarhiei sistemului de fiiere de pe ,,dev". Traversarea punctelor de montare poate fi blocata prin utilizarea openat2(2), cu fanionul RESOLVE_NO_XDEV activat (reinei insa ca acest lucru restricioneaza, de asemenea, traversarea montarii asociate ,,bind"). Barele oblice finale In cazul in care o ruta de acces se termina cu ,,/", acest lucru foreaza rezolvarea componentei precedente ca la pasul 2: componenta care precede bara oblica fie exista i se rezolva intr-un director, fie numete un director care urmeaza sa fie creat imediat dupa rezolvarea numelui de acces. In caz contrar, se ignora caracterul final ,,/". Legatura simbolica finala In cazul in care ultima componenta a unui nume de ruta este o legatura simbolica, atunci depinde de apelul de sistem daca fiierul la care se face referire va fi legatura simbolica sau rezultatul rezolvarii rutei in funcie de coninutul sau. De exemplu, apelul de sistem lstat(2) va opera asupra legaturii simbolice, in timp ce stat(2) opereaza asupra fiierului indicat de legatura simbolica. Limita de lungime Exista o lungime maxima pentru numele de ruta. In cazul in care numele de ruta (sau un nume de ruta intermediar obinut in timpul rezolvarii legaturilor simbolice) este prea lung, se trimite o eroare ENAMETOOLONG (,,Numele fiierului este prea lung"). Nume de ruta gol In UNIX-ul original, numele de ruta gol se referea la directorul curent. In prezent, POSIX decreteaza ca un nume de ruta gol nu trebuie sa fie rezolvat cu succes. In acest caz, Linux returneaza ENOENT. Permisiuni Biii de permisiune ai unui fiier constau din trei grupuri de trei bii; a se vedea chmod(1) i stat(2). Primul grup de trei este utilizat atunci cand ID-ul efectiv de utilizator al procesului apelant este egal cu ID-ul de proprietar al fiierului. Al doilea grup de trei este utilizat atunci cand ID-ul de grup al fiierului fie este egal cu ID-ul de grup efectiv al procesului care face apelul, fie este unul dintre ID-urile de grup suplimentare ale procesului care face apelul (aa cum este setat de setgroups(2)). In cazul in care niciunul dintre acetia nu este valabil, se utilizeaza cel de-al treilea grup. Dintre cei trei bii utilizai, primul bit determina permisiunea de citire, al doilea permisiunea de scriere, iar ultimul permisiunea de executare in cazul fiierelor obinuite sau permisiunea de cautare in cazul directoarelor. Linux utilizeaza fsuid in loc de ID-ul efectiv al utilizatorului pentru verificarea permisiunilor. In mod normal, fsuid va fi egal cu ID-ul efectiv al utilizatorului, dar fsuid poate fi schimbat prin apelul de sistem setfsuid(2). (Aici ,,fsuid" inseamna ceva de genul ,,ID utilizator de sistem de fiiere" (filesystem user ID). Conceptul a fost necesar pentru implementarea unui server NFS in spaiul utilizatorului la un moment dat, cand procesele puteau trimite un semnal catre un proces cu acelai ID de utilizator efectiv. In prezent, acest concept este depait. Nimeni nu ar trebui sa foloseasca setfsuid(2).) In mod similar, Linux utilizeaza fsgid (ID grup de sistem de fiiere, ,,filesystem group ID") in locul ID-ului efectiv al grupului. A se vedea setfsgid(2). Ocolirea verificarilor de permisiuni: superutilizator i capacitai Pe un sistem UNIX tradiional, superutilizatorul (root, ID utilizator 0) este atotputernic i trece peste toate restriciile de permisiune atunci cand acceseaza fiiere. In Linux, privilegiile de superutilizator sunt imparite in capacitai (a se vedea capabilities(7)). Doua capacitai sunt relevante pentru verificarea permisiunilor de fiiere: CAP_DAC_OVERRIDE i CAP_DAC_READ_SEARCH; (un proces are aceste capacitai daca fsuid-ul sau este 0). Capacitatea CAP_DAC_OVERRIDE anuleaza toate verificarile de permisiuni, dar acorda permisiunea de execuie numai atunci cand cel puin unul dintre cei trei bii de permisiune de execuie ai fiierului este activat. Capacitatea CAP_DAC_READ_SEARCH acorda permisiunea de citire i cautare in directoare i permisiunea de citire in fiierele obinuite. CONSULTAI I readlink(2), capabilities(7), credentials(7), symlink(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.18 8 februarie 2026 path_resolution(7)