BTRFS(5) BTRFS BTRFS(5) NUME btrfs - subiecte despre sistemul de fiiere BTRFS (opiuni de montare, atribute de fiiere acceptate i altele) DESCRIERE Acest document descrie subiecte legate de BTRFS care nu sunt specifice instrumentelor. In prezent acopera: 1. opiuni de montare 2. caracteristici ale sistemului de fiiere 3. suport pentru fiierul de interschimb (swap) 4. algoritmi de suma de control 5. comprimare 6. interfaa sysfs 7. operaii exclusive ale sistemului de fiiere 8. limite ale sistemului de fiiere 9. suport pentru incarcatorul de pornire 10. atribute de fiier 11. modul de imparire in zone 12. dispozitiv de control 13. sisteme de fiiere cu mai multe profiluri de grupuri de blocuri 14. dispozitiv de insamanare 15. starea RAID56 i practici recomandate 16. glosar 17. model de stocare, considerente hardware OPIUNI DE MONTARE OPIUNI DE MONTARE SPECIFICE PENTRU BTRFS Aceasta seciune descrie opiunile de montare specifice sistemului de fiiere BTRFS. Pentru opiunile generice de montare, consultai pagina de manual mount(8) i consultai, de asemenea, seciunea cu detalii specifice BTRFS de mai jos . Opiunile sunt sortate alfabetic (fara prefixul no). Nota: Majoritatea opiunilor de montare se aplica intregului sistem de fiiere, iar numai opiunile din primul subvolum montat vor produce efect. Acest lucru se datoreaza lipsei unei implementari adecvate i se poate schimba in viitor. Aceasta inseamna ca (de exemplu) nu putei defini opiunile nodatacow, nodatasum sau compress pentru fiecare subvolum in parte folosind opiunile de montare. Aceasta problema ar trebui rezolvata in cele din urma, dar s-a dovedit a fi dificil de implementat corect in cadrul sistemului VFS din Linux. Opiunile de montare sunt procesate in ordine; doar ultima apariie a unei opiuni produce efect i poate dezactiva alte opiuni din cauza unor restricii (a se vedea, de exemplu, nodatacow i compress). Ieirea comenzii mount arata ce opiuni au fost aplicate. acl, noacl (implicit: activata) Activeaza/dezactiveaza suportul pentru listele de control al accesului POSIX (ACL). Consultai pagina manualului acl(5) pentru mai multe informaii despre ACL. Suportul pentru ACL este configurabil in timpul compilarii (BTRFS_FS_POSIX_ACL) i montarea eueaza daca se solicita acl, dar funcia nu este compilata. autodefrag, noautodefrag (incepand cu: 3.0, implicit: dezactivata) Activeaza defragmentarea automata a fiierelor. Cand aceasta opiune este activata, operaiile mici de scriere aleatorie in fiiere (cu o dimensiune de cateva zeci de kilooctei, in prezent aproximativ 64 Kio) sunt detectate i puse in coada pentru procesul de defragmentare. Este posibil ca aceasta opiune sa nu fie potrivita pentru sarcini de lucru cu baze de date de mari dimensiuni. Latena de citire poate crete din cauza citirii blocurilor adiacente care alcatuiesc intervalul pentru defragmentare, iar scrierea succesiva va fuziona blocurile in noua locaie. Avertisment Defragmentarea cu versiuni ale nucleului Linux mai mici de 3.9 sau mai mari sau egale cu 3.14-rc2, precum i cu versiuni stabile ale nucleului Linux mai mari sau egale cu 3.10.31, 3.12.12 sau 3.13.4 va rupe legaturile de referina ale datelor COW (de exemplu, fiiere copiate cu <>, instantanee sau date deduplicate). Acest lucru poate duce la o cretere considerabila a spaiului utilizat, in funcie de legaturile de referina rupte. barrier, nobarrier (implicit: activata) Se asigura ca toate operaiile de scriere de In/Ie trec prin memoria cache a dispozitivului i sunt stocate definitiv atunci cand sistemul de fiiere se afla la punctul de verificare a consistenei. De obicei, aceasta inseamna ca se trimite o comanda de golire catre dispozitiv, care va sincroniza toate datele in ateptare i blocurile de metadate obinuite, apoi va scrie super-blocul i va emite o alta comanda de golire. Operaiile de scriere cu validare (write-flush) genereaza o uoara penalizare i impiedica, de asemenea, programatorul de blocuri de In/Ie sa reordoneze cererile intr-un mod mai eficient. Dezactivarea barierelor elimina aceasta penalizare, dar va duce cu sigurana la coruperea sistemului de fiiere in cazul unei blocari sau al unei intreruperi de curent. Blocurile obinuite de metadate ar putea sa nu fie inca scrise in momentul in care noul super-bloc este stocat definitiv, presupunand ca indicatorii de bloc catre metadate au fost stocai permanent inainte. Pe un dispozitiv cu o memorie cache volatila, alimentat de la baterie, opiunea nobarrier nu va duce la coruperea sistemului de fiiere, deoarece blocurile in ateptare ar trebui sa ajunga in memoria permanenta. clear_cache Foreaza tergerea i reconstruirea cache-ului spaiului liber daca ceva nu a funcionat corect. Aceasta opiune se aplica doar la prima montare in modul citire-scriere. In cazul cache-ului de spaiu liber v1, aceasta opiune doar terge (i, daca nu se utilizeaza nospace_cache, reconstruiete) cache-ul de spaiu liber pentru grupurile de blocuri modificate in timp ce sistemul de fiiere este montat cu aceasta opiune. Pentru a terge efectiv intregul cache de spaiu liber v1, consultai btrfs check --clear-space-cache v1. Pentru cache-ul spaiului liber v2, aceasta terge intregul cache al spaiului liber. Pentru a face acest lucru fara a fi necesara montarea sistemului de fiiere, consultai btrfs check --clear-space-cache v2. A se vedea, de asemenea: space_cache. commit= (incepand cu: 3.12, implicit: 30) Stabilete intervalul de efectuare periodica a tranzaciilor atunci cand datele sunt sincronizate cu spaiul de stocare permanent. Valorile mai mari ale intervalului duc la acumularea in memorie a unei cantitai mai mari de date nescrise, ceea ce are consecine evidente in cazul unei blocari a sistemului. Limita superioara nu este impusa, dar se afieaza un avertisment daca aceasta depaete 300 de secunde (5 minute). A se utiliza cu precauie. Efectuarea periodica nu este singurul mecanism de efectuare a tranzaciei; aceasta poate avea loc i prin comanda explicita sync sau indirect, prin alte comenzi care afecteaza starea globala a sistemului de fiiere sau prin mecanisme interne ale nucleului care efectueaza golirea memoriei in funcie de diverse praguri sau politici (de exemplu, cgroups). compress, compress=, compress-force, compress-force= (implicit: dezactivata, suport pentru niveluri incepand cu: 5.1) Controleaza comprimarea datelor din fiierele BTRFS. Tipul poate fi specificat ca zlib, lzo, zstd sau no (pentru fara comprimare, utilizat la remontare). Daca nu se specifica niciun tip, se utilizeaza zlib. Daca se specifica compress-force, se va incerca intotdeauna comprimarea, dar datele pot ramane necomprimate daca comprimarea ar mari dimensiunea lor. Atat zlib, cat i zstd (incepand cu versiunea 5.1) permit reglarea nivelului de comprimare, nivelurile mai ridicate sacrificand viteza i memoria (zstd) in favoarea unor rapoarte de comprimare mai mari. Aceasta se poate regla prin adaugarea a doua puncte (:) urmate de nivelul dorit. ZLIB accepta intervalul [1, 9], iar ZSTD accepta [1, 15]. Daca nu este definit niciun nivel, ambele utilizeaza in prezent un nivel implicit de 3. Valoarea 0 este un alias pentru nivelul implicit. In caz contrar, se aplica cateva metode euristice simple pentru a detecta un fiier necomprimabil. Daca primele blocuri scrise intr-un fiier nu sunt comprimabile, intregul fiier este marcat definitiv pentru a fi omis din procesul de comprimare. Deoarece aceasta abordare este prea simplista, opiunea compress-force reprezinta o soluie de compromis care va comprima majoritatea fiierelor, cu preul unor cicluri de procesor irosite in incercarile euate. Incepand cu versiunea 4.15 a nucleului, un set de algoritmi euristici a fost imbunatait prin utilizarea eantionarii de frecvena, a detectarii modelelor repetate i a calculului entropiei Shannon pentru a evita acest lucru. Nota: Daca comprimarea este activata, nodatacow i nodatasum sunt dezactivate. datacow, nodatacow (implicit: activata) Activeaza copierea datelor la scriere pentru fiierele nou create. Nodatacow implica nodatasum i dezactiveaza compression. Toate fiierele create sub nodatacow au, de asemenea, atributul de fiier NOCOW (consultai chattr(1) ). Nota: Daca nodatacow sau nodatasum sunt activate, comprimarea este dezactivata. Actualizarile efectuate pe loc ,,direct" (fara utilizarea de tampoane, fiiere temporale pentru stocarea datelor) imbunataesc performana pentru volumele de lucru care efectueaza suprascrieri frecvente, cu preul unor poteniale scrieri pariale, in cazul in care scrierea este intrerupta (blocarea sistemului, defectarea dispozitivului). datasum, nodatasum (implicit: activata) Activeaza suma de control a datelor pentru fiierele nou create. Datasum implica datacow, adica modul normal de funcionare. Toate fiierele create sub nodatasum motenesc proprietatea ,,no checksums", insa nu exista un atribut de fiier corespondent (a se vedea chattr(1) ). Nota: Daca nodatacow sau nodatasum sunt activate, comprimarea este dezactivata. Se observa o uoara imbunataire a performanei atunci cand sumele de control sunt dezactivate, deoarece blocurile de metadate corespunzatoare care conin sumele de control nu mai trebuie actualizate. Costul calcularii sumelor de control pentru blocurile din memorie este mult mai redus decat cel al operaiilor de In/Ie, iar procesoarele moderne dispun de suport hardware pentru algoritmul de calcul al sumelor de control. degraded (implicit: dezactivata) Permite montari cu un numar de dispozitive mai mic decat cel impus de restriciile profilului RAID. O montare (sau remontare) in mod citire-scriere poate eua atunci cand lipsesc prea multe dispozitive, de exemplu daca un membru al benzii lipsete complet din RAID0. Incepand cu versiunea 4.14, verificarile de constrangeri au fost imbunataite i se efectueaza la nivel de fragment, nu la nivel de dispozitiv. Acest lucru permite montarea in regim degradat a sistemelor de fiiere cu profiluri RAID mixte pentru date i metadate, chiar daca constrangerile privind numerele de dispozitive nu ar fi indeplinite pentru unele dintre profiluri. Exemplu: metadata -- raid1, data -- single, devices -- /dev/sda, /dev/sdb Sa presupunem ca datele sunt stocate in intregime pe sda; in acest caz, lipsa lui sdb nu va impiedica montarea, chiar daca, in mod normal, lipsa unui singur dispozitiv ar impiedica montarea oricarui profil single. In cazul in care unele blocuri de date sunt stocate pe sdb, atunci constrangerea single/data nu este indeplinita i sistemul de fiiere nu poate fi montat. device= Specifica o ruta catre un dispozitiv care va fi scanat in cautarea sistemului de fiiere BTRFS in timpul montarii. De obicei, acest lucru se realizeaza automat de catre un administrator de dispozitive (cum ar fi udev) sau folosind comanda btrfs device scan (de exemplu, executata din ramdisk-ul iniial). In cazurile in care acest lucru nu este posibil, opiunea de montare dispozitiv poate fi de ajutor. Nota: Pornirea unui sistem RAID1, de exemplu, poate eua chiar daca toate rutele de dispozitiv ale sistemului de fiiere sunt furnizate, deoarece nodurile dispozitivului actuale pot sa nu fie descoperite de sistem in acel moment. discard, discard=sync, discard=async, nodiscard (implicit: asincron cand dispozitivele accepta aceasta funcie incepand cu versiunea 6.2, suport asincron incepand cu versiunea: 5.6) Activeaza eliminarea blocurilor de fiiere eliberate. Aceasta opiune este utila pentru dispozitivele SSD/NVMe, LUN-urile cu alocare redusa sau imaginile mainilor virtuale; totui, pentru ca aceasta sa funcioneze, fiecare strat de stocare trebuie sa permita eliminarea. In modul sincron (sync sau fara valoare specificata), lipsa funciei TRIM asincrona in coada pe dispozitivul de stocare poate afecta grav performana, deoarece se va incerca in schimb o operaie TRIM sincrona. Funcia TRIM in coada necesita dispozitive SATA cu cipuri mai noi decat versiunea 3.1. Modul asincron (async) grupeaza extinderile (extents) in bucai mai mari inainte de a le trimite catre dispozitive pentru operaiunea TRIM. Supraincarcarea i impactul asupra performanei ar trebui sa fie neglijabile in comparaie cu modul anterior, iar acesta ar trebui sa fie modul preferat, daca este necesar. Daca nu este necesara eliminarea imediata a blocurilor eliberate, se poate folosi instrumentul fstrim pentru a elimina toate blocurile libere intr-un singur lot. Programarea unei operai TRIM intr-o perioada de activitate redusa a sistemului va preveni interferenele poteniale cu performana altor operaii. De asemenea, un dispozitiv poate ignora comanda TRIM daca intervalul este prea mic, astfel incat executarea unei operaii de eliminare in lot ofera o probabilitate mai mare de a elimina efectiv blocurile respective. enospc_debug, noenospc_debug (implicit: dezactivata) Activeaza afiarea detaliata pentru anumite condiii ENOSPC. Este sigur de utilizat, dar poate fi zgomotos daca sistemul ajunge aproape de starea de saturare. fatal_errors=iune> (incepand cu: 3.4, implicit: bug) Aciunea de efectuat in cazul apariiei unei erori fatale. bug BUG() in cazul unei erori fatale, sistemul va ramane in stare de blocare i poate fi inca parial utilizabil, dar este necesara repornirea pentru funcionarea completa. panic panic() in cazul unei erori fatale, in funcie de alte configuraii ale sistemului, aceasta poate fi urmata de o repornire. Consultai documentaia parametrilor de pornire ai nucleului, de exemplu panic, oops sau crashkernel. flushoncommit, noflushoncommit (implicit: dezactivata) Aceasta opiune foreaza orice date modificate printr-o scriere intr-o tranzacie anterioara sa fie confirmate ca parte a confirmarii curente, efectiv o sincronizare completa a sistemului de fiiere. Acest lucru face ca starea confirmata ,,commited" sa fie o vizualizare complet coerenta a sistemului de fiiere din perspectiva aplicaiei (adica include toate operaiile finalizate ale sistemului de fiiere). Acest lucru se intampla anterior numai atunci cand era creata o iinstantanee. Cand este dezactivata, sistemul de fiiere este consecvent, dar scrierile in memoria tampon pot dura mai mult de o tranzacie confirmata. fragment= (depinde de opiunea de compilare CONFIG_BTRFS_DEBUG, incepand cu versiunea 4.4, implicit: dezactivata) Un instrument de depanare care fragmenteaza in mod intenionat un grup de blocuri de tipul tip specificat. Tipul poate fi data, metadata sau all. Aceasta opiune de montare nu trebuie utilizata in afara mediilor de depanare i nu este recunoscuta daca opiunea de configurare a nucleului CONFIG_BTRFS_DEBUG nu este activata. nologreplay (implicit: dezactivata, chiar i numai-pentru-citire) Jurnalul arborescent conine actualizarile in ateptare ale sistemului de fiiere pana la confirmarea completa. Jurnalul este reluat la urmatoarea montare, lucru care poate fi dezactivat prin aceasta opiune. A se vedea i treelog. Reinei ca nologreplay este acelai cu norecovery. Avertisment In prezent, jurnalul arborescent este reluat chiar i cu o montare numai pentru citire! Pentru a dezactiva aceasta funcie, montai de asemenea cu nologreplay. max_inline=i> (implicit: min(2048, dimensiunea paginii) ) Specifica cantitatea maxima de spaiu care poate fi inclusa direct intr-o frunza a arborelui b-tree de metadate. Valoarea se specifica in octei, opional cu sufixul K (nu se ine cont de majuscule/minuscule). In practica, aceasta valoare este limitata de dimensiunea blocului sistemului de fiiere (denumita sectorsize la momentul ,,mkfs", crearii sistemului de fiiere) i de dimensiunea paginii de memorie a sistemului. In cazul limitei de dimensiune a sectorului, exista un spaiu indisponibil din cauza anteturilor frunzelor b-tree. De exemplu, pentru o dimensiune a sectorului de 4 Kio, dimensiunea maxima a datelor incorporate este de aproximativ 3900 de octei. ,,Inlining-ul "poate fi complet dezactivat prin specificarea valorii 0. Acest lucru va crete spaiul liber al blocului de date daca dimensiunile fiierelor sunt mult mai mici decat dimensiunea blocului, dar va reduce in schimb consumul de metadate. Nota: Valoarea implicita a fost modificata la 2048 in nucleul 4.6. metadata_ratio= (implicit: 0, logica interna) Specifica faptul ca trebuie alocat 1 bloc de metadate dupa fiecare valoare blocuri de date. Comportamentul implicit depinde de logica interna; se incearca meninerea unui anumit procent de spaiu neutilizat pentru metadate, dar acest lucru nu este intotdeauna posibil daca nu exista suficient spaiu disponibil pentru alocarea blocurilor. Opiunea poate fi utila pentru a suprascrie logica interna in favoarea alocarii metadatelor daca se preconizeaza ca volumul de lucru va implica un numar mare de metadate (instantanee, legaturi de referina, atribute de fiiere, fiiere incorporate). norecovery (incepand cu: 4.5, implicit: dezactivata) Nu incearca nicio recuperare de date in momentul montarii. Aceasta va dezactiva logreplay i va evita alte operaii de scriere. Reinei ca aceasta opiune este identica cu nologreplay. Nota: Opiunea opusa, recovery, avea iniial o semnificaie diferita, dar a fost modificata pentru a asigura coerena cu alte sisteme de fiiere, in care norecovery este utilizata pentru a omite redarea jurnalului. BTRFS procedeaza la fel i, in general, va incerca sa evite orice operaii de scriere. rescan_uuid_tree (incepand cu: 3.12, implicit: dezactivata) Foreaza verificarea i procedura de reconstruire a arborelui UUID. In mod normal, acest lucru nu ar trebui sa fie necesar. Alternativ, arborele poate fi ters din spaiul utilizatorului prin comanda btrfs rescue clear-uuid-tree <# man-rescue-clear-uuid-tree>, iar apoi va fi reconstruit automat in nucleu (in acest caz, opiunea de montare nu este necesara). rescue (incepand cu: 5.9) Modurile care permit montarea cu structuri ale sistemului de fiiere deteriorate impun ca sistemul de fiiere sa fie montat in mod ,,doar-citire" i nu permit remontarea in mod ,,citire-scriere". Acest lucru are rolul de a oferi o gestionare unificata i mai detaliata a erorilor care afecteaza funcionarea sistemului de fiiere. o usebackuproot (incepand cu: 5.9) Incearca sa utilizeze sloturile radacina de copie de rezerva din blocul super. Inlocuiete opiunea independenta usebackuproot o nologreplay (incepand cu: 5.9) Nu reia niciun jurnal murdar. Inlocuiete opiunea independenta nologreplay. o ignorebadroots, ibadroots (incepand cu: 5.11) Ignora radacinile arborescente deteriorate, imbunataete considerabil ansele de recuperare a datelor. o ignoredatacsums, idatacsums (incepand cu: 5.11) Ignora verificarea sumei de control a datelor. o ignoremetacsums, imetacsums (incepand cu: 6.12) Ignora verificarea sumelor de control ale metadatelor, utila pentru conversia sumelor de control intrerupta. o all (incepand cu: 5.9) Activeaza toate opiunile de recuperare acceptate. skip_balance (incepand cu: 3.3, implicit: dezactivata) Omite reluarea automata a unei operaii de echilibrare intrerupte. Operaia poate fi reluata ulterior cu comanda btrfs balance resume, sau starea de pauza poate fi eliminata cu comanda btrfs balance cancel. Comportamentul implicit este reluarea unei operaii de echilibrare intrerupte imediat dupa montarea sistemului de fiiere. space_cache, space_cache=, nospace_cache (nospace_cache incepand cu: 3.2, space_cache=v1 i space_cache=v2 incepand cu: 4.5, implicit: space_cache=v2) Opiuni pentru gestionarea cache-ului de spaiu liber. Cache-ul de spaiu liber imbunataete considerabil performana la citirea in memorie a spaiului liber din grupurile de blocuri. Cu toate acestea, gestionarea cache-ului de spaiu consuma anumite resurse, inclusiv o cantitate redusa de spaiu pe disc. Exista doua variante de implementare a cache-ului de spaiu liber. Varianta iniiala, denumita v1, era considerata o opiune implicita sigura, dar a fost inlocuita de v2. Cache-ul de spaiu v1 poate fi dezactivat la montare folosind opiunea nospace_cache, fara a fi necesara tergerea coninutului. In cazul sistemelor de fiiere foarte mari (de ordinul tera-octeilor) i al anumitor sarcini de lucru, performana cache-ului de spaiu v1 se poate reduce drastic. Implementarea v2, care adauga un nou arbore b-tree numit ,,arbore de spaiu liber", rezolva aceasta problema. Odata activat, cache-ul de spaiu v2 va fi utilizat intotdeauna i nu poate fi dezactivat decat daca este golit. Utilizai clear_cache,space_cache=v1 sau clear_cache,nospace_cache pentru a face acest lucru. Daca v2 este activata, cache-ul de spaiu v1 va fi ters (la prima montare), iar nucleele fara suport v2 vor putea monta sistemul de fiiere doar in modul numai citire. Pe un sistem de fiiere nemontat, cache-urile (ambele versiuni) pot fi terse cu ,,btrfs check --clear-space-cache". Comenzile btrfs-check(8) <> i :doc:`mkfs.btrfs au suport complet pentru cache-ul spaiului liber v2 incepand cu versiunea v4.19. Daca nu este specificata in mod explicit o versiune, va fi aleasa implementarea implicita, care este v2. ssd, ssd_spread, nossd, nossd_spread (implicit: SSD detectat automat) Opiuni pentru controlul schemelor de alocare a SSD-urilor. In mod implicit, BTRFS va activa sau dezactiva optimizarile pentru SSD-uri in funcie de tipul dispozitivului (rotativ sau nerotativ). Acest lucru este determinat de coninutul fiierului /sys/block/DEV/queue/rotational. Daca valoarea este 0, opiunea ssd este activata. Opiunea nossd va dezactiva detectarea automata. Optimizarile utilizeaza absena penalizarii de cautare care este inerenta pentru dispozitivele rotative. Blocurile pot fi de obicei scrise mai rapid i nu sunt transferate catre fire de execuie separate. Nota: Incepand cu versiunea 4.14, optimizarile de dispunere a blocurilor au fost eliminate. Acestea erau utile pentru primele generaii de dispozitive SSD. Stratul FTL (Flash Translation Layer) al acestora nu era eficient, iar optimizarea urma sa imbunataeasca rezistena la uzura printr-o aliniere mai buna a blocurilor. Acest lucru nu mai este valabil in cazul dispozitivelor SSD moderne, iar optimizarea nu mai aducea niciun beneficiu real. In plus, aceasta ducea la o fragmentare crescuta. Ajustarea dispunerii a fost pastrata intacta pentru opiunea ssd_spread. Opiunea de montare ssd_spread incearca sa aloce spaiu neutilizat in blocuri mai mari i aliniate, putand oferi performane mai bune pe SSD-urile de gama inferioara. ssd_spread include implicit ssd, activand astfel i toate celelalte algoritme pentru SSD-uri. Opiunea nossd va dezactiva toate opiunile pentru SSD-uri, in timp ce nossd_spread dezactiveaza doar ssd_spread. subvol= Monteaza sub-volumul din ruta in loc de subvolumul de nivel superior. ruta este intotdeauna tratata ca fiind relativa la subvolumul de nivel superior. Aceasta opiune de montare prevaleaza asupra setului implicit de subvolum pentru sistemul de fiiere dat. subvolid= Monteaza subvolumul specificat printr-un numar id-_sub-vol, in loc de subvolumul de nivel superior. Putei utiliza comanda btrfs subvolume list sau btrfs subvolume show pentru a vizualiza numerele de identificare ale sub-volumelor. Aceasta opiune de montare inlocuiete setul de sub-volume implicit pentru sistemul de fiiere respectiv. Nota: Daca sunt specificate atat subvolid cat i subvol, acestea trebuie sa indice acelai subvolum, altfel montarea va eua. thread_pool= (implicit: min(NR.CPU-uri + 2, 8) ) Numarul de fire de execuie care trebuie pornite. NRCPUS reprezinta numarul de procesoare active detectate in momentul montarii. Un numar mic duce la un paralelism redus in procesarea datelor i a metadatelor, iar un numar mare ar putea duce la o scadere a performanei din cauza intensificarii conflictelor de blocare, a planificarii proceselor, a ,,bouncing-ului (respingerii)" liniilor de cache sau a transferurilor costisitoare de date intre memoriile locale ale procesoarelor. treelog, notreelog (implicit: activata) Activeaza jurnalul arborescent utilizat pentru operaiile de scriere fsync i O_SYNC. Jurnalul arborescent stocheaza modificarile fara a fi necesara o sincronizare completa a sistemului de fiiere. Operaiile din jurnal sunt salvate la sincronizare i la confirmarea tranzaciei. Daca sistemul se blocheaza intre doua astfel de sincronizari, operaiile din jurnalul arborescent aflate in ateptare sunt reluate in timpul montarii. Avertisment In prezent, jurnalul arborescent este redat chiar i cu o montare numai pentru citire! Pentru a dezactiva aceasta funcie, montai de asemenea cu nologreplay. Jurnalul ar putea conine fiiere/directoare noi, care nu ar exista pe un sistem de fiiere montat daca jurnalul nu este reluat. usebackuproot (incepand cu: 4.6, implicit: dezactivata) Activeaza incercarile de autorecuperare in cazul in care se gasete o radacina greita a arborelui in momentul montarii. In prezent, aceasta scaneaza o lista de rezerva a mai multor radacini anterioare ale arborelui i incearca sa utilizeze prima care poate fi citita. Acest lucru poate fi utilizat i in cazul montarilor numai-pentru-citire. Nota: Aceasta opiune a inlocuit recovery, care a fost depreciata. user_subvol_rm_allowed (implicit: dezactivata) Permite ca subvolumele sa fie terse de catre proprietarul lor. In caz contrar, numai utilizatorul root poate face acest lucru. Nota: In trecut, orice utilizator putea crea o instantanee chiar daca nu era proprietarul sub-volumului sursa; din acest motiv, tergerea sub-volumului a fost restricionata. Crearea sub-volumului a fost restricionata, dar aceasta opiune de montare este inca necesara. Aceasta reprezinta o problema de utilizare. Incepand cu versiunea 4.18, apelul de sistem rmdir(2) poate terge un sub-volum gol la fel ca un director obinuit. Daca acest lucru este posibil poate fi detectat in timpul rularii, consultai caracteristica rmdir_subvol din seciunea CARACTERISTICI ALE SISTEMULUI DE FIIERE. OPIUNI DE MONTARE DEPRECIATE Listeaza opiunile de montare care au fost eliminate, pastrate pentru compatibilitate cu versiunile anterioare. recovery (incepand cu: 3.2, implicit: dezactivata, depreciata incepand cu: 4.5) Nota: Aceasta opiune a fost inlocuita de usebackuproot i nu trebuie utilizata, dar va funciona pe nucleele 4.5+. inode_cache, noinode_cache (eliminata in: 5.11, incepand cu: 3.0, implicit: dezactivata) Nota: Funcionalitatea a fost eliminata in versiunea 5.11, orice date vechi create prin utilizarea anterioara a opiunii inode_cache pot fi eliminate prin btrfs rescue clear-ino-cache <#man-rescue-clear-ino-cache>. check_int, check_int_data, check_int_print_mask= (eliminata in: 6.7, incepand cu: 3.0, implicit: dezactivata) Aceste opiuni de depanare controleaza comportamentul modulului de verificare a integritaii (este necesara opiunea de configurare BTRFS_FS_CHECK_INTEGRITY). Scopul principal este de a verifica daca toate blocurile dintr-o anumita perioada de tranzacionare sunt legate in mod corespunzator. check_int activeaza modulul de verificare a integritaii, care examineaza toate cererile de scriere in bloc pentru a asigura coerena pe disc, cu un cost mare de memorie i CPU. check_int_data include date de extindere (extent) in verificarile de integritate i implica opiunea check_int. check_int_print_mask accepta o masca de bii cu valori BTRFSIC_PRINT_MASK_*, aa cum sunt definite in fs/btrfs/check-integrity.c, pentru a controla comportamentul modulului de verificare a integritaii. Pentru mai multe informaii, consultai comentariile din partea de sus a fiierului fs/btrfs/check-integrity.c. NOTE PRIVIND OPIUNILE DE MONTARE GENERICE Unele dintre opiunile generale de montare din mount(8) care afecteaza BTRFS i merita menionate. context Contextul se refera la contextele SELinux i la definiiile politicilor transmise ca opiuni de montare. Acest lucru funcioneaza corect incepand cu versiunea v6.8 (deoarece analizatorul opiunilor de montare din BTRFS a fost adaptat la noul API care inelege i opiunile). noatime In condiii de incarcare intensa de citire, specificarea opiunii noatime imbunataete semnificativ performana, deoarece nu este necesara scrierea de noi informaii privind timpul de acces. Fara aceasta opiune, valoarea implicita este relatime, care reduce doar numarul de actualizari atime ale nodurilor-i in comparaie cu tradiionalul strictatime. Cel mai rau scenariu pentru actualizarile atime sub relatime apare atunci cand sunt citite multe fiiere al caror atime este mai vechi de 24 de ore i care au fost recent salvate in instantanee. In acest caz, atime este actualizat i COW are loc -- pentru fiecare fiier -- in bloc. A se vedea i - Atime and btrfs: a bad combination? (LWN, 2012-05-31). Reinei ca noatime poate afecta aplicaiile care se bazeaza pe timpul de funcionare atime, cum ar fi venerabilul Mutt (cu excepia cazului in care utilizai casuele potale maildir). CARACTERISTICI ALE SISTEMULUI DE FIIERE Setul de baza de caracteristici ale sistemului de fiiere se extinde in timp. Compatibilitatea cu versiunile anterioare este meninuta, iar caracteristicile sunt opionale i trebuie solicitate explicit, astfel incat utilizarea accidentala sa nu creeze incompatibilitai. Exista mai multe clase i instrumentele corespunzatoare pentru gestionarea funciilor: at mkfs time only Acest lucru este valabil in special pentru structurile de baza, cum ar fi dimensiunea nodului b-tree sau algoritmul de verificare a sumelor de control. Pentru mai multe detalii, consultai mkfs.btrfs(8) <>. dupa mkfs, pe un sistem de fiiere nemontat Funcionalitai care pot optimiza structurile interne sau adauga structuri noi pentru a susine funcionalitai noi; consultai btrfstune(8) <>. Comanda btrfs inspect-internal dump-super /dev/sdx va genera extragerea i afiarea super-blocului; putei corela valoarea lui incompat_flags cu funcionalitaile enumerate mai jos dupa mkfs, pe un sistem de fiiere montat Caracteristicile unui sistem de fiiere (cu un anumit UUID) sunt enumerate in /sys/fs/btrfs/UUID/features/, cate un fiier pentru fiecare caracteristica. Starea este stocata in interiorul fiierului. Valoarea 1 indica faptul ca caracteristica este activata i funcionala, in timp ce 0 inseamna ca caracteristica a fost activata la montare, dar a fost dezactivata ulterior. In directorul /sys/fs/btrfs/features/ se poate afla daca o anumita caracteristica poate fi activata pe un sistem de fiiere montat, un fiier pentru fiecare caracteristica. Valoarea 1 inseamna ca funcia poate fi activata. Lista caracteristicilor (a se vedea i mkfs.btrfs(8) <> seciunea CARACTERISTICI ALE SISTEMULUI DE FIIERE <# man-mkfs-filesystem-features>): big_metadata (incepand cu: 3.4) sistemul de fiiere utilizeaza nodesize pentru blocurile de metadate, care pot fi mai mari decat dimensiunea paginii block_group_tree (incepand cu: 6.1) reprezentarea elementelor grupului de blocuri folosind un arbore b-tree dedicat, ceea ce poate reduce considerabil timpul de montare pentru sistemele de fiiere mari compress_lzo (incepand cu: 2.6.38) comprimarea lzo a fost utilizata pe sistemul de fiiere, fie ca opiune de montare, fie prin btrfs filesystem defrag. compress_zstd (incepand cu: 4.14) comprimarea zstd a fost utilizata pe sistemul de fiiere, fie ca opiune de montare, fie prin btrfs filesystem defrag. default_subvol (incepand cu: 2.6.34) subvolumul implicit a fost definit pe sistemul de fiiere extended_iref (incepand cu: 3.7) a fost marita limita legaturilor dure pe fiier intr-un director la 65536, nucleele mai vechi acceptau un numar variabil de legaturi dure in funcie de suma tuturor dimensiunilor numelor de fiiere care pot fi stocate intr-un bloc de metadate free_space_tree (incepand cu: 4.5) reprezentarea spaiului liber folosind un arbore b-tree dedicat, succesor al cache-ului de spaiu v1 metadata_uuid (incepand cu: 5.0) UUID-ul principal al sistemului de fiiere este metadata_uuid, care stocheaza noul UUID numai in superbloc, in timp ce toate blocurile de metadate au inca UUID-ul stabilit la momentul mkfs, consultai btrfstune(8) <> pentru mai multe detalii mixed_backref (incepand cu: 2.6.31) ultima modificare majora a formatului discului, referine inversate imbunataite, acum implicite mixed_groups (incepand cu: 2.6.37) grupuri de blocuri mixte de date i metadate, adica datele i metadatele nu sunt separate i ocupa aceleai grupuri de blocuri; acest mod este potrivit pentru volume mici, deoarece nu exista restricii privind modul in care trebuie utilizat spaiul ramas (spre deosebire de modul ,,split", in care spaiul gol al metadatelor nu poate fi utilizat pentru date i viceversa) pe de alta parte, aspectul final este destul de imprevizibil i posibil foarte fragmentat, ceea ce inseamna performane mai slabe no_holes (incepand cu: 3.14) reprezentare imbunataita a extensiilor fiierelor in care golurile nu sunt stocate in mod explicit ca extensie, economisete cateva procente din metadate daca se utilizeaza fiiere disperse raid1c34 (incepand cu: 5.5) mod RAID1 extins cu copii pe 3 sau, respectiv, pe 4 dispozitive raid_stripe_tree (incepand cu: 6.7) un arbore separat pentru urmarirea extensiilor fiierelor pe profilurile RAID RAID56 (incepand cu: 3.9) sistemul de fiiere conine sau a coninut un profil RAID56 de grupuri de blocuri rmdir_subvol (incepand cu: 4.18) indica faptul ca apelul de sistem rmdir(2) % poate terge un subvolum gol la fel ca un director obinuit. Reinei ca aceasta caracteristica depinde numai de versiunea nucleului. skinny_metadata (incepand cu: 3.10) metadate de dimensiuni reduse pentru referinele de extindere(extent), economisesc cateva procente din metadate send_stream_version (incepand cu: 5.10) numarul celei mai recente versiuni acceptate pentru fluxul de trimitere simple_quota (incepand cu: 6.7) contabilizarea simplificata a cotelor supported_checksums (incepand cu: 5.5) lista algoritmilor de suma de control acceptai de modulul nucleului, modulele respective sau modulele integrate care implementeaza algoritmii trebuie sa fie prezente pentru a monta sistemul de fiiere, a se vedea seciunea ALGORITMI DE SUMA DE CONTROL. supported_sectorsizes (incepand cu: 5.13) listeaza valorile acceptate ca dimensiuni ale sectoarelor (mkfs.btrfs --sectorsize) de catre nucleul in execuie supported_rescue_options (incepand cu: 5.11) listeaza valorile pentru opiunea de montare rescue care sunt acceptate de nucleul in execuie, a se vedea btrfs(5) <> zoned (incepand cu Linux 5.12) modul ,,zoned" este prietenos cu alocarea/scrierea pentru dispozitivele imparite in zone, gestionate de gazda, spaiul de alocare este imparit in zone de dimensiuni fixe care trebuie actualizate secvenial, a se vedea seciunea MODUL ,,ZONED" SUPORT PENTRU FIIERUL DE INTERSCHIMB (SWAP) Un fiier swap, atunci cand este activ, reprezinta o zona de swap stocata intr-un fiier. Este acceptat incepand cu versiunea 5.0 a nucleului. Folosii swapon(8) pentru a-l activa, pana atunci (respectiv din nou dupa dezactivarea acestuia cu swapoff (8) ) acesta este doar un fiier normal (cu NODATACOW activat) pentru care restriciile speciale pentru fiierele swap active nu se aplica. Exista cateva limitari ale implementarii in BTRFS i subsistemul swap Linux: o filesystem - trebuie sa fie un singur dispozitiv o trebuie sa aiba doar un singur profil de date o subvolume - nu se poate crea o instantanee a acestuia daca conine fiiere swap active o swapfile - trebuie sa fie prealocat (adica fara goluri) o swapfile - trebuie sa fie NODATACOW (adica, de asemenea, NODATASUM, fara comprimare) Limitarile decurg in special din arhitectura bazata pe COW i din stratul de cartografiere a blocurilor, care permite funcionalitai avansate precum realocarea i sistemele de fiiere pe mai multe dispozitive. Cu toate acestea, subsistemul swap se bazeaza pe o cartografiere mai simpla i nu accepta modificari in fundal ale locaiei blocurilor de fiiere odata ce acestea au fost alocate spaiului swap. Constrangerile menionate mai sus (un singur dispozitiv i un singur profil) sunt legate de fiierul swap in sine, adica de extinderi(extents) i de amplasarea acestora. Este posibil sa se creeze un fiier swap pe un sistem de fiiere cu mai multe dispozitive, atata timp cat extinderile se afla pe un singur dispozitiv, dar acest lucru nu poate fi influenat de utilizator i depinde de fragmentarea spaiului liber i de spaiul neutilizat disponibil pentru noi blocuri. Cu fiiere swap active, urmatoarele operaii asupra intregului sistem de fiiere vor omite anumite grupuri de blocuri sau pot eua: o balance - grupurile de blocuri cu extinderi (extents) ale oricaror fiiere swap active sunt omise i raportate prin dmesg, restul vor fi procesate in mod normal o scrub - idem o resize grow - neafectat o resize shrink - funcioneaza atata timp cat extensiile (extents) oricaror fiiere swap active se afla in afara intervalului redus o device add - daca noile dispozitive nu interfereaza cu niciun fiier swap deja activ, aceasta operaie va funciona, insa nu se va putea activa niciun fiier swap nou dupa aceea o device delete - daca dispozitivul a fost adaugat conform instruciunilor de mai sus, acesta poate fi i ters o device replace - idem Limitarile menionate mai sus vor afecta in mod semnificativ rutinele de intreinere ale sistemului de fiiere btrfs, i anume ,,balance" i ,,scrub". Comenzile ,,balance" i ,,scrub" vor omite acele grupuri de blocuri care conin extinderi (extents) ale unui fiier de spaiu de interschimb (swap) activ, iar aceste grupuri de blocuri pot conine, de asemenea, extinderi aparinand altor fiiere. Acest lucru inseamna ca fiierele swap vor avea un impact amplificat, mult mai mare decat dimensiunea propriu-zisa a fiierului swap. Pentru ,,balance", aceasta inseamna ca grupurile de blocuri de date ar putea sa nu fie echilibrate corespunzator, ceea ce duce la o utilizare dezechilibrata a datelor i metadatelor, situaie care poate genera erori ENOSPC premature. Pentru ,,scrub," aceasta inseamna ca grupurile de blocuri de date ar putea sa nu fie verificate, ceea ce afecteaza integritatea datelor. Utilizatorii trebuie sa fie contieni de consecinele utilizarii fiierelor swap alaturi de alte date. Aceasta practica este deosebit de descurajata in cazul sistemului de fiiere radacina. Cand nu exista fiiere swap active i se executa o operaie exclusiva asupra intregului sistem de fiiere (de exemplu, echilibrare, tergere dispozitiv, micorare), fiierele swap nu pot fi activate temporar. Operaia trebuie sa se incheie mai intai. Pentru a crea i activa un fiier swap, executai urmatoarele comenzi: # truncate -s 0 swapfile # chattr +C swapfile # fallocate -l 2G swapfile # chmod 0600 swapfile # mkswap swapfile # swapon swapfile Incepand cu versiunea 6.1, este posibil sa creai fiierul swap cu o singura comanda (cu excepia activarii): # btrfs filesystem mkswapfile --size 2G swapfile # swapon swapfile Reinei ca UUID-ul returnat de instrumentul mkswap identifica ,,sistemul de fiiere" swap i, deoarece este stocat intr-un fiier, acesta nu este, in general, vizibil i nu poate fi utilizat ca identificator, spre deosebire de cazul in care s-ar afla pe un dispozitiv de blocuri. Odata activat, fiierul va aparea in /proc/swaps: # cat /proc/swaps Filename Type Size Used Priority /ruta-la/swapfile file 2097152 0 -2 Fiierul swap poate fi creat printr-o operaie unica sau, odata creat corespunzator, poate fi activat la fiecare pornire a sistemului prin comanda <> (de obicei lansata de gestionarul de servicii). Adaugai urmatoarea intrare in /etc/fstab, presupunand ca sistemul de fiiere care furnizeaza /ruta-la a fost deja montat la acest moment. Se pot defini i opiuni de montare suplimentare relevante pentru fiierul swap (cum ar fi prioritatea, nu opiunile de montare BTRFS). /ruta_la/swapfile none swap defaults 0 0 De acum inainte, sub-volumul care conine fiierul swap activ nu poate fi inclus intr-o instantanee pana cand fiierul swap nu este dezactivat din nou cu comanda swapoff. In acest moment, fiierul swap devine un fiier obinuit, iar sub-volumul poate fi inclus din nou intr-o instantanee, dei acest lucru ar impiedica o noua activare a oricarui fiier swap care a fost inclus intr-o instantanee. Se pot crea i activa fiiere swap noi (care nu au fost incluse intr-o instantanee). In caz contrar, un fiier swap inactiv nu afecteaza subvolumul care il conine. Activarea creeaza un statut temporar in memorie i impiedica unele operaii cu fiiere, dar nu este stocata permanent. HIBERNARE Un fiier de swap poate fi utilizat pentru hibernare, dar acest lucru nu este chiar atat de simplu. Inainte de hibernare, trebuie sa se scrie o poziie de reluare in fiierul ,,/sys/power/resume_offset" sau trebuie definit parametrul de linie de comanda al nucleului resume_offset. Valoarea este decalajul fizic pe dispozitiv. Reinei ca aceasta nu este aceeai valoare cu filefrag afiata ca decalaj fizic! Sistemul de fiiere Btrfs utilizeaza o corespondena intre adresele logice i cele fizice, insa, in acest caz, adresa fizica poate fi asociata in continuare cu una sau mai multe adrese de bloc fizic specifice dispozitivului. Decalajul fizic specific dispozitivului este cel care se preteaza a fi utilizat ca poziia de reluare. Incepand cu versiunea 6.1, exista o comanda btrfs inspect-internal map-swapfile <#man-inspect-map-swapfile> care afieaza decalajul fizic al dispozitivului i valoarea ajustata pentru /sys/power/resume_offset. Reinei ca valoarea este imparita la dimensiunea paginii, adica nu reprezinta decalajul in sine. # btrfs filesystem mkswapfile swapfile # btrfs inspect-internal map-swapfile swapfile Physical start: 811511726080 Resume offset: 198122980 Pentru scripturi i comoditate, opiunea -r va afia doar decalajul: # btrfs inspect-internal map-swapfile -r swapfile 198122980 Comanda map-swapfile verifica, de asemenea, toate cerinele, adica lipsa golurilor, dispozitiv unic etc. SOLUIONAREA PROBLEMELOR Daca activarea fiierului swap eueaza, verificai daca ai urmat toi paii de mai sus sau verificai jurnalul de sistem (de exemplu, dmesg sau journalctl) pentru mai multe informaii. In mod special, instrumentul swapon se inchide cu un mesaj care nu precizeaza ce anume a euat: # swapon /ruta-la/swapfile swapon: /ruta-la/swapfile: swapon a euat: argument nevalid Motivul specific va fi probabil inregistrat in jurnalul de sistem de catre modulul btrfs: # journalctl -t kernel | grep swapfile kernel: BTRFS warning (device sda): swapfile must have single data profile ALGORITMI DE SUMA DE CONTROL Datele i metadatele sunt verificate prin suma de control in mod implicit. Suma de control este calculata inainte de scriere i verificata dupa citirea blocurilor de pe dispozitive. Intregul bloc de metadate are o suma de control integrata, stocata in antetul nodului arborelui b-tree. Fiecare bloc de date are o suma de control separata, stocata in arborele de sume de control. Nota: Deoarece suma de control a datelor este calculata chiar inainte de trimiterea catre dispozitivul bloc, btrfs are o cerina stricta ca blocul de date corespunzator sa nu fie modificat pana la finalizarea operaiei de scriere. Aceasta cerina este indeplinita in cazul unei scrieri cu memorie tampon, deoarece Btrfs deine controlul deplin asupra cache-ului de pagini; insa o scriere directa (O_DIRECT) ocolete cache-ul de pagini, iar Btrfs nu poate controla memoria tampon de In/Ie directa (deoarece aceasta se poate afla in memoria spaiului de utilizator) Astfel, este posibil ca un program din spaiul utilizatorului sa modifice memoria tampon de scriere directa inainte ca aceasta sa fie complet rescrisa, iar acest lucru poate duce la o neconcordana a sumei de control a datelor. Pentru a evita acest lucru, nucleul incepand cu versiunea 6.14 va fora o operaie de scriere directa sa treaca la modul cu memorie tampon, in cazul in care nodul-i necesita o suma de control a datelor. Acest lucru va implica o uoara scadere a performanei. Daca avei nevoie de operaii de scriere directa cu zero copii, activai fanionul NODATASUM pentru nodul-i i asigurai-va ca memoria tampon pentru operaiile de In/Ie directe este aliniata complet la dimensiunea blocului. Sunt acceptai mai muli algoritmi de suma de control. Algoritmul implicit i compatibil cu versiunile anterioare este crc32c. Incepand cu versiunea 5.5 a nucleului, exista inca trei algoritmi cu caracteristici diferite i compromisuri in ceea ce privete viteza i rezistena. Lista de mai jos va poate ajuta sa decidei pe care dintre acetia sa il alegei. CRC32C (rezumat de 32 bii) Implicit, cea mai buna compatibilitate cu versiunile anterioare. Foarte rapid, procesoarele moderne au suport la nivel de instruciuni, nu este rezistent la coliziuni, dar are totui capacitai bune de detectare a erorilor. XXHASH (rezumat de 64 bii) Poate fi utilizat ca succesor al CRC32C. Foarte rapid, optimizat pentru procesoarele moderne care utilizeaza pipeline de instruciuni, rezistena buna la coliziuni i detectare a erorilor. SHA256 (rezumat de 256 bii) Algoritm de sum[ de control cu putere criptografica. Relativ lent, dar cu posibilitate de accelerare a instruciunilor CPU sau carduri hardware specializate. Certificat FIPS i utilizat pe scara larga. BLAKE2b (rezumat de 256 bii) Algoritm de suma de control cu putere criptografica. Relativ rapid, cu posibilitate de accelerare prin procesor folosind extensii SIMD. Nu este standardizat, dar se bazeaza pe BLAKE, care a fost finalist la SHA3 i este utilizat pe scara larga. Algoritmul folosit este BLAKE2b-256, optimizat pentru platforme pe 64 de bii. Valoarea dimensiune rezumat influeneaza dimensiunea totala a sumelor de control ale blocurilor de date stocate in sistemul de fiiere. Blocurile de metadate au o dimensiune fixa de pana la 256 de bii (32 de octei), astfel incat nu se inregistreaza nicio cretere. Fiecare bloc de date are o suma de control stocata separat, cu un volum suplimentar reprezentat de frunzele arborelui b-tree. Performana relativa aproximativa a algoritmilor, masurata in comparaie cu CRC32C utilizand implementari pe un procesor Intel de generaia a 11-a, cu frecvena de 3,6 GHz: +--------+--------------+--------+--------------------+ |Rezumat | Cicluri/4Kio | Raport | Implementarea | +--------+--------------+--------+--------------------+ |CRC32C | 470 | 1.00 | instruciuni | | | | | CPU, combinaie | | | | | PCL | +--------+--------------+--------+--------------------+ |XXHASH | 870 | 1.9 | referina | | | | | implementare | +--------+--------------+--------+--------------------+ |SHA256 | 7600 | 16 | libgcrypt | +--------+--------------+--------+--------------------+ |SHA256 | 8500 | 18 | openssl | +--------+--------------+--------+--------------------+ |SHA256 | 8700 | 18 | botan | +--------+--------------+--------+--------------------+ |SHA256 | 32000 | 68 | incorporat, | | | | | instruciune CPU | +--------+--------------+--------+--------------------+ |SHA256 | 37000 | 78 | libsodium | +--------+--------------+--------+--------------------+ |SHA256 | 78000 | 166 | incorporat, | | | | | referina | | | | | implementare | +--------+--------------+--------+--------------------+ |BLAKE2b | 10000 | 21 | incorporat/AVX2 | +--------+--------------+--------+--------------------+ |BLAKE2b | 10900 | 23 | libgcrypt | +--------+--------------+--------+--------------------+ |BLAKE2b | 13500 | 29 | incorporat/SSE41 | +--------+--------------+--------+--------------------+ |BLAKE2b | 13700 | 29 | libsodium | +--------+--------------+--------+--------------------+ |BLAKE2b | 14100 | 30 | openssl | +--------+--------------+--------+--------------------+ |BLAKE2b | 14500 | 31 | kcapi | +--------+--------------+--------+--------------------+ |BLAKE2b | 14500 | 34 | incorporat, | | | | | referina | | | | | implementare | +--------+--------------+--------+--------------------+ Multe nuclee sunt configurate cu SHA256 integrat, nu sub forma de modul. Pana la versiunea v6.15 a nucleului, versiunile accelerate sunt totui furnizate de module i trebuie incarcate in mod explicit (modprobe sha256) inainte de montarea sistemului de fiiere pentru a le putea utiliza. Putei verifica in /sys/fs/btrfs/FSID/checksum care dintre ele este utilizat. Daca vedei sha256-generic, atunci ar fi bine sa demontai i sa montai din nou sistemul de fiiere. Nu este posibila modificarea acestui lucru pe un sistem de fiiere montat. Incepand cu nucleul v6.16, implementarea accelerata este utilizata intotdeauna, daca este disponibila. Verificai fiierul /proc/crypto. Cand implementarea este integrata, vei gasi: name : sha256 driver : sha256-generic module : kernel priority : 100 ... In timp ce pentru implementarea accelerata este, de exemplu: name : sha256 driver : sha256-avx2 module : sha256_ssse3 priority : 170 ... COMPRIMARE Btrfs accepta comprimarea transparenta a fiierelor. Sunt disponibili trei algoritmi: ZLIB, LZO i ZSTD (incepand cu versiunea 4.14), cu diferite niveluri. Comprimarea se realizeaza la nivelul extinderilor fiierelor, iar algoritmul este selectat prin proprietaile fiierului, opiunile de montare sau prin comanda de defragmentare. Putei avea un singur punct de montare btrfs care conine unele fiiere necomprimate, altele comprimate cu LZO, altele cu ZLIB, de exemplu (dei s-ar putea sa nu dorii acest lucru, este acceptat). Odata ce comprimarea este activata, toate datele nou scrise vor fi comprimate, adica datele existente raman neschimbate. Datele sunt imparite in blocuri mai mici (128 Kio) inainte de comprimare, pentru a permite rescrierile aleatorii fara a afecta semnificativ performana. Datorita numarului crescut de extinderi (extents), consumul de metadate este mai mare. Blocurile sunt comprimate in paralel. Algoritmii pot fi caracterizai dupa cum urmeaza in ceea ce privete compromisurile dintre viteza i raport: ZLIB o mai lent, raport de comprimare mai mare o niveluri: de la 1 la 9, atribuite direct, nivelul implicit este 3 o compatibilitate buna cu versiunile anterioare LZO o comprimare i decomprimare mai rapide decat ZLIB, raport de comprimare mai slab, conceput pentru a fi rapid o fara nivele o compatibilitate buna cu versiunile anterioare ZSTD o comprimare comparabila cu ZLIB, cu viteze mai mari de comprimare/decomprimare i raport diferit o niveluri: -15..15, atribuite direct, valoarea implicita este 3 o suport, incepand cu: 4.14 o niveluri 1..15 acceptat incepand cu versiunea 5.1 o niveluri -15..-1 acceptat incepand cu versiunea 6.15 Diferenele depind de setul de date concret i nu pot fi exprimate printr-o singura valoare numerica sau recomandare. Nivelurile mai ridicate consuma mai mult timp de procesare i s-ar putea sa nu aduca o imbunataire semnificativa, in timp ce nivelurile mai scazute se afla aproape de timpul real. CUM SE ACTIVEAZA COMPRIMAREA De obicei, comprimarea poate fi activata la nivelul intregului sistem de fiiere, fiind specificata pentru punctul de montare. Reinei ca opiunile de montare pentru comprimare sunt comune tuturor montarilor aceluiai sistem de fiiere, fie ca este vorba de montari de tip ,,bind" sau de montari de sub-volume. Va rugam sa consultai seciunea <IUNI DE MONTARE>> din btrfs(5). $ mount -o compress=zstd /dev/sdx /mnt Aceasta va activa algoritmul zstd la nivelul implicit (care este 3). Nivelul poate fi specificat i manual, de exemplu zstd:3. Nivelurile mai ridicate ofera o compresie mai buna, dar necesita mai mult timp. La randul sau, acest lucru poate duce la o latena de scriere mai mare; nivelurile mai scazute sunt potrivite pentru comprimarea in timp real i, pe un procesor suficient de rapid, nu provoaca scaderi semnificative ale performanei. $ btrfs filesystem defrag -czstd fiier Comanda de mai sus va iniia defragmentarea intregului fiier file i va aplica compresia, indiferent de opiunea de montare. Nivelul de compresie poate fi specificat i cu argumentul --level sau -L incepand cu versiunea 6.14. Algoritmul de compresie nu este persistent i se aplica doar comenzii de defragmentare; pentru orice alte operaiuni de scriere se aplica alte opiuni de compresie. Configurarile persistente pentru fiecare fiier in parte pot fi configurate in doua moduri: $ chattr +c fiier $ btrfs property set fiier compression zstd Prima comanda utilizeaza interfaa invechita a atributelor de fiier motenita de la sistemul de fiiere ext2 i nu este flexibila, aa ca, in mod implicit, este activata comprimarea zlib. Cealalta comanda definete o proprietate a fiierului folosind algoritmul specificat. Nota: definirea nivelului in acest mod nu este inca implementata. NIVELURI DE COMPRIMARE Suportul pentru niveluri al ZLIB a fost adaugat in v4.14, LZO nu ofera suport pentru niveluri (implementarea nucleului ofera doar unul), suportul pentru niveluri ZSTD a fost adaugat in v5.1, iar nivelurile negative in v6.15. Exista 9 niveluri ZLIB acceptate (de la 1 la 9), care corespund unu la unu intre opiunea de montare i nivelul definit de algoritm. Valoarea implicita este nivelul 3, care ofera un raport de comprimare destul de bun i este totui destul de rapid. Diferena in ceea ce privete gradul de comprimare intre nivelurile 7, 8 i 9 este comparabila, dar nivelurile superioare dureaza mai mult. Suportul ZSTD include nivelurile -15..15, un subset al gamei complete oferite de ZSTD. Nivelurile -15..-1 sunt in timp real, cu un raport de compresie mai slab, nivelurile 1..3 sunt aproape in timp real, cu o compresie buna, 4..8 sunt mai lente, cu o compresie imbunataita, iar 9..15 depun eforturi i mai mari, dei dimensiunea fiierului rezultat s-ar putea sa nu fie imbunataita semnificativ. Nivelurile mai ridicate necesita, de asemenea, mai multa memorie i, deoarece necesita mai multa putere de procesare, performana sistemului este afectata. Nivelul 0 corespunde intotdeauna valorii implicite. Nivelul de comprimare nu afecteaza compatibilitatea. EXCEPIII Orice fiier care a fost modificat de apelul de sistem fallocate va fi intotdeauna exclus de la comprimare, chiar daca se utilizeaza opiunea de montare force-compress. Motivul este ca o apelare reuita a funciei fallocate trebuie sa garanteze ca viitoarele operaii de scriere in intervalul alocat nu vor eua din cauza lipsei de spaiu. Acest lucru este dificil de garantat intr-un sistem de fiiere COW. Pentru a reduce probabilitatea ca acest lucru sa se intample, btrfs pre-aloca spaiu i dezactiveaza comprimarea pentru fiierul respectiv. Ca soluie alternativa, se poate declana o rescriere comprimata pentru un astfel de fiier folosind comanda btrfs defrag. Reinei ca, daca fiierul este accesat din nou prin apelul de sistem fallocate, acesta va fi din nou exclus din comprimare pentru toate datele noi scrise in el. DATE INCOMPREHENSIBILE Fiierele care conin date deja comprimate sau date care nu se pot comprima eficient din cauza limitarilor de procesor i memorie ale implementarilor nucleului utilizeaza o logica de decizie simpla. Daca prima poriune de date care urmeaza sa fie comprimata nu este mai mica decat originalul, comprimarea intregului fiier este dezactivata. Cu excepia cazului in care sistemul de fiiere este montat cu opiunea compress-force, caz in care btrfs va incerca sa comprime fiecare bloc, recurgand la stocarea versiunii necomprimate pentru fiecare bloc care ajunge sa fie mai mare dupa comprimare. Aceasta nu este o soluie optima i este supusa optimizarilor i dezvoltarii ulterioare. Daca un fiier este identificat ca fiind incompresibil, se activeaza un fanion (NOCOMPRESS) i acesta devine persistent ,,sticky". In cazul acelui fiier, comprimarea nu este efectuata decat daca este forata. Fanionul poate fi de asemenea activat prin chattr +m (incepand cu e2fsprogs 1.46.2) sau prin proprietai cu valoarea no sau none. O valoare goala il va reiniializa la valoarea implicita care este aplicabila in prezent pe sistemul de fiiere montat. Exista doua modalitai de detectare a datelor incomprehensibile: o incercarea efectiva de comprimare - datele sunt comprimate, daca rezultatul nu este mai mic, este eliminat, deci acest lucru depinde de algoritm i de nivel o euristici de precomprimare - se efectueaza o evaluare statistica rapida a datelor i, in funcie de rezultat, se aplica sau se omite comprimarea, bitul NOCOMPRESS nu este activat doar pe baza euristicii, ci numai in cazul in care algoritmul de comprimare nu aduce o imbunataire $ lsattr fiier ---------------------m fiier Nu se recomanda utilizarea comprimarii forate, euristica ar trebui sa decida acest lucru, iar algoritmii de comprimare detecteaza intern de asemenea datele incomprehensibile. EURISTICI PRE-COMPRIMARE Heuristicile au ca scop efectuarea unor teste statistice rapide asupra datelor comprimate, pentru a evita o comprimare probabil costisitoare care s-ar dovedi ineficienta. Algoritmii de compresie ar putea avea i ei o funcie interna de detectare a datelor incompresibile, dar acest lucru genereaza un volum suplimentar de operaii, deoarece compresia se efectueaza intr-un alt fir i datele trebuie oricum scrise. Heuristica este de tip ,,doar-citire" i poate utiliza memoria cache. Testele efectuate s-au bazat pe urmatoarele: eantionarea datelor, detectarea modelelor repetate pe termen lung, frecvena octeilor, entropia Shannon. COMPATIBILITATE Comprimarea necesita atat sumele de control ale datelor, cat i COW, astfel incat opiunea de montare nodatasum sau nodatasum/fanionul nodului-i nu vor avea ca rezultat comprimarea. Citirile de In/Ie directe ale datelor comprimate vor reveni intotdeauna la citirile stocate in memoria tampon. Comportamentul scrierii de In/Ie directe depinde de fanionul nodului-i. Pentru nodurile cu suma de control a datelor, scrierile de In/Ie directe revin intotdeauna la scrierile in tampon, putand astfel genera date comprimate daca opiunea de montare/fanioanele nodului-i permit acest lucru. Pentru nodurile-i fara sume de control ale datelor, scrierile In/Ie directe nu vor popula cache-ul paginii i, deoarece nodul-i nu are sume de control ale datelor, nu vor fi generate date comprimate. Algoritmii de compresie au fost adaugai de-a lungul timpului, astfel incat trebuie luata in considerare i compatibilitatea versiunilor, impreuna cu alte instrumente care pot accesa datele comprimate, cum ar fi incarcatoarele de pornire. INTERFAA SYSFS Btrfs are o interfaa sysfs pentru a oferi opiuni suplimentare. Ruta de nivel superior este /sys/fs/btrfs/, iar structura principala a directorului este urmatoarea: +--------------------------------+---------------------+----------+ |Ruta relativa | Descriere | Versiune | +--------------------------------+---------------------+----------+ |features/ | Toate funciile | 3.14 | | | acceptate | | +--------------------------------+---------------------+----------+ |/ | UUID-ul sistemului | 3.14 | | | de fiiere montat | | +--------------------------------+---------------------+----------+ |/allocation/ | Informaii | 3.14 | | | privind alocarea | | | | spaiului | | +--------------------------------+---------------------+----------+ |/bdi/ | Informaii despre | 5.9 | | | dispozitivul de | | | | copie de rezerva | | | | (writeback) | | +--------------------------------+---------------------+----------+ |/devices// | Legatura simbolica | 5.6 | | | catre fiecare | | | | dispozitiv bloc | | | | sysfs | | +--------------------------------+---------------------+----------+ |/devinfo// | Informaii | 5.6 | | | specifice Btrfs | | | | pentru fiecare | | | | dispozitiv | | +--------------------------------+---------------------+----------+ |/discard/ | Renuna la | 6.1 | | | statistici i | | | | parametri reglabili | | +--------------------------------+---------------------+----------+ |/features/ | Caracteristici ale | 3.14 | | | sistemului de | | | | fiiere | | +--------------------------------+---------------------+----------+ |/qgroups/ | Informaii | 5.9 | | | globale despre | | | | qgroup | | +--------------------------------+---------------------+----------+ |/qgroups/_/ | Informaii pentru | 5.9 | | | fiecare qgroup | | +--------------------------------+---------------------+----------+ Pentru directorul /sys/fs/btrfs/features/, fiecare fiier reprezinta o caracteristica acceptata de nucleul actual. Majoritatea fiierelor au valoarea 0. In caz contrar, depinde de fiier, valoarea 1 inseamna de obicei ca caracteristica poate fi activata pe un sistem de fiiere montat. Pentru directorul /sys/fs/btrfs//features/, fiecare fiier reprezinta o funcie activata pe sistemul de fiiere montat. Caracteristicile au acelai nume in seciunea CARACTERISTICI ALE SISTEMULUI DE FIIERE. UUID Fiierele din directorul /sys/fs/btrfs// sunt: bg_reclaim_threshold (RW, incepand cu: 5.19) Procentul spaiului utilizat din spaiul total al dispozitivului pentru a incepe revendicarea automata a grupului de blocuri. In principal pentru dispozitive imparite in zone (zoned). checksum (RO, incepand cu: 5.5) Suma de control utilizata pentru sistemul de fiiere montat. Aceasta include atat tipul de suma de control (consultai seciunea ALGORITMI DE SUMA DE CONTROL) cat i controlorul implementat (indica in principal daca este accelerat hardware). clone_alignment (RO, incepand cu: 3.16) Alinierea octeilor pentru ioctl-urile clone i dedupe. commit_stats (RW, incepand cu: 6.0) Statisticile de performana pentru confirmarea tranzaciilor btrfs de la prima montare. In principal pentru scopuri de depanare. Scrierea in acest fiier va reiniializa durata maxima de comitere (max_commit_ms) la 0. Fiierul arata astfel: commits 70649 last_commit_ms 2 max_commit_ms 131 total_commit_ms 170840 o commits - numarul de tranzacii comise de la prima montare o last_commit_ms - durata in milisecunde a ultimei comiteri o max_commit_ms - timpul maxim necesar pentru comiterea unei tranzacii de la prima montare sau ultima repornire o total_commit_ms - suma tuturor timpilor de comitere a tranzaciilor exclusive_operation (RO, incepand cu: 5.10) Afieaza operaia exclusiva in curs de execuie. Consultai seciunea OPERAII EXCLUSIVE ALE SISTEMULUI DE FIIERE pentru detalii. generation (RO, incepand cu: 5.11) Afieaza generaia sistemului de fiiere montat. label (RW, incepand cu: 3.14) Afieaza eticheta curenta a sistemului de fiiere montat. metadata_uuid (RO, incepand cu: 5.0) Afieaza metadatele UUID ale sistemului de fiiere montat. Vedei caracteristica metadata_uuid pentru mai multe detalii. nodesize (RO, incepand cu: 3.14) Afieaza dimensiunea nodului sistemului de fiiere montat. quota_override (RW, incepand cu: 4.13) Afieaza starea actuala a depairii cotei. 0 inseamna ca nu exista depaire a cotei. 1 inseamna depaire a cotei, cota poate ignora configurarile limita existente. read_policy (RW, incepand cu: 5.11) Afieaza politica actuala de echilibrare pentru citiri. In prezent, este acceptat doar pid (echilibrare folosind valoarea ID-ului procesului (pid)). Mai multe politici de echilibrare sunt disponibile in versiunea experimentala, i anume round-robin. sectorsize (RO, incepand cu: 3.14) Afieaza dimensiunea sectorului sistemului de fiiere montat. temp_fsid (RO, incepand cu: 6.7) Indica faptul ca acest sistem de fiiere a primit un FSID temporar in momentul montarii, facand posibila montarea dispozitivelor cu acelai FSID. UUID/allocations Fiierele i directoarele din directorul /sys/fs/btrfs//allocations sunt: global_rsv_reserved (RO, incepand cu: 3.14) Octeii utilizai din reserva globala. global_rsv_size (RO, incepand cu: 3.14) Dimensiunea totala a rezervarii globale. data/, metadata/ i system/ directoare (RO, incepand cu: 5.14) Informaii despre spaiu pentru cele 3 tipuri de grupuri de blocuri. UUID/allocations/{data,metadata,system} Fiierele din directorul /sys/fs/btrfs//allocations/data,metadata,system sunt: bg_reclaim_threshold (RW, incepand cu: 5.19) Procentul de spaiu recuperabil din dimensiunea grupului de blocuri (excluzand spaiul inutilizabil permanent) pentru a recupera grupul de blocuri. Poate fi utilizat pe dispozitive obinuite sau de cele imparite in zone (zoned). bytes_* (RO) Valorile structurilor de date corespunzatoare pentru tipul i profilul grupului de blocuri dat, care sunt utilizate intern i se pot modifica rapid in funcie de sarcina. Lista completa: bytes_may_use, bytes_pinned, bytes_readonly, bytes_reserved, bytes_used, bytes_zone_unusable chunk_size (RW, incepand cu: 6.0) Afieaza dimensiunea bucaii. Poate fi modificata pentru date i metadate (in mod independent) i nu poate fi definita pentru tipul de grup de blocuri de sistem. Nu poate fi definita pentru dispozitivele imparite in zone, deoarece depinde de dimensiunea fixa a zonei dispozitivului. Limita superioara este de 10% din dimensiunea sistemului de fiiere; valoarea trebuie sa fie un multiplu de 256 Mio i mai mare decat 0. size_classes (RO, incepand cu: 6.3) Numarul de grupuri de blocuri dintr-o anumita clasa, pe baza unor metode euristice care masoara lungimea, vechimea i fragmentarea. none 136 small 374 medium 282 large 93 UUID/bdi Legatura simbolica catre directorul sysfs al informaiilor despre dispozitivul de rezerva (BDI), care este legat de procesul i infrastructura de scriere inapoi (rescriere). UUID/devices Fiierele din directorul /sys/fs/btrfs//devices sunt legaturi simbolice denumite dupa nodurile dispozitivelor (de exemplu, sda, dm-0) i care indica directorul sysfs al acestora. UUID/devinfo Directorul conine subdirectoare denumite dupa ID-urile dispozitivelor (valori numerice). Fiecare subdirector conine informaii despre dispozitivul cu ID-ul devid. UUID/devinfo/ID_DISPOZITIV Fiierele din directorul /sys/fs/btrfs//devinfo/ sunt: error_stats: (RO, incepand cu: 5.14) Afieaza statisticile acestui dispozitiv, la fel ca btrfs device stats (btrfs-device(8) <>). write_errs 0 read_errs 0 flush_errs 0 corruption_errs 0 generation_errs 0 fsid: (RO, incepand cu: 5.17) Afieaza fsid-ul caruia ii aparine dispozitivul. Poate fi diferit de UUID daca este un dispozitiv samana. in_fs_metadata (RO, incepand cu: 5.6) Afieaza daca s-a gasit dispozitivul. Ar trebui sa fie intotdeauna 1, deoarece daca valoarea devine 0, directorul DEVID va fi ters automat. missing (RO, incepand cu: 5.6) Afieaza daca dispozitivul este considerat lipsa de modulul nucleului. replace_target (RO, incepand cu: 5.6) Afieaza daca dispozitivul este inta inlocuirii. Daca nu se executa nicio inlocuire a dispozitivului, aceasta valoare este 0. scrub_speed_max (RW, incepand cu: 5.14) Afieaza limita de viteza a operaiei ,,scrub" pentru acest dispozitiv. Unitatea este octei/s. 0 inseamna nicio limita. Valoarea poate fi definita, dar nu este persistenta. writeable (RO, incepand cu: 5.6) Afieaza daca dispozitivul este inscriptibil. UUID/qgroups Fiierele din directorul /sys/fs/btrfs//qgroups/ sunt: enabled (RO, incepand cu: 6.1) Afieaza daca qgroup este activat. De asemenea, daca qgroup este dezactivat, directorul qgroups va fi eliminat automat. inconsistent (RO, incepand cu: 6.1) Afieaza daca numerele qgroup sunt inconsistente. Daca valoarea este 1, se recomanda efectuarea unei noi scanari qgroup. drop_subtree_threshold (RW, incepand cu: 6.1) Afieaza pragul de eliminare a subarborelui pentru a marca automat qgroup ca fiind inconsistent. Atunci cand se elimina sub-volume mari cu funcia qgroup activata, se genereaza o sarcina foarte mare pentru contabilitatea qgroup. Daca avem un sub-arbore al carui nivel este mai mare sau egal cu aceasta valoare, nu vom declana deloc contabilitatea qgroup, ci vom marca qgroup ca fiind inconsistent pentru a evita sarcina de lucru foarte mare. Valoarea implicita este 3, ceea ce inseamna ca arborii de inalime mica vor fi luai in considerare in mod corespunzator, deoarece acest lucru este suficient de rapid. Valoarea a fost 8 pana la versiunea 6.13, in care nicio scadere a subarborelui nu poate declana reanalizarea qgroup, ceea ce o face mai puin utila. O valoare mai mica poate reduce volumul de lucru al qgroup, cu preul unei reanalizari suplimentare a qgroup pentru recalcularea numerelor. UUID/qgroups/ID_NIVEL Fiierele din fiecare director /sys/fs/btrfs//qgroups/_/ sunt: exclusive (RO, incepand cu: 5.9) Afieaza octeii deinui exclusiv de qgroup. limit_flags (RO, incepand cu: 5.9) Afieaza valoarea numerica a fanionelor de limita. Daca este 0, inseamna ca nu este implicata nicio limita. max_exclusive (RO, incepand cu: 5.9) Afieaza limitele privind octeii deinui exclusiv. max_referenced (RO, incepand cu: 5.9) Afieaza limitele de octei la care se poate face referire. referenced (RO, incepand cu: 5.9) Afieaza octeii la care se face referire ai qgroup. rsv_data (RO, incepand cu: 5.9) Afieaza octeii rezervai pentru date. rsv_meta_pertrans (RO, incepand cu: 5.9) Afieaza octeii rezervai pentru metadatele per tranzacie. rsv_meta_prealloc (RO, incepand cu: 5.9) Afieaza octeii rezervai pentru metadatele prealocate. UUID/discard Fiierele din directorul /sys/fs/btrfs//discard/ sunt: discardable_bytes (RO, incepand cu: 6.1) Arata cantitatea de octei care pot fi eliminai in modul asincron discard i nodiscard. discardable_extents (RO, incepand cu: 6.1) Afieaza numarul de extinderi (extents) care urmeaza sa fie eliminate in modul async discard i nodiscard. discard_bitmap_bytes (RO, incepand cu: 6.1) Afieaza cantitatea de octei eliminai din datele urmarite ca bitmaps. discard_extent_bytes (RO, incepand cu: 6.1) Afieaza cantitatea de extinderi (extents) eliminate din datele urmarite ca bitmaps. discard_bytes_saved (RO, incepand cu: 6.1) Afieaza cantitatea de octei care au fost realocai fara a fi eliminai. kbps_limit (RW, incepand cu: 6.1) Limita reglabila de kilooctei pe secunda emisa ca IO discard in modul async discard. iops_limit (RW, incepand cu: 6.1) Limita reglabila a numarului de operaii de IO discard care urmeaza sa fie emise in modul asincron discard. max_discard_size (RW, incepand cu: 6.1) Limita reglabila pentru dimensiunea unei cereri de IO discard. OPERAII EXCLUSIVE ALE SISTEMULUI DE FIIERE Exista mai multe operaii care afecteaza intregul sistem de fiiere i nu pot fi rulate in paralel. Incercarea de a porni una in timp ce alta este in curs de execuie va eua (vedei excepiile de mai jos). Incepand cu nucleul 5.10, operaia care ruleaza in prezent poate fi obinuta din /sys/fs/UUID/exclusive_operation cu urmatoarele valori i operaii: o balance o balance paused (incepand cu versiunea 5.17) o device add o device delete o device replace o resize o swapfile activate o none Inscrierea in coada este acceptata pentru mai multe sub-comenzi btrfs, astfel incat acestea sa poata fi lansate simultan i apoi serializate. Exista o excepie atunci cand o echilibrare pusa in pauza permite inceperea unei operaii de adaugare a unui dispozitiv, deoarece acestea nu se ciocnesc cu adevarat i acest lucru poate fi folosit pentru a adauga mai mult spaiu pentru ca echilibrarea sa se incheie. LIMITE ALE SISTEMULUI DE FIIERE maximum file name length 255 Aceasta limita este impusa de Linux VFS, structurile BTRFS putand stoca nume de fiiere mai mari. maximum symlink target length depinde de valoarea nodesize, pentru 4KiB este 3949 bytes, pentru nodesize mai mari este 4095 datorita limitei sistemului PATH_MAX inta legaturii simbolice (symlink) poate sa nu fie o ruta valida, adica componentele numelui rutei pot depai limitele (NAME_MAX), nu exista validare de coninut la crearea symlink(3) . maximum number of inodes 264 dar depinde de spaiul disponibil pentru metadate deoarece nodurile-i sunt create dinamic Fiecare sub-volum este un spaiu de nume independent de noduri-i i, prin urmare de numarul acestora, astfel incat limita este pentru fiecare sub-volum, nu pentru intregul sistem de fiiere. inode numbers numar minim: 256 (pentru subvolume), fiiere i directoare obinuite: 257, numar maxim: (264 - 256) Numerele de noduri-i care pot fi atribuite fiierelor create de utilizator provin din intregul spaiu de 64 de bii, cu excepia primelor 256 i a ultimelor 256 din acest interval, care sunt rezervate pentru identificatorii interni ai b-tree. maximum file length limita inerenta a BTRFS este 264 (16 Eio), dar limita practica a Linux VFS este 263 (8 Eio) maximum number of subvolumes id-urile sub-volumelor pot ajunge pana la 248, dar numarul sub-volumelor reale depinde de spaiul disponibil pentru metadate Spaiul consumat de toate metadatele sub-volumului, inclusiv evidena extinderilor partajate, poate fi mare (Mio, Gio). Intervalul nu este intreg intervalul de 64 de bii din cauza qgroups care utilizeaza cei 16 bii superiori in alte scopuri. maximum number of hardlinks of a file in a directory 65536 atunci cand funcia extref este activata in timpul mkfs (implicit), aproximativ 100 in caz contrar i depinde de lungimea numelui de fiier care se potrivete intr-un nod de metadate minimum filesystem size dimensiunea minima a fiecarui dispozitiv depinde de caracteristica mixed-bg, fara aceasta (implicit) este de aproximativ 109Mio, cu mixed-bg este de 16Mio SUPORT PENTRU INCARCATORUL DE PORNIRE GRUB2 (%) are cel mai avansat suport pentru pornirea de pe BTRFS in ceea ce privete caracteristicile. U-Boot (%) ofera suport decent pentru pornire, dar nu toate funciile BTRFS sunt implementate. Consultai documentaia. In general, primul 1Mio de pe fiecare dispozitiv este neutilizat, cu excepia super-blocului primar care se afla la poziia 64Kio i se intinde pe 4Kio. Restul poate fi utilizat liber de incarcatoarele de pornire sau pentru alte informaii de sistem. Reinei ca pornirea de pe un sistem de fiiere de pe dispozitivul imparit in zone (zoned) <> nu este acceptata. ATRIBUTELE FIIERELOR Sistemul de fiiere btrfs accepta configurarea atributelor sau fanioanelor fiierelor. Reinei ca exista interfee vechi i noi, cu denumiri confuze. Lista urmatoare ar trebui sa clarifice acest aspect: o atribute: chattr(1) sau lsattr(1) utilitai (ioctl-urile sunt FS_IOC_GETFLAGS i FS_IOC_SETFLAGS), datorita numelor ioctl-urilor atributele sunt numite i fanioane o xflags: pentru a se distinge de cele anterioare, acestea sunt fanioane extinse, cu bii configurabili similari atributelor, dar extensibile, iar in viitor vor fi adaugai bii noi (comenzile ioctl sunt FS_IOC_FSGETXATTR i FS_IOC_FSSETXATTR, dar nu au legatura cu atributele extinse, denumite i xattrs), nu exista un instrument standard pentru a modifica biii, exista suport in xfs_io(8) precum comanda xfs_io -c chattr Atributele au constrangeri asociate i nu toate combinaiile pot fi utilizate, ordinea in care sunt definite fiind, de asemenea, importanta. Majoritatea atributelor se aplica fiierelor i directoarelor, dar semantica lor poate varia. In cazul directoarelor, un atribut poate insemna doar ca acesta se aplica tuturor fiierelor noi (inheritable in lista de mai jos). Unele atribute necesita drepturi de administrator pentru a fi definite. Atribute a (fiier, director, radacina) append only, noile scrieri sunt intotdeauna scrise la sfaritul fiierului A (fiier, director) no atime updates c (fiier, director, motenit) compress data, toate datele scrise dupa activarea acestui atribut vor fi comprimate. Va rugam sa reinei ca comprimarea este afectata i de opiunile de montare sau de atributele directorului parinte. Atunci cand este definit pe un director, toate fiierele nou create vor moteni acest atribut. Acest atribut nu poate fi definit in acelai timp cu 'm'. C (fiier, director, motenit) no copy-on-write, modificarile datelor din fiiere sunt efectuate pe loc (direct) Cand este definit pentru un director, toate fiierele nou create vor moteni acest atribut. Nota: Din cauza limitarilor de implementare, acest fanion poate fi activat/dezactivat numai pentru fiierele goale. d (fiier) no dump, are sens cu instrumente tere precum dump(8) , pe BTRFS atributul poate fi activat/dezactivat dar nu se face nicio alta manipulare speciala D (director) synchronous directory updates, pentru mai multe detalii cautai open(2) pentru O_SYNC i O_DSYNC i (fiier, director, root) immutable, nicio modificare a datelor i metadatelor fiierelor nu este permisa nici macar utilizatorului root atata timp cat acest atribut este activat (evident, excepia este dezactivarea atributului) m (fiier, director) no compression, dezactiveaza definitiv comprimarea pe fiierul dat. Orice opiuni de montare a comprimarii nu vor afecta acest fiier. (chattr(1) suport adaugat in versiunea 1.46.2) Atunci cand este definit pentru un director, toate fiierele nou create vor moteni acest atribut. Acest atribut nu poate fi definit in acelai timp cu c. S (fiier) synchronous updates, pentru mai multe detalii cautai open(2) pentru O_SYNC i O_DSYNC V (fiier, numai-citire) fs-verity enabled pe fiier Nu sunt acceptate alte atribute. Pentru lista completa, consultai pagina de manual chattr(1) . XFLAGS Exista o suprapunere de litere atribuite biilor cu atribute, aceasta lista se refera la ceea ce ofera xfs_io(8) : i immutable, la fel ca atributul a append only, la fel ca atributul s synchronous updates, la fel ca atributul S A no atime updates, la fel ca atributul d no dump, la fel ca atributul MODUL ,,ZONED" (de imparire in zone) Incepand cu versiunea 5.12, btrfs accepta aa-numitul ,,mod de imparire in zone (zoned mode)". Acesta reprezinta un format special pe disc i o strategie de alocare/scriere compatibila cu dispozitivele imparire in zone. Pe scurt, un dispozitiv este partiionat in zone de dimensiuni fixe, iar fiecare zona poate fi actualizata doar prin adaugare sau poate fi reiniializara. Deoarece btrfs nu are structuri de date fixe, cu excepia super-blocurilor, modul de imparire in zone necesita doar plasarea blocurilor in conformitate cu constrangerile dispozitivului. Putei afla mai multe despre intreaga arhitectura la . Dispozitivele sunt denumite i SMR/ZBC/ZNS, in modul host-managed. Reinei ca exista dispozitive care apar ca neimparite in zone, dar care sunt de fapt de imparite in zone. Acestea sunt drive-managed i utilizarea modului ,,zoned" (de imparire in zone) nu va ajuta. Dimensiunea zonei depinde de dispozitiv, dimensiunile tipice fiind de 256 Mio sau 1 Gio. In general, trebuie sa fie o putere a lui doi. Dispozitivele emulate cu zone, precum null_blk, permit definirea diverselor dimensiuni ale zonei. Cerine, limitari o toate dispozitivele trebuie sa aiba aceeai dimensiune a zonei o dimensiunea maxima a zonei este de 8 Gio o dimensiunea minima a zonei este de 4 Mio o amestecarea dispozitivelor imparite in zone i a celor neimparite in zone este posibila, scrierile zonale sunt emulate, dar acest lucru este in special pentru testare o super-blocul este tratat intr-un mod special i se afla in locaii diferite faa de un sistem de fiiere neimparit in zone: o primar: 0octei (i urmatoarele doua zone) o secundar: 512 Gio (i urmatoarele doua zone) o teriar: 4 Tio (4096 Gio i urmatoarele doua zone) Caracteristici incompatibile Principala constrangere a dispozitivelor imparite in zone este lipsa actualizarii pe loc(direct) a datelor. Acest lucru este intrinsec incompatibil cu anumite caracteristici: o NODATACOW - suprascriere pe loc (directa), nu se pot crea astfel de fiiere o fallocate - prealocarea spaiului pentru prima scriere pe loc (directa) o mixed-bg - scrieri neordonate in date i metadate, remedierea acestei probleme implica utilizarea unor grupuri separate de blocuri de date i metadate o booting - zona la poziia 0 conine super-blocul, reiniializarea zonei ar distruge datele incarcatorului de pornire Suportul iniial nu dispune de anumite funcii, dar acestea sunt planificate: o este acceptat numai profilul unic (date, metadate) i DUP (metadate) o fstrim - din cauza dependenei de cache-ul spaiului liber v1 Super-bloc Dupa cum s-a menionat mai sus, super-blocul este tratat intr-un mod special. Pentru a asigura protecia impotriva erorilor, cel puin o zona dintr-o locaie cunoscuta trebuie sa conina un super-bloc valid. Aceasta este implementata sub forma unui tampon circular in doua zone consecutive, incepand de la poziiile cunoscute 0B (0 octei), 512 Gio i 4 Tio. Valorile sunt diferite faa de cele de pe dispozitivele fara zone. Fiecare super-bloc nou este adaugat la sfaritul zonei; odata ce aceasta este completa, zona este reiniializara, iar operaiile de scriere continua in urmatoarea zona. Pentru a identifica cel mai recent super-bloc, este necesar sa se citeasca poziiile ambelor zone i sa se determine ultima versiune scrisa. Spaiul rezervat pentru super-bloc depinde de dimensiunea zonei. Copiile secundare i teriare sunt amplasate la distane mari, intrucat se preconizeaza ca dispozitivele vor avea o capacitate mare, de ordinul zecilor de teraoctei. Dimensiunea maxima acceptata a zonei este de 8 Gio, ceea ce ar insemna ca, de exemplu, intervalul 0-16 Gio ar fi rezervat exclusiv pentru super-bloc pe un dispozitiv ipotetic cu aceasta dimensiune a zonei. Aceasta reprezinta o risipa, dar este necesara pentru a garanta sigurana in caz de colaps. Recuperarea zonei, colectarea gunoiului Deoarece zonele sunt de tip ,,append-only" -- doar-adaugare, suprascrierea datelor sau modificarile COW din metadate fac ca anumite pari ale zonelor sa fie utilizate, dar fara a fi conectate la structurile sistemului de fiiere. Acest lucru face ca spaiul sa devina inutilizabil i sa creasca in timp. Odata ce raportul atinge un prag (configurabil), se iniiaza un proces de recuperare in fundal care realoca blocurile ramase in uz intr-o zona noua. Zona veche este reiniializara i poate fi utilizata din nou. Acest proces poate dura ceva timp, in funcie de alte operaii din fundal sau de cantitatea de date noi scrise. Este posibil sa se produca o eroare ENOSPC intermitenta. Unele dispozitive limiteaza, de asemenea, numarul de zone active. Dispozitive Hardware real Seria WD Ultrastar 600 promoveaza HM-SMR, adica modul de imparire in zone gestionat de gazda. Mai exista inca doua moduri: DA (gestionat de dispozitiv, fara exportarea informaiilor de imparire in zone catre sistem) i HA (compatibil cu gazda, poate fi utilizat ca un disc obinuit, dar scrierile zonele imparite imbunataesc performana). In prezent nu sunt disponibile multe dispozitive, iar informaiile despre modul de imparire in zone, exact sunt greu de gasit; verificai fiele tehnice sau sursele comunitaii care colecteaza informaii de la dispozitive reale. Nota: modul de imparire in zone nu funcioneaza cu discurile DM-SMR. o Ultrastar(R) DC ZN540 NVMe ZNS SSD (product brief ) Emulat: null_blk Controlorul null_blk ofera un dispozitiv bazat pe memorie i este potrivit pentru testare. Configurarea dispozitivelor prezinta cateva particularitai. Modulul trebuie incarcat cu nr_devices=0, altfel numerotarea nodurilor de dispozitiv va fi decalata. configfs trebuie montat la /sys/kernel/config, iar administrarea dispozitivelor null_blk se face in /sys/kernel/config/nullb. Nodurile dispozitivelor sunt denumite precum dev/nullb0 i sunt numerotate secvenial. NOTA: numele dispozitivului poate fi diferit de numele directorului din sysfs! Configurarea: modprobe configfs modprobe null_blk nr_devices=0 Creai un dispozitiv mydev, presupunand ca nu exista alte dispozitive create anterior, cu dimensiunea de 2048 Mio i dimensiunea zonei de 256 Mio. Exista mai muli parametri reglabili, acesta fiind un exemplu minim care utilizeaza valorile implicite: cd /sys/kernel/config/nullb/ mkdir mydev cd mydev echo 2048 > size echo 1 > zoned echo 1 > memory_backed echo 256 > zone_size echo 1 > power Aceasta va crea un dispozitiv /dev/nullb0, iar valoarea fiierului index va corespunde numarului final al nodului dispozitivului. Eliminai dispozitivul: rmdir /sys/kernel/config/nullb/mydev Apoi continuai cu mkfs.btrfs /dev/nullb0, modul de imparire in zone fiind detectat automat. Pentru comoditate, exista un script care cuprinde operaiile de baza de gestionare null_blk , comenzile de mai sus devin: nullb setup nullb create -s 2g -z 256 mkfs.btrfs /dev/nullb0 ... nullb rm nullb0 Emulat: runner (executor) TCMU TCMU este un cadru de lucru pentru emularea dispozitivelor SCSI in spaiul utilizatorului, oferind diverse sisteme de stocare, precum i suport pentru imparirea in zone. Un dispozitiv imparit in zone bazat pe fiiere poate oferi mai multe opiuni pentru spaii de stocare i dimensiuni ale zonelor mai mari. Va rugam sa urmai instruciunile de la . Compatibilitate, incompatibilitate o caracteristica stabilete un bit incompat i necesita un nou nucleu pentru a accesa sistemul de fiiere (atat pentru citire, cat i pentru scriere) o super-blocul trebuie tratat intr-un mod special; exista tot trei copii, dar la distane diferite (0, 512 Gio, 4 Tio), iar cele doua zone consecutive formeaza un tampon inelar al super-blocurilor; pentru a gasi pe cel mai recent, este necesar sa-l citim de la indicatorul de scriere sau sa efectuam o scanare completa a zonelor o amestecarea dispozitivelor imparite in zone i a celor neimparite in zone este posibila, (zonele sunt emulate), dar acest lucru este recomandat doar pentru testare o amestecarea dispozitivelor imparite in zone cu diferite dimensiuni ale zonelor, nu este posibila o dimensiunile zonelor trebuie sa fie puteri de doi, dimensiunile zonelor dispozitivelor reale sunt, de exemplu, 256Mio sau 1Gio, se ateapta dimensiuni mai mari, dimensiunea maxima a zonelor acceptate de btrfs este 8Gio Stare, stabilitate, raportarea erorilor Modul de imparire in zone ,,zoned" a fost lansat in versiunea 5.12 i exista inca unele imperfeciuni i cazuri speciale care pot aparea in timpul testarii. Va rugam sa raportai erorile la . Referine o o -- libzbc este o biblioteca i un set de instrumente pentru manipularea directa a dispozitivelor cu suport ZBC/ZAC o -- libzbd utilizeaza interfaa dispozitivului de blocuri imparit in zone furnizata de nucleu pe baza apelurilor de sistem ioctl() o -- cateva detalii despre tipurile exacte de dispozitive o -- Btrfs on zoned block devices o -- Zone Append: A New Way of Writing to Zoned Storage DISPOZITIV DE CONTROL Exista un dispozitiv special de caractere /dev/btrfs-control cu numerele majore i minore 10 i 234 (dispozitivul poate fi gasit in categoria misc). $ ls -l /dev/btrfs-control crw------- 1 root root 10, 234 Jan 1 12:00 /dev/btrfs-control Dispozitivul accepta unele apeluri ioctl care pot efectua urmatoarele aciuni pe modulul sistemului de fiiere: o scanarea dispozitivelor pentru sistemul de fiiere btrfs (de exemplu, pentru a permite montarea automata a sistemelor de fiiere cu mai multe dispozitive) i inregistrarea acestora cu modulul nucleului o similar cu scanarea, dar ateapta, de asemenea, pana cand procesul de scanare a dispozitivului este finalizat pentru un sistem de fiiere specificat o obine caracteristicile acceptate (pot fi gasite i sub /sys/fs/btrfs/features) Dispozitivul este creat la iniializarea sistemului de fiiere btrfs, fie ca modul, fie ca funcionalitate integrata, i are sens doar in acest context. Daca se executa, de exemplu, comanda mkfs fara ca modulul sa fie incarcat, dispozitivul nu va fi inregistrat i probabil va aparea un mesaj de avertizare in acest sens. In cazuri rare, cand modulul este incarcat, dar dispozitivul nu este prezent (cel mai probabil ters accidental), este posibil sa il recreai prin # mknod --mode=600 /dev/btrfs-control c 10 234 sau (incepand cu versiunea 5.11) printr-o comanda convenabila # btrfs rescue create-control-device Dispozitivul de control nu este strict necesar, insa scanarea dispozitivelor nu va funciona i va fi necesara utilizarea unei soluii alternative pentru montarea unui sistem de fiiere cu mai multe dispozitive. Opiunea de montare dispozitiv poate declana scanarea dispozitivelor in timpul montarii; a se vedea de asemenea btrfs device scan. SISTEM DE FIIERE CU PROFILURI MULTIPLE Este posibil ca un sistem de fiiere Btrfs sa conina mai multe profiluri de grupuri de blocuri de acelai tip. Aceasta se poate intampla atunci cand o conversie a profilului care utilizeaza filtre de echilibrare este intrerupta (a se vedea btrfs-balance(8) <>). Anumite comenzi btrfs efectueaza un test pentru a detecta acest tip de situaie i afieaza un avertisment precum acesta: WARNING: Multiple block group profiles detected, see 'man btrfs(5)'. WARNING: Data: single, raid1 WARNING: Metadata: single, raid1 Rezultatul corespunzator al btrfs filesystem df ar putea arata astfel: WARNING: Multiple block group profiles detected, see 'man btrfs(5)'. WARNING: Data: single, raid1 WARNING: Metadata: single, raid1 Data, RAID1: total=832.00MiB, used=0.00B Data, single: total=1.63GiB, used=0.00B System, single: total=4.00MiB, used=16.00KiB Metadata, single: total=8.00MiB, used=112.00KiB Metadata, RAID1: total=64.00MiB, used=32.00KiB GlobalReserve, single: total=16.25MiB, used=0.00B Exista mai mult de o linie pentru tipurile Data i Metadata, in timp ce profilurile sunt single i RAID1. Aceasta stare a sistemului de fiiere este OK, dar cel mai probabil este nevoie ca utilizatorul/administratorul sa intreprinda o aciune i sa finalizeze sarcinile intrerupte. Acest lucru nu poate fi facut cu uurina in mod automat, de asemenea, utilizatorul cunoate profilurile finale ateptate. In exemplul de mai sus, sistemul de fiiere a pornit ca un singur dispozitiv cu profilul de grup de blocuri single. Apoi a fost adaugat un alt dispozitiv, urmat de o operaie de echilibrare cu convert=raid1, dar, din anumite motive, aceasta nu s-a finalizat. Reluarea operaiei de echilibrare cu convert=raid1 va continua i va avea ca rezultat un sistem de fiiere in care toate profilurile grupurilor de blocuri vor fi RAID1. Nota: Daca suntei familiarizai cu filtrele de echilibrare, putei folosi comanda convert=raid1,profiles=single,soft, care va prelua doar profilele single neconvertite i le va transforma in raid1. Acest lucru poate accelera procesul de conversie, intrucat nu se va incerca rescrierea profilelor raid1 deja convertite. Este recomandabil sa existe un singur profil, deoarece acesta definete in mod clar profilul grupurilor de blocuri nou alocate; in caz contrar, acest lucru depinde de politica interna de alocare. Atunci cand exista mai multe profiluri, ordinea de selecie este RAID56, RAID10, RAID1, RAID0, cu condiia ca restriciile privind numarul dispozitivelor sa fie respectate. Comenzile care afieaza avertismentul au fost alese astfel incat sa atraga atenia utilizatorului atunci cand starea sistemului de fiiere este modificata in acest sens. Acestea sunt: device add, device delete, balance cancel, balance pause. Comenzi care afieaza informaii despre utilizarea spaiului: filesystem df, device usage. Comanda filesystem usage afieaza o linie in rezumatul general: Multiple profiles: yes (data, metadata) DISPOZITIV DE INSAMANARE Mecanismul COW i prezena mai multor dispozitive sub o singura carcasa fac posibil un concept interesant, numit ,,dispozitiv de iniializare": extinderea unui sistem de fiiere numai pentru citire de pe un dispozitiv cu ajutorul unui alt dispozitiv care preia toate operaiile de scriere. De exemplu, imaginai-va o imagine de referina imuabila a unui sistem de operare, completata cu un alt dispozitiv care permite utilizarea datelor din imaginea de referina i funcionarea normala. Aceasta idee ii are originea in CD-ROM-urile cu sistem de operare de baza, care permiteau utilizarea lor pentru sisteme live, dar a devenit invechita. Exista tehnologii care ofera funcionalitai similare, precum unionmount , overlayfs sau instantaneea de imagine qcow2 . Dispozitivul de insamanare pornete ca un sistem de fiiere obinuit; odata ce coninutul este pregatit, se utilizeaza comanda btrfstune -S 1 pentru a-l marca ca dispozitiv de insamanare. Montarea unui astfel de dispozitiv nu va permite nicio operaie de scriere, cu excepia adaugarii unui nou dispozitiv prin comanda btrfs device add. Apoi, sistemul de fiiere poate fi remontat in modul de citire-scriere. Avand in vedere ca sistemul de fiiere de pe dispozitivul de insamanare este intotdeauna recunoscut ca fiind doar pentru citire, acesta poate fi utilizat pentru a insamana simultan mai multe sisteme de fiiere de pe un singur dispozitiv. UUID-ul asociat in mod obinuit unui dispozitiv este schimbat automat intr-un UUID aleatoriu la fiecare montare. Nota: Inainte de versiunea 6.17 a nucleului, un dispozitiv semanator putea fi montat independent, alaturi de sistemele de fiiere create din acesta. Insa, incepand cu versiunea 6.17 a nucleului, un dispozitiv semanator poate fi montat fie prin intermediul unui sistem de fiiere creat din acesta, fie direct ca dispozitiv semanator, dar nu in ambele moduri simultan. Acest lucru este menit sa asigure ca un dispozitiv de blocuri are un singur sistem de fiiere legat de acesta, astfel incat evenimentele de lipsa a dispozitivului in timpul rularii sa poata fi gestionate corespunzator. Odata ce dispozitivul de insamanare este montat, este necesar dispozitivul de scriere. Dupa adaugarea acestuia, demontarea i remontarea cu comanda umount /ruta; mount /dev/de-scriere /ruta sau remontarea in mod citire-scriere cu comanda remount -o remount,rw face ca sistemul de fiiere de la /ruta sa fie gata de utilizare. Nota: A existat o eroare cunoscuta cu utilizarea opaiunii ,,remount" pentru a face montarea inscriptibila: ,,remount" va lasa sistemul de fiiere intr-o stare in care nu este capabil sa curee instantaneele terse, astfel incat acesta va pierde spaiu pana cand este demontat i montat corect. Aceasta eroare a fost remediata in versiunile 5.11 i mai recente ale nucleului. In plus, tergerea dispozitivului de insamanare din sistemul de fiiere il poate transforma intr-un sistem de fiiere normal, cu condiia ca dispozitivul inscriptibil sa poata conine i toate datele din dispozitivul de insamanare. Fanionul dispozitivului de insamanare poate fi dezactivat din nou cu comanda btrfstune -f -S 0, permiand astfel actualizarea cu date mai recente; totui, reinei ca aceasta operaie va invalida toate sistemele de fiiere existente care utilizeaza acest dispozitiv de insamanare. Aceasta procedura este adecvata pentru anumite situaii, dar nu i pentru altele, iar utilizarea fanionului de forare in comanda este obligatorie pentru a evita erorile accidentale. Exemplu de creare i utilizare a unui dispozitiv de insamanare: # mkfs.btrfs /dev/sda # mount /dev/sda /mnt/mnt1 ... fill mnt1 with data # umount /mnt/mnt1 # btrfstune -S 1 /dev/sda # mount /dev/sda /mnt/mnt1 # btrfs device add /dev/sdb /mnt/mnt1 # umount /mnt/mnt1 # mount /dev/sdb /mnt/mnt1 ... /mnt/mnt1 este acum inscriptibila Acum /mnt/mnt1 poate fi utilizat in mod normal. Dispozitivul /dev/sda poate fi montat din nou cu un alt dispozitiv inscriptibil: # mount /dev/sda /mnt/mnt2 # btrfs device add /dev/sdc /mnt/mnt2 # umount /mnt/mnt2 # mount /dev/sdc /mnt/mnt2 ... /mnt/mnt2 este acum inscriptibila Dispozitivul inscriptibil (file:/dev/sdb) poate fi decuplat de dispozitivul de insamanare i utilizat independent: # btrfs device delete /dev/sda /mnt/mnt1 Deoarece coninutul provine din dispozitivul de insamanare, este posibil sa transformai /dev/sdb din nou intr-un dispozitiv de insamanare i sa repetai intregul proces. Cateva lucruri de reinut: o se recomanda utilizarea unui singur dispozitiv pentru dispozitivul de insamanare, funcioneaza pentru mai multe dispozitive, dar profilul single trebuie utilizat pentru a face ca tergerea dispozitivului de insamanare sa funcioneze o profilele grupurilor de blocuri single i dup ofera suport pentru cazurile de utilizare de mai sus o eticheta este copiata de la dispozitivul de insamanare i poate fi modificata prin btrfs filesystem label o fiecare noua montare a dispozitivului de insamanare primete un nou UUID aleatoriu o Comanda umount /ruta; mount /dev/inscriptibil /ruta poate fi inlocuita cu mount -o remount,rw /ruta, dar aceasta nu va elibera spaiul sub-volumelor terse pana cand dispozitivul de insamanare nu este montat din nou in mod citire-scriere, inainte de efectuarea din nou a operaiei de insamanare Dispozitive de insamanare in lan Dei nu este recomandat i reprezinta mai degraba un scenariu de utilizare puin cunoscut i netestat, este posibila conectarea in serie a dispozitivelor de insamanare. In primul exemplu, dispozitivul inscriptibil /dev/sdb poate fi transformat din nou intr-un alt dispozitiv de insamanare, in funcie de dispozitivul de insamanare neschimbat /dev/sda. Apoi, folosind /dev/sdb ca dispozitiv principal de insamanare, acesta poate fi extins cu un alt dispozitiv inscriptibil, sa zicem /dev/sdd, i continua ca mai inainte ca o structura simpla arborescenta pe dispozitive. # mkfs.btrfs /dev/sda # mount /dev/sda /mnt/mnt1 ... fill mnt1 with data # umount /mnt/mnt1 # btrfstune -S 1 /dev/sda # mount /dev/sda /mnt/mnt1 # btrfs device add /dev/sdb /mnt/mnt1 # mount -o remount,rw /mnt/mnt1 ... /mnt/mnt1 este acum inscriptibila # umount /mnt/mnt1 # btrfstune -S 1 /dev/sdb # mount /dev/sdb /mnt/mnt1 # btrfs device add /dev/sdc /mnt # mount -o remount,rw /mnt/mnt1 ... /mnt/mnt1 este acum inscriptibila # umount /mnt/mnt1 Ca rezultat, avem: o sda este un singur dispozitiv de insamanare, cu coninutul sau iniial o sdb este un dispozitiv de insamanare, dar necesita sda, coninutul este din momentul in care sdb este facut insamanare, adica coninutul lui sda cu orice modificari ulterioare o sdc ultimul inscriptibil, poate fi transformat intr-unul de insamanare la fel cum a fost sdb, pastrandu-i coninutul i depinzand de sda i sdb Atat timp cat dispozitivele de insamanare sunt nemodificate i disponibile, acestea pot fi utilizate pentru a crea o alta ramura. STAREA RAID56 I PRACTICI RECOMANDATE Funcia RAID56 asigura distribuirea datelor i paritatea pe mai multe dispozitive, la fel ca in cazul sistemelor tradiionale RAID5/6. Exista insa unele deficiene de implementare i proiectare care o fac nesigura in anumite situaii extreme, iar aceasta funcie nu ar trebui utilizata in mediul de producie, ci doar in scopuri de evaluare sau testare. Protecia metadatelor in caz de intrerupere a alimentarii cu energie electrica nu este garantata 100% in cazul RAID56. Metadate Nu utilizai raid5 sau raid6 pentru metadate. Utilizai raid1 sau, respectiv, raid1c3. Profilele de rezerva ofera aceleai garanii impotriva pierderii unuia sau a doua dispozitive i, in anumite privine, pot reprezenta o imbunataire. Recuperarea datelor in cazul pierderii unui singur dispozitiv va necesita doar accesarea primei sau a celei de-a doua copii ramase, care, in general, poate fi stocata pe alte dispozitive datorita modului in care funcioneaza RAID1 pe btrfs, spre deosebire de un profil de tip ,,striped" (similar cu raid0), care ar necesita prezena tuturor dispozitivelor in permanena. Modelul de alocare a spaiului i consumul difera (de exemplu, pe N dispozitive): in cazul raid5, de exemplu, pe fiecare dispozitiv este rezervat un bloc de 1 Gio, in timp ce in cazul raid1 fiecare bloc de 1 Gio este stocat pe doua dispozitive. Consumul fiecarui 1 Gio de metadate utilizate este atunci N * 1 Gio faa de 2 * 1 Gio. Utilizarea raid1 este, de asemenea, mai convenabila pentru echilibrare/conversie la un alt profil, datorita cerinelor mai reduse privind spaiul disponibil pentru blocuri. Suport lipsa/incomplet Atunci cand RAID56 se afla pe acelai sistem de fiiere cu profiluri RAID diferite, raportarea spaiului este inexacta, de exemplu df, btrfs filesystem df sau btrfs filesystem usage. Atunci cand exista un singur profil pentru fiecare tip de grup de blocuri (de exemplu, RAID5 pentru date), raportarea este exacta. Atunci cand se pornete procesul de curaare pe un sistem de fiiere RAID56, acesta se pornete pe toate dispozitivele, ceea ce duce la scaderea performanei. Soluia este sa-l pornii separat pe fiecare dispozitiv. Din aceasta cauza, statisticile dispozitivelor pot sa nu corespunda cu starea reala, iar unele erori pot fi raportate de mai multe ori. Problema ,,write hole". O oprire necontrolata ar putea lasa o banda parial scrisa intr-o stare in care unele intervale ale benzii i paritatea provin din scrierile anterioare, iar altele sunt noi. Nu se ine evidena care informaii sunt de un fel i care de altul. Jurnalul de scriere nu este implementat. O alternativa ar fi un ciclu complet de citire-modificare-scriere, care ar asigura scrierea intregii benzi, evitand complet problema ,,write hole", dar performana in acest caz s-a dovedit a fi prea slaba pentru a putea fi utilizata. Imparirea in benzi se realizeaza pe toate dispozitivele disponibile (la momentul alocarii blocurilor), astfel incat, in cazul in care se adauga un dispozitiv nou, acesta s-ar putea sa nu fie utilizat imediat i ar fi necesara o reechilibrare. Nu este implementata o laime fixa a benzii. GLOSAR Termenii care apar in cursiva apar i in acest glosar. allocator De obicei, allocator inseamna alocatorul block, adica logica din interiorul sistemului de fiiere care decide unde sa plaseze blocurile nou alocate pentru a menine mai multe constrangeri (precum amplasarea datelor, fragmentarea redusa). In btrfs, alocatorul se poate referi i la alocatorul chunk, adica logica din spatele plasarii bucailor pe dispozitive. balance O operaie care poate fi efectuata asupra unui sistem de fiiere Btrfs, de exemplu prin comanda btrfs balance /ruta. O operaie de echilibrare trece din nou toate datele din sistemul de fiiere prin alocator. Aceasta are ca scop principal reechilibrarea datelor din sistemul de fiiere intre dispozitive atunci cand se adauga sau se elimina un dispozitiv. O operaie de echilibrare va regenera copiile lipsa pentru nivelurile redundante RAID, in cazul in care un dispozitiv s-a defectat. Incepand cu versiunea 3.3 a nucleului Linux, o operaie de echilibrare poate fi facuta selectiva in ceea ce privete parile sistemului de fiiere care sunt rescrise folosind filtre <#man-balance-filters>. barrier O instruciune adresata hardware-ului subiacent pentru a se asigura ca toate datele situate inaintea barierei sunt scrise fizic pe suportul de stocare permanent inaintea celor situate dupa aceasta. Se utilizeaza in cadrul abordarii copy on write a sistemului de fiiere Btrfs pentru a asigura coerena sistemului de fiiere. block O singura piesa de stocare contigua din punct de vedere fizic i logic pe un dispozitiv, de dimensiune, de exemplu, 4K. In unele contexte, se face referire i la sector, dei este preferat termenul block. block group Unitatea de alocare a spaiului in Btrfs. Un grup de blocuri este configurat pe disc de catre alocatorul Btrfs i va consta dintr-unul sau mai multe chunks (fragmente), fiecare fiind stocat pe un dispozitiv diferit. Numarul de chunks-uri utilizate intr-un grup de blocuri va depinde de nivelul sau RAID. B-tree Structura fundamentala de stocare a datelor utilizata in btrfs. Cu excepia superblocurilor, toate metadatele btrfs sunt stocate intr-unul dintre numeroii arbori-B (B-trees) de pe disc. Arborii-B stocheaza perechi cheie/element. Dei se folosete acelai cod pentru implementarea tuturor arborilor-B, exista cateva categorii diferite de arbori-B. Denumirea ,,btrfs" se refera la utilizarea arborilor-B. btrfsck, fsck, btrfs-check Instrument din pachetul btrfs-progs care verifica un sistem de fiiere nemontat (offline) i raporteaza eventualele erori identificate in structurile sistemului de fiiere. In mod implicit, instrumentul ruleaza in modul numai-citire, deoarece remedierea erorilor poate fi periculoasa. A se vedea de asemenea scrub. btrfs-progs Instrumente in modul utilizator pentru gestionarea funcionalitailor specifice Btrfs. Gazduite la . Interfaa principala pentru funciile btrfs este instrumentul independent btrfs, dei i alte instrumente, precum mkfs.btrfs i btrfstune, fac parte din btrfs-progs. chunk O parte a unui block group. Bucaile au dimensiunea de 1 Gio (pentru date) sau 256 Mio (pentru metadata), in funcie de dimensiunea totala a sistemului de fiiere. chunk tree Un strat care pastreaza informaii despre corespondena dintre adresele blocurilor fizice i logice. Acesta este stocat in cadrul grupului system. cleaner Termenul este folosit de obicei in contextul subvolumelor terse. Este vorba despre un proces care ruleaza in fundal i care elimina datele propriu-zise odata ce un subvolum a fost ters. Procesul de curaare poate implica o activitate intensa la nivel de operaii de In/Ie i CPU, in funcie de gradul de fragmentare i de cantitatea de date partajate cu alte subvolume. Firul de execuie mai curat al nucleului proceseaza, de asemenea, defragmentarea declanata de opiunea de montare autodefrag, eliminarea grupurilor de blocuri goale i alte cateva sarcini de finalizare. copy-on-write, COW Cunoscuta i sub denumirea de COW. Metoda utilizata de btrfs pentru modificarea datelor. In loc sa suprascrie direct datele in locaia iniiala, btrfs realizeaza o copie a datelor, o modifica i apoi scrie datele modificate intr-o alta locaie (neutilizata) de pe disc. Apoi actualizeaza metadatele pentru a reflecta noua locaie a datelor. Pentru a actualiza metadatele, blocurile de metadate afectate sunt tratate in acelai mod. In sistemele de fiiere COW, fiierele tind sa se fragmenteze pe masura ce sunt modificate. Metoda copy-on-write este utilizata i in implementarea snapshots i reflink copies. Un sistem de fiiere copy-on-write este, in teorie, intotdeauna consistent, cu condiia ca hardware-ul subiacent sa accepte barriers. default subvolume sub-volumul dintr-un sistem de fiiere btrfs care este montat la montarea sistemului de fiiere fara a utiliza opiunea de montare subvol=. device Un dispozitiv de blocuri Linux, de exemplu, un disc intreg, o partiie, un volum logic LVM, un dispozitiv loopback sau un dispozitiv de blocuri de reea. Un sistem de fiiere btrfs poate rezida pe unul sau mai multe dispozitive. df Un instrument standard Unix pentru afiarea spaiului utilizat i liber dintr-un sistem de fiiere. Instrumentul standard nu ofera rezultate precise, dar comanda btrfs din pachetul btrfs-progs include o implementare a comenzii df care afieaza spaiul disponibil cu mai multe detalii. Consultai [[FAQ#Why_does_df_show_incorrect_free_space_for_my_RAID_volume.3F|FAQ]] pentru o explicaie mai detaliata a contabilizarii spaiului liber in btrfs. DUP O varianta a ,,RAID" care stocheaza doua copii ale fiecarui element de date pe acelai dispozitiv. Aceasta este similara cu RAID1 i ofera protecie impotriva erorilor la nivel de bloc pe dispozitiv, dar nu ofera nicio garanie in cazul in care intregul dispozitiv se defecteaza. In mod implicit, btrfs utilizeaza profilul DUP pentru metadate in sistemele de fiiere cu un singur dispozitiv. ENOSPC Cod de eroare returnat de sistemul de operare catre un program al utilizatorului atunci cand sistemul de fiiere nu poate aloca suficient spaiu pentru a satisface solicitarea utilizatorului. In majoritatea sistemelor de fiiere, acesta indica faptul ca nu exista spaiu liber disponibil in sistemul de fiiere. Datorita cerinelor suplimentare de spaiu impuse de comportamentul COW al btrfs, btrfs poate returna uneori ENOSPC chiar i atunci cand, aparent (conform comenzii df), exista o cantitate mare de spaiu liber. Aceasta este, de fapt, o eroare in btrfs i (daca este repetabila), utilizarea opiunii de montare enospc_debug poate genera un raport care va ajuta dezvoltatorii btrfs. Consultai [[FAQ#if_your_device_is_large_.28.3E16GiB.29|intrarea din FAQ]] privind spaiul liber. extent Secvena contigua de octei pe disc care stocheaza datele fiierului. Aceasta reprezinta o reprezentare compacta care ine evidena punctului de inceput i a lungimii intervalului de octei, astfel incat logica care sta la baza alocarii blocurilor (delayed allocation -- alocare intarziata) urmarete maximizarea lungimii inainte de scrierea extensiilor pe dispozitive. extent buffer O abstractizare a unui bloc de metadate b-tree care stocheaza chei i date de element. Structurile conexe subiacente sunt un bloc de dispozitiv fizic i o pagina de memorie CPU. fallocate Instrument de linie de comanda din pachetul util-linux i un apel de sistem care rezerva spaiu in sistemul de fiiere pentru un fiier, fara a scrie efectiv date ale fiierului in sistemul de fiiere. Prima scriere de date va transforma extinderile (extents) prealocate in extinderi obinuite. Vezi fallocate(1) i paginile de manual fallocate(2) pentru mai multe detalii. filefrag Un instrument care afieaza numarul de extinderi (extents) dintr-un fiier i, prin urmare, gradul de fragmentare al acestuia. De obicei, acesta face parte din pachetul e2fsprogs in majoritatea distribuiilor Linux. Dei a fost dezvoltat iniial pentru sistemul de fiiere ext2, funcioneaza i pe Btrfs. Utilizeaza comanda ioctl FIEMAP. free space cache Cunoscut, de asemenea, sub denumirea de ,,space cache v1 -- cache de spaiu v1". Un cache separat care ine evidena spaiului liber, intrucat Btrfs urmarete doar spaiul alocat. Spaiul liber este, prin definiie, orice interval liber dintre intervalele alocate. Identificarea intervalelor libere poate implica o activitate intensa de operaii de In/Ie, astfel incat cache-ul stocheaza o reprezentare condensata a acestora. Acesta este actualizat la fiecare confirmare a unei tranzacii. Memoria cache de spaiu liber v1 a fost inlocuita de arborele de spaiu liber. free space tree Succesorul lui free space cache, cunoscut i ca ,,space cache v2" i acum implicit. Spaiul liber este urmarit intr-un mod mai bun i folosind COW, spre deosebire de un mecanism personalizat din v1. fsync In sistemele de operare Unix i de tip Unix (din care Linux face parte), apelul de sistem fsync(2) determina scrierea tuturor modificarilor de date legate de descriptorii de fiiere stocate in memoria tampon, pe dispozitivul de blocuri subiacent. Cand un fiier este modificat intr-un sistem de operare modern, modificarile nu sunt, in general, scrise imediat pe disc, ci sunt stocate in memoria tampon din motive de performana; apelarea fsync(2) determina scrierea pe disc a oricaror modificari din memorie. generation Un contor intern care se actualizeaza la fiecare tranzacie. Atunci cand se scrie un bloc de metadate (folosind ,,copy-on-write"), generaia curenta este stocata in bloc, astfel incat blocurile prea recente (i, prin urmare, posibil inconsistente) sa poata fi identificate. key Un tuple de dimensiune fixa utilizat pentru identificarea i sortarea elementelor dintr-un arbore-B B-tree. Cheia este imparita in trei pari: objectid, type i offset. Campul type indica modul in care trebuie utilizate celelalte doua campuri i ce se poate gasi in elementul respectiv. item O structura de marime variabila stocata in frunze B-tree. Elementele conin diferite tipuri de date in funcie de tipul cheii. log tree Un b-tree care urmarete temporar actualizarile de metadate in curs de desfaurare pana cand se efectueaza o comitere completa a tranzaciei. Este o optimizare de performana a fsync. Jurnalul urmarit in arbore este reluat daca sistemul de fiiere nu este demontat curat. metadata Date despre date. In btrfs, acestea includ toate structurile interne de date ale sistemului de fiiere, inclusiv structuri de directoare, nume de fiiere, permisiuni de fiiere, sume de control i locaia extents a fiecarui fiier. Toate metadatele btrfs sunt stocate in B-trees. mkfs.btrfs Instrumentul (din btrfs-progs) pentru a crea un sistem de fiiere btrfs. offline Un sistem de fiiere care nu este montat este inactiv (offline). Unele instrumente (de exemplu btrfsck) vor funciona numai pe sisteme de fiiere inactive. Comparai cu online. online Un sistem de fiiere care este montat este activ (online). Majoritatea instrumentelor btrfs vor funciona numai pe sisteme de fiiere active. Comparai cu offline. orphan Un fiier care este inca in uz (deschis de un proces in desfaurare), dar toate intrarile de director ale fiierului respectiv au fost eliminate. RAID O clasa de metode diverse pentru scrierea unor date redundante suplimentare pe mai multe dispozitive, astfel incat, in cazul in care un dispozitiv se defecteaza, datele pierdute sa poata fi reconstituite pe baza celor ramase. A se vedea RAID0, RAID1, RAID5, RAID6, RAID10, DUP i single. Metodele RAID tradiionale funcioneaza pe mai multe dispozitive de dimensiuni egale, in timp ce implementarea btrfs' RAID funcioneaza in interiorul block groups -- grupurilor de blocuri. RAID0 O forma de RAID care nu ofera garanii de recuperare in caz de eroare, dar realizeaza o singura copie a datelor pe mai multe dispozitive in scopuri de performana. Dimensiunea benzii (stripe) este fixata la 64Ko pentru moment. RAID1, RAID1C3, RAID1C4 O varianta de RAID care stocheaza doua/trei/patru copii complete ale fiecarui element de date. Fiecare copie este stocata pe un dispozitiv diferit. btrfs necesita cel puin doua dispozitive pentru a utiliza RAID-1 sau, respectiv, trei/patru. Acesta este profilul implicit al grupului de blocuri pentru btrfs, care stocheaza metadatele pe mai multe dispozitive. RAID5 O forma de RAID care imparte o singura copie a datelor pe mai multe dispozitive, inclusiv datele de paritate suplimentare ale unui dispozitiv. Poate fi utilizata pentru recuperarea datelor in cazul defectarii unui singur dispozitiv. RAID6 O forma de RAID care imparte o singura copie a datelor pe mai multe dispozitive, inclusiv date de paritate suplimentare echivalente cu doua dispozitive. Poate fi utilizata pentru recuperarea datelor in cazul defectarii a doua dispozitive. RAID10 O forma de RAID care stocheaza doua copii complete ale fiecarei date i, de asemenea, imparte fiecare copie pe mai multe dispozitive pentru a imbunatai performana. reflink Termenul este folosit de obicei pentru a desemna o copie superficiala a segmentelor(extents) de fiier care impart aceleai segmente pana la prima modificare. Fiierele cu legaturi refacute ,,reflinked" (de exemplu, prin comanda cp) sunt fiiere diferite, dar care indica aceleai segmente; orice modificare va fi detectata i se va crea o noua copie a datelor, meninand fiierele independente. In legatura cu acest concept se afla clonarea unui interval de segmente, care se aplica unui interval dintr-un fiier. relocation Procesul de mutare a grupurilor de blocuri in cadrul sistemului de fiiere, meninand in acelai timp integritatea i coerena completa a sistemului de fiiere. Aceasta funcionalitate sta la baza funciilor de eliminare balance i device. scrub <> Un instrument de verificare a sistemului de fiiere activ. Citete toate datele i metadatele din sistemul de fiiere, verifica sumele de control i, in cele din urma, utilizeaza copii redundante din RAID sau DUP pentru a repara orice date/metadate corupte. seed device <> Un dispozitiv numai pentru citire poate fi folosit ca sursa iniiala(samana) sau ablon pentru un sistem de fiiere (de exemplu, un CD-ROM care conine o imagine a sistemului de operare). Se pot adauga dispozitive de citire/scriere pentru a stoca modificarile (folosind copy on write); modificarile aduse dispozitivelor inscriptibile sunt persistente chiar i dupa repornirea sistemului. Dispozitivul original ramane neschimbat i poate fi indepartat in orice moment (dupa ce Btrfs a primit instruciuni sa copieze toate blocurile lipsa). Se pot construi mai multe sisteme de fiiere de citire/scriere pornind de la aceeai samana. single Un profil de grup de blocuri care stocheaza o singura copie a fiecarei informaii. snapshot <> Un sub-volum subvolume care este o copie copy on write a unui alt subvolum. Cele doua subvolume partajeaza toate datele comune (nemodificate), ceea ce inseamna ca instantaneele pot fi utilizate pentru a pastra istoricul unui sistem de fiiere cu un cost foarte redus. Dupa realizarea instantaneei, subvolumul original i instantaneea au statut egal: originalul nu ,,deine" instantaneea, iar oricare dintre ele poate fi ters fara a-l afecta pe celalalt. subvolume <> O structura ierarhica de fiiere i directoare din cadrul unui sistem de fiiere Btrfs, care poate fi montata ca i cum ar fi un sistem de fiiere independent. Un sub-volum se creeaza prin stabilirea unei referine la radacina unui alt sub-volum. Fiecare sistem de fiiere btrfs are cel puin un sub-volum, top-level subvolume -- sub-volumul de nivel superior, care conine tot restul sistemului de fiiere. Sub-volumele suplimentare pot fi create i terse cu instrumentul btrfs<. Toate sub-volumele impart acelai spaiu liber din sistemul de fiiere. Vezi i default subvolume -- sub-volumul implicit. super block Un bloc special de metadate care constituie punctul principal de acces la structurile sistemului de fiiere. Dimensiunea acestuia este fixa, iar pe dispozitive exista locaii fixe utilizate pentru detectarea i deschiderea sistemului de fiiere. Actualizarea superblocului definete o tranzacie. Superblocul conine identificatorul sistemului de fiiere (UUID), tipul de suma de control, indicatori de blocuri catre arborii fundamentali, caracteristici i parametri de creare. system array Un termen tehnic care se refera la metadatele super block ce descriu modul de asamblare a unui sistem de fiiere din mai multe dispozitive, stocand informaii despre blocuri i dispozitive care trebuie scanate/inregistrate in momentul montarii. Scanarea se efectueaza prin comanda btrfs device scan; alternativ, toate dispozitivele necesare pot fi specificate printr-o opiune de montare device=/ruta. top-level subvolume subvolume in partea de sus a sistemului de fiiere. Acesta este singurul subvolum prezent intr-un sistem de fiiere btrfs nou creat i are ID-ul 5 intern, altfel ar putea fi referit ca 0 (de exemplu, in subcomanda set-default a btrfs). transaction Un set coerent de modificari. Pentru a evita generarea unui volum foarte mare de activitate pe disc, btrfs stocheaza modificarile in memoria RAM timp de pana la 30 de secunde (uneori mai des daca sistemul de fiiere ramane fara spaiu sau efectueaza numeroase operaii fsync), apoi scrie (confirma) aceste modificari pe disc dintr-o singura data (folosind comportamentul copy-on-write). Aceasta perioada de stocare in cache se numete tranzacie. Doar o singura tranzacie este activa pe sistemul de fiiere in orice moment. transid Un termen alternativ pentru generation. writeback Writeback in contextul nucleului Linux poate fi definit ca procesul de scriere a memoriei ,,murdare" din cache-ul paginii pe disc, atunci cand sunt indeplinite anumite condiii (expirarea timpului, numarul de pagini murdare peste un anumit raport). MODEL DE STOCARE, CONSIDERENTE HARDWARE Modelul de stocare Un model de stocare este un model care surprinde aspectele fizice cheie ale structurii datelor intr-un spaiu de stocare a datelor. Un sistem de fiiere este structura logica care organizeaza datele pe dispozitivul de stocare. Sistemul de fiiere ine cont de anumite caracteristici sau limitari ale dispozitivului de stocare i le utilizeaza sau aplica masuri pentru a asigura fiabilitatea. BTRFS, in special, se bazeaza pe un mod de scriere COW (copy on write), adica nu actualizeaza datele pe loc (fara utilizarea unui tampon sau fiier temporar), ci scrie o noua copie intr-o alta locaie i apoi comuta indicatorii in mod atomic. Intr-o lume ideala, dispozitivul face exact ceea ce promite. Sistemul de fiiere pornete de la premisa ca acest lucru s-ar putea sa nu fie adevarat, aa ca se aplica mecanisme suplimentare fie pentru a detecta defeciuni hardware, fie pentru a obine date valide prin alte mijloace. Dispozitivele pot (i chiar o fac) sa-i aplice propriile mecanisme de detectare i reparare, dar noi nu vom presupune existena niciunui astfel de mecanism. Se iau in considerare urmatoarele ipoteze privind dispozitivele de stocare (ordonate dupa importana, numerele sunt pentru referine ulterioare): 1. atomicitatea citirilor i scrierilor de blocuri/sectoare (cea mai mica unitate de date pe care dispozitivul o prezinta straturilor superioare) 2. exista o comanda de golire care instruiete dispozitivul sa ordoneze in mod forat scrierile inainte i dupa comanda; alternativ, exista o comanda de bariera care faciliteaza ordonarea, dar care poate sa nu goleasca datele 3. datele trimise pentru a fi scrise intr-o anumita poziie pe un dispozitiv vor fi scrise fara modificari suplimentare ale datelor i ale poziiei 4. scrierile pot fi reordonate de dispozitiv, cu excepia cazului in care sunt serializate in mod explicit prin comanda flush 5. citirile i scrierile pot fi reordonate i intercalate in mod liber Modelul de consistena al BTRFS se bazeaza pe aceste ipoteze. Actualizarile logice ale datelor sunt grupate intr-o generaie, scrise pe dispozitiv, serializate prin comanda <>, iar apoi se scrie super-blocul, ceea ce incheie generaia. Niciuna dintre legaturile logice dintre metadate care alcatuiesc o viziune consistenta asupra datelor nu poate depai limita generaiei. Cand lucrurile merg prost Atomicitate nula sau pariala a citirilor/scrierilor in bloc (1) o Problema: coninutul unui bloc parial este scris (scriere intrerupta), de exemplu din cauza unei intreruperi de curent sau a unei alte defeciuni electronice in timpul citirii/scrierii. o Detectare: nepotrivire suma de control la citire o Reparare: utilizai o alta copie sau reconstruii din mai multe blocuri utilizand o schema de codificare Comanda flush nu efectueaza golirea (2) Aceasta este probabil cea mai grava problema i este imposibil de remediat la nivelul sistemului de fiiere fara impunerea unor limitari i restricii de proiectare. In cel mai rau caz, s-ar putea intampla ca operaiile de scriere dintr-o generaie sa se suprapuna peste cele dintr-o alta generaie, in timp ce sistemul de fiiere continua sa considere generaiile ca fiind izolate. O blocare in orice moment ar lasa datele de pe dispozitiv intr-o stare inconsistenta, fara niciun indiciu cu privire la ce anume a fost scris, ce lipsete, ceea ce ar duce la informaii invechite privind legaturile metadatelor. Dispozitivele respecta de obicei comanda de golire <>, dar, din motive de performana, pot recurge la stocarea in cache interna, caz in care datele golite nu sunt inca stocate permanent. O pana de curent ar putea duce la un scenariu similar cu cel de mai sus, dei este mai puin probabil ca scrierile ulterioare sa fie scrise inaintea celor din cache. Acest lucru depaete ceea ce poate lua in considerare un sistem de fiiere. Dispozitivele sau controlorii sunt de obicei echipate cu baterii sau condensatoare pentru a scrie coninutul cache-ului chiar i dupa intreruperea alimentarii cu energie electrica. (Battery backed write cache -- cache de scriere susinut de baterie) Datele sunt modificate in mod silenios la scriere (3) Astfel de lucruri nu ar trebui sa se intample frecvent, dar pot aparea in mod neateptat din cauza funcionarii interne complexe a dispozitivelor sau a efectelor fizice ale suportului de stocare in sine. o Problema: in timp ce datele sunt scrise atomic, coninutul se modifica o Detectare: nepotrivire suma de control la citire o Reparare: utilizai o alta copie sau reconstruii din mai multe blocuri utilizand o schema de codificare Datele sunt scrise in mod silenios intr-o alta poziie (3) Aceasta ar fi o alta problema grava, deoarece sistemul de fiiere nu are informaii cand se intampla acest lucru. Din acest motiv, masurile trebuie luate din timp. Aceasta problema este denumita in mod obinuit ghost write (scriere fantoma). Blocurile de metadate conin suma de control incorporata, astfel incat o operaie de scriere atomica corecta nu ar altera suma de control. Este foarte probabil ca, dupa citirea unui astfel de bloc, datele din interiorul acestuia sa nu mai fie in concordana cu restul. Pentru a exclude aceasta posibilitate, in blocul de metadate este incorporat numarul blocului. Acesta este numarul blocului logic, deoarece aceasta este informaia pe care structura logica o ateapta i o verifica. Urmatoarele informaii se bazeaza pe informaii disponibile public, comentarii/opinii ale utilizatorilor, discuii in comunitate sau analize ale rapoartelor de erori. Acestea nu sunt complete i, in caz de dubiu, se recomanda efectuarea de cercetari suplimentare. Memoria principala Structurile de date i blocurile de date brute sunt stocate temporar in memoria calculatorului inainte de a fi scrise pe dispozitiv. Este esenial ca memoria sa fie fiabila, deoarece chiar i simple inversari de bii pot avea consecine grave i pot duce la deteriorarea structurilor, nu doar in sistemul de fiiere, ci in intregul sistem de operare. Pe baza experienei comunitaii, inversarile de bii din memorie sunt mai frecvente decat s-ar crede. Cand se intampla acest lucru, se manifesta prin erori semnalate de programul de verificare a arborelui sau prin neconcordane ale sumelor de control dupa citirea blocurilor. Exista cateva cazuri foarte evidente de inversari de bii, de exemplu intr-o secvena ordonata de chei din blocurile de metadate. Putem deduce cu uurina din celelalte date ce valori sunt afectate i cum. Totui, remedierea acestui lucru nu este simpla i ar necesita o referina incruciata a datelor din intregul sistem de fiiere pentru a vedea amploarea problemei. Daca este disponibila, memoria ECC ar trebui sa reduca riscul de inversare a biilor, dar acest tip de memorie nu este disponibil in toate cazurile. Ar trebui efectuat un test de memorie in cazul in care exista un model vizibil de inversare de bii, dei este posibil ca acesta sa nu detecteze un modul de memorie defect, deoarece incarcarea reala a sistemului ar putea fi factorul care determina apariia problemelor. In ultimii ani au fost demonstrate atacuri asupra modului de funcionare a modulelor de memorie (rowhammer) care au reuit sa inverseze bii specifici. Dei acestea au fost intite, acest lucru arata ca o serie de operaii de citire sau scriere pot afecta pari ale memoriei care nu au legatura intre ele. Profilurile grupurilor de blocuri cu redundana (cum ar fi RAID1) nu protejeaza impotriva erorilor de memorie, deoarece blocurile sunt mai intai stocate in memorie inainte de a fi scrise pe dispozitive din aceeai sursa. Un sistem de fiiere montat in mod ,,doar-citire" nu va afecta dispozitivul de blocuri subiacent in aproape 100% din cazuri (cu excepii extrem de puin probabile). Excepia o constituie jurnalul arborescent care trebuie rulat in timpul montarii (i inainte ca montarea in mod ,,doar-citire" sa aiba loc); pentru aceasta este necesara memoria de lucru, care poate fi afectata de inversari de bii. Exista un caz teoretic in care o inversare de bii schimba starea sistemului de fiiere din ,,doar-citire" in ,,citire-scriere". Lecturi suplimentare: o o overclocking-ul memoriei, XMP, riscuri poteniale Ce trebuie facut: o rulai memtest, reinei ca uneori erorile de memorie apar numai atunci cand sistemul este supus unei sarcini mari, pe care memtest-ul implicit nu o poate declana o erorile de memorie pot aparea ca sistem de fiiere care devine numai pentru citire din cauza verificarii ,,pre-scriere", care verifica metadatele inainte ca acestea sa fie scrise, dar eueaza la unele verificari de consistena de baza o sistemele nou construite ar trebui testate inainte de a fi utilizate in producie, in mod ideal pornind o sarcina IO/CPU care va fi rulata ulterior pe un astfel de sistem; mai precis sistemele care vor utiliza overclocking sau caracteristici speciale de performana Acces direct la memorie (DMA) O alta categorie de erori este legata de DMA (direct memory access -- acces direct la memorie) efectuat de controlorii de dispozitive. Dei acest lucru ar putea fi considerat o eroare de software, transferurile de date care au loc fara intervenia procesorului pot corupe accidental alte pagini. Dispozitivele de stocare utilizeaza DMA din motive de performana; structurile sistemului de fiiere i paginile de date sunt transmise in ambele sensuri, ceea ce face posibile apariia erorilor in cazul in care durata de viaa a paginilor nu este monitorizata corespunzator. Exista multe particularitai (soluii specifice dispozitivelor) in controlorii nucleului Linux (nu numai in ceea ce privete DMA) care sunt adaugate atunci cand sunt descoperite. Particularitaile pot evita anumite erori sau pot dezactiva unele funcii pentru a evita probleme mai grave. Ce trebuie facut: o utilizai un nucleu actualizat (versiuni recente sau versiuni cu suport pe termen lung) o deoarece acest lucru poate fi cauzat de controlori defectuoi, meninei sistemele actualizate Discuri rotative (HDD) Discurile dure rotative (HDD) se defecteaza de obicei la nivelul sectoarelor individuale sau al grupurilor mici de sectoare. Erorile de citire sunt detectate la nivelurile inferioare sistemului de fiiere i sunt afiate utilizatorului sub forma EIO - Eroare de intrare/ieire. Citirea repetata a blocurilor poate duce in cele din urma la recuperarea datelor, dar aceasta operaie este mai bine realizata de instrumente specializate, iar sistemul de fiiere preia rezultatul de la nivelurile inferioare. Rescrierea sectoarelor poate declana o recartografiere interna, dar acest lucru duce inevitabil la pierderea datelor. Firmware-ul discului este, din punct de vedere tehnic, un program, dar din perspectiva sistemului de fiiere face parte din componentele hardware. Se proceseaza cererile de In/Ie i se efectueaza operaii de stocare in cache sau diverse alte optimizari, ceea ce poate duce la apariia unor erori in condiii de incarcare intensa, in situaii fizice neprevazute sau in cazuri de utilizare neacceptate. Discurile sunt conectate prin cabluri cu doua capete, ambele putand cauza probleme daca nu sunt conectate corespunzator. Transferurile de date sunt protejate prin sume de control, iar straturile inferioare fac tot posibilul sa transfere datele corect sau deloc. Erorile cauzate de cablurile conectate necorespunzator se pot manifesta sub forma unui numar mare de cereri de citire sau scriere euate sau sub forma unor scurte rafale de erori, in funcie de condiiile fizice. Ce trebuie facut: o rulai smartctl pentru a identifica potenialele probleme Unitai de stocare in stare solida (,,Solid state drives": SSD) Mecanismul de stocare a informaiilor difera de cel al HDD-urilor, iar acest lucru influeneaza i modul de defectare. Datele sunt stocate in celule grupate in blocuri mari, cu un numar limitat de reiniializari i alte restricii de scriere. Firmware-ul incearca sa evite reiniializarile inutile i efectueaza optimizari pentru a maximiza durata de viaa a suportului de stocare. Tehnicile cunoscute sunt de-duplicarea (blocurile cu aceeai amprenta/hash sunt asociate aceluiai bloc fizic), compresia sau realocarea interna i colectarea deeurilor din celulele de memorie utilizate. Datorita procesarii suplimentare, exista masuri de verificare a datelor, de exemplu prin coduri ECC. Observaiile privind SSD-urile defecte arata ca intregul sistem electronic se defecteaza brusc sau afecteaza o cantitate mare de date (de exemplu, stocate pe un singur cip). Recuperarea acestor date poate necesita echipamente specializate, iar citirea repetata a datelor nu ajuta, aa cum se intampla in cazul HDD-urilor. Exista mai multe tipuri de celule de memorie, cu caracteristici i preuri diferite. Durata de viaa este influenata direct de tipul i frecvena datelor scrise. Scrierea unui volum ,,prea mare" de date distincte (de exemplu, date criptate) poate face ca de-duplicarea interna sa devina ineficienta i poate duce la numeroase rescrieri i la o uzura sporita a celulelor de memorie. Exista mai multe tehnologii i producatori, astfel incat este dificil sa le descriem, dar unele dintre ele prezinta un comportament similar: o SSD-urile scumpe utilizeaza celule de memorie mai durabile i sunt optimizate pentru fiabilitate i sarcina mare o SSD-urile ieftine sunt proiectate pentru o incarcare mai mica (,,utilizatori casnici") i sunt optimizate din punct de vedere al costurilor, putand utiliza optimizarile i/sau raportarea extinsa a erorilor parial sau deloc Nu este posibil sa se determine in mod fiabil durata de viaa preconizata a unui SSD din cauza lipsei de informaii despre modul in care funcioneaza sau din cauza lipsei de statistici fiabile furnizate de dispozitiv. Scrierile de metadate tind sa fie cea mai mare componenta a scrierilor pe durata de viaa a unui SSD, astfel incat reducerea acestora are o anumita valoare. In funcie de clasa dispozitivului (high end/low end), caracteristici precum profilurile grupurilor de blocuri DUP pot afecta fiabilitatea in ambele sensuri: o high end sunt de obicei mai fiabile, iar utilizarea single pentru date i metadate ar putea fi potrivita pentru a reduce uzura dispozitivului o low end ar putea sa nu aiba capacitatea de a identifica erorile, astfel incat o redundana suplimentara la nivel de sistem de fiiere (sumele de control, DUP) ar putea fi de ajutor Doar utilizatorii care consuma intre 50 i 100% din capacitatea reala de scriere pe durata de viaa a SSD-ului trebuie sa fie preocupai de amplificarea scrierilor generata de metadatele DUP ale sistemului de fiiere btrfs. Majoritatea utilizatorilor se vor situa cu mult sub 50% din aceasta capacitate, sau vor scrie pe unitate pana la epuizarea acesteia i vor descoperi cat de multe operaii de scriere reprezinta 100% din capacitatea reala. Firmware-ul SSD adauga adesea proprii multiplicatori de scriere, care pot fi arbitrari i imprevizibili i depind de comportamentul aplicaiei, iar acetia vor avea, de obicei, un efect mult mai mare asupra duratei de viaa a SSD-ului decat metadatele DUP. Este mai mult sau mai puin imposibil sa se prevada cand un SSD va epuiza capacitatea de scriere pe durata de viaa cu o marja de eroare de maximum doua ori, aa ca este greu sa se justifice reducerea uzurii ca un beneficiu. Lecturi suplimentare: o o o o Ce trebuie facut: o rulai smartctl sau autotestele pentru a identifica potenialele probleme o meninei firmware-ul actualizat Memorie expresa nevolatila NVM (NVMe) NVMe este un tip de memorie persistenta conectata de obicei printr-un magistrala de sistem (PCIe) sau o interfaa similara, iar vitezele sale sunt cu un ordin de marime mai mari decat cele ale SSD-urilor. De asemenea, este un tip de stocare fara piese rotative i, de obicei, nu se conecteaza prin cablu. Nu este nici un dispozitiv de tip SCSI, ci mai degraba o specificaie completa pentru interfaa dispozitivelor logice. Intr-un fel, erorile pot fi comparate cu o combinaie intre clasa SSD i memoria obinuita. Erorile pot aparea sub forma de inversari aleatoare de bii sau erori de In/Ie. Exista instrumente pentru accesarea jurnalului intern (nvme log i nvme-cli) pentru o analiza mai detaliata. Exista etape separate de detectare i corectare a erorilor, efectuate, de exemplu, la nivelul magistralei, iar in majoritatea cazurilor acestea nu ajung niciodata la nivelul sistemului de fiiere. Daca se intampla acest lucru, ar putea insemna ca exista o eroare sistematica, cum ar fi supraincalzirea sau o conexiune fizica defectuoasa a dispozitivului. Va recomandam sa rulai auto-testele (folosind comanda smartctl). o o Firmware pentru unitate Din punct de vedere tehnic, firmware-ul este tot un tip de software, dar integrat in hardware. La fel ca orice software, i firmware-ul poate conine erori. Dispozitivele de stocare pot actualiza firmware-ul i remedia erorile cunoscute. In unele cazuri, este posibil sa se evite anumite erori prin utilizarea unor soluii de compromis (soluii specifice dispozitivului) in nucleul Linux. Un firmware defectuos poate provoca o gama larga de corupii, de la cele mici i localizate pana la cele mari, care afecteaza o mulime de date. Capacitaile de autoreparare pot fi insuficiente. Ce trebuie facut: o verificai daca exista actualizari de firmware in cazul in care exista probleme cunoscute; reinei ca actualizarea firmware-ului poate fi riscanta in sine o utilizai un nucleu actualizat (versiuni recente sau versiuni cu suport pe termen lung) Carduri flash SD Exista numeroase dispozitive cu consum redus de energie, care utilizeaza, prin urmare, suporturi de stocare cu consum redus de energie, de obicei memorie flash stocata pe un cip incorporat intr-o carcasa detaabila sub forma de card. Un card introdus incorect poate fi deteriorat de varfuri de tensiune atunci cand dispozitivul este pornit sau oprit. La randul lor, cipurile care stocheaza datele pot fi deteriorate permanent. Toate tipurile de memorie flash au un numar limitat de rescrieri, astfel incat datele sunt traduse intern de FTL (flash translation layer). Acest lucru este implementat in firmware (din punct de vedere tehnic, un software) i este predispus la erori care se manifesta ca erori hardware. Adaugarea de redundana, cum ar fi utilizarea profilurilor DUP atat pentru date, cat i pentru metadate, poate fi utila in unele cazuri, dar o copie de rezerva completa ar putea fi cea mai buna opiune odata ce apar probleme, iar inlocuirea cardului ar putea fi, de asemenea, necesara. Hardware-ul ca sursa principala a corupiei sistemului de fiiere Daca utilizai hardware nesigur i nu tii acest lucru, nu dai vina pe sistemul de fiiere cand va avertizeaza. CONSULTAI I acl(5) , btrfs(8) <>, chattr(1) , fstrim(8) , ioctl(2) , btrfs-ioctl(2) <>, mkfs.btrfs(8) <>, mount(8) , swapon(8) 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 . 7.0 9 mai 2026 BTRFS(5)