cgroup_namespaces(7) Miscellaneous Information Manual cgroup_namespaces(7) NUME cgroup_namespaces - prezentare generala a spaiilor de nume cgroup din Linux DESCRIERE Pentru o descriere generala a spaiilor de nume, consultai namespaces(7). Spaiile de nume cgroup virtualizeaza vizualizarea grupurilor cgroup ale unui proces (a se vedea cgroups(7)), aa cum sunt vazute prin intermediul fiierelor /proc/pid/cgroup i /proc/pid/mountinfo. Fiecare spaiu de nume cgroup are propriul set de directoare radacina cgroup. Aceste directoare radacina sunt punctele de baza pentru locaiile relative afiate in inregistrarile corespunzatoare din fiierul /proc/pid/cgroup. Atunci cand un proces creeaza un nou spaiu de nume cgroup folosind clone(2) sau unshare(2) cu fanionul CLONE_NEWCGROUP, directoarele sale cgroups curente devin directoarele radacina cgroup ale noului spaiu de nume; (acest lucru se aplica atat pentru ierarhiile cgroups versiunea 1, cat i pentru ierarhia unificata cgroups versiunea 2). Atunci cand se citesc membrii cgroup ai unui proces "inta" din /proc/pid/cgroup, numele rutei afiat in al treilea camp al fiecarei inregistrari va fi relativ la directorul radacina al procesului de citire pentru ierarhia cgroup corespunzatoare. In cazul in care directorul cgroup al procesului inta se afla in afara directorului radacina al spaiului de nume cgroup al procesului de citire, atunci numele rutei va afia intrari ../ pentru fiecare nivel antecesor in ierarhia cgroup. Urmatoarea sesiune shell demonstreaza efectul crearii unui nou spaiu de nume cgroup. In primul rand, (ca super-utilizator), intr-un shell din spaiul de nume cgroup iniial, cream un cgroup copil in ierarhia freezer i plasam un proces in acel cgroup pe care il vom folosi ca parte a demonstraiei de mai jos: # mkdir -p /sys/fs/cgroup/freezer/sub2 # sleep 10000 & # Creeaza un proces care exista o perioada de timp [1] 20124 # echo 20124 > /sys/fs/cgroup/freezer/sub2/cgroup.procs Apoi cream un alt cgroup copil in ierarhia freezer i punem shell-ul in acel cgroup: # mkdir -p /sys/fs/cgroup/freezer/sub # echo $$ # Afieaza PID-ul acestui shell 30655 # echo 30655 > /sys/fs/cgroup/freezer/sub/cgroup.procs # cat /proc/self/cgroup | grep freezer 7:freezer:/sub In continuare, folosim unshare(1) pentru a crea un proces care ruleaza un nou shell in noile spaii de nume cgroup i mount: # PS1="sh2# " unshare -Cm bash Din noul shell pornit de unshare(1), inspectam apoi fiierele /proc/pid/cgroup ale noului shell, respectiv ale unui proces care se afla in spaiul de nume cgroup iniial (init, cu PID 1) i ale procesului din cgroup-ul frate (sub2): sh2# cat /proc/self/cgroup | grep freezer 7:freezer:/ sh2# cat /proc/1/cgroup | grep freezer 7:freezer:/.. sh2# cat /proc/20124/cgroup | grep freezer 7:freezer:/../sub2 Din ieirea primei comenzi, vedem ca apartenena la freezer cgroup a noului shell (care se afla in acelai cgroup ca i shell-ul iniial) este afiata definita in raport cu directorul radacina al freezer cgroup care a fost stabilit atunci cand a fost creat noul spaiu de nume cgroup; (in termeni absolui, noul shell se afla in cgroup-ul freezer /sub, iar directorul radacina al ierarhiei freezer cgroup din noul spaiu de nume cgroup este, de asemenea, /sub. Astfel, apartenena la cgroup a noului shell este afiata ca ,,/"). Cu toate acestea, cand ne uitam in /proc/self/mountinfo vedem urmatoarea anomalie: sh2# cat /proc/self/mountinfo | grep freezer 155 145 0:32 /.. /sys/fs/cgroup/freezer ... Al patrulea camp al acestei linii (/..) trebuie sa arate directorul din sistemul de fiiere cgroup care formeaza radacina acestei montari. Deoarece, prin definiia spaiilor de nume cgroup, directorul cgroup freezer curent al procesului a devenit directorul cgroup freezer radacina al acestuia, ar trebui sa vedem ,,/" in acest camp. Problema aici este ca vedem o intrare de montare pentru sistemul de fiiere cgroup corespunzator spaiului de nume cgroup iniial (al carui sistem de fiiere cgroup este intr-adevar inradacinat in directorul parinte al lui sub). Pentru a remedia aceasta problema, trebuie sa montam din nou sistemul de fiiere cgroup freezer din noul shell (adica sa efectuam montarea dintr-un proces care se afla in noul spaiu de nume cgroup), dupa care vedem rezultatele ateptate: sh2# mount --make-rslave / # Nu propaga evenimentele de montare # in alte spaii de nume sh2# umount /sys/fs/cgroup/freezer sh2# mount -t cgroup -o freezer freezer /sys/fs/cgroup/freezer sh2# cat /proc/self/mountinfo | grep freezer 155 145 0:32 / /sys/fs/cgroup/freezer rw,relatime ... STANDARDE Linux. NOTE Utilizarea spaiilor de nume cgroup necesita un nucleu care sa fie configurat cu opiunea CONFIG_CGROUPS. Virtualizarea oferita de spaiile de nume cgroup servete mai multor scopuri: o Aceasta previne scurgerile de informaii prin care rutele directoarelor cgroup din afara unui container ar fi altfel vizibile pentru procesele din container. Astfel de scurgeri de informaii ar putea, de exemplu, dezvalui informaii despre cadrul containerului pentru aplicaiile containerizate. o Aceasta uureaza sarcini precum migrarea containerelor. Virtualizarea oferita de spaiile de nume ale cgroup-urilor permite ca containerele sa fie izolate de cunoaterea numelor de ruta ale cgroup-urilor ancestrale. Fara o astfel de izolare, ar trebui ca numele complete ale rutelor cgroup-urilor (afiate in /proc/self/cgroups) sa fie reproduse pe sistemul inta atunci cand se migreaza un container; aceste nume de rute ar trebui, de asemenea, sa fie unice, astfel incat sa nu intre in conflict cu alte nume de rute de pe sistemul inta. o Aceasta permite o mai buna confinare a proceselor containerizate, deoarece este posibil sa se monteze sistemele de fiiere cgroup ale containerului astfel incat procesele containerului sa nu poata obine acces la directoarele cgroup ancestrale. Luai in considerare, de exemplu, urmatorul scenariu: o Avem un director cgroup, /cg/1, care este deinut de utilizatorul ID 9000. o Avem un proces, X, deinut de asemenea de utilizatorul ID 9000, care este plasat in spaiul de nume al cgroupului /cg/1/2 (adica X a fost plasat intr-un nou spaiu de nume de cgroup prin clone(2) sau unshare(2) cu indicatorul CLONE_NEWCGROUP). Daca cgroup-ul nu este pus intr-un spaiu de nume, deoarece directorul cgroup /cg/1 este deinut (i poate fi scris) de UID 9000 i procesul X este, de asemenea, deinut de ID-ul utilizatorului 9000, procesul X ar putea modifica coninutul fiierelor cgroups (adica ar putea schimba parametrii cgroup) nu numai in /cg/1/2, ci i in directorul cgroup ancestral /cg/1. Plasarea procesului X sub directorul cgroup /cg/1/2, in combinaie cu operaiile de montare adecvate pentru sistemul de fiiere cgroup (aa cum s-a aratat mai sus), il impiedica sa modifice fiierele din /cg/1, deoarece nu poate vedea nici macar coninutul acestui director (sau al directoarelor ancestrale cgroup mai indepartate). In combinaie cu aplicarea corecta a limitelor ierarhice, acest lucru impiedica procesul X sa scape de limitele impuse de cgroup-urile ancestrale. CONSULTAI I unshare(1), clone(2), setns(2), unshare(2), proc(5), cgroups(7), credentials(7), namespaces(7), user_namespaces(7) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 31 octombrie 2023 cgroup_namespaces(7)