oracular (7) cgroup_namespaces.7.gz

Provided by: manpages-ro_4.23.1-1_all bug

NUME

       cgroup_namespaces - prezentare generală a spațiilor de nume cgroup din Linux

DESCRIERE

       Pentru o descriere generală a spațiilor de nume, consultați namespaces(7).

       Spațiile  de  nume  cgroup  virtualizează  vizualizarea  grupurilor  cgroup  ale  unui proces (a se vedea
       cgroups(7)), așa cum sunt văzute prin intermediul fișierelor /proc/pid/cgroup și /proc/pid/mountinfo.

       Fiecare spațiu de nume cgroup are propriul set de directoare rădăcină cgroup. Aceste directoare  rădăcină
       sunt  punctele  de  bază pentru locațiile relative afișate în înregistrările corespunzătoare din fișierul
       /proc/pid/cgroup. Atunci când un proces creează un nou  spațiu  de  nume  cgroup  folosind  clone(2)  sau
       unshare(2)  cu  fanionul  CLONE_NEWCGROUP,  directoarele sale cgroups curente devin directoarele rădăcină
       cgroup ale noului spațiu de nume; (acest lucru se aplică atât pentru ierarhiile cgroups versiunea 1,  cât
       și pentru ierarhia unificată cgroups versiunea 2).

       Atunci  când se citesc membrii cgroup ai unui proces "țintă" din /proc/pid/cgroup, numele rutei afișat în
       al treilea câmp al fiecărei înregistrări va fi relativ la directorul rădăcină  al  procesului  de  citire
       pentru ierarhia cgroup corespunzătoare. În cazul în care directorul cgroup al procesului țintă se află în
       afara directorului rădăcină al spațiului de nume cgroup al procesului de citire, atunci numele  rutei  va
       afișa intrări ../ pentru fiecare nivel antecesor în ierarhia cgroup.

       Următoarea sesiune shell demonstrează efectul creării unui nou spațiu de nume cgroup.

       În  primul rând, (ca super-utilizator), într-un shell din spațiul de nume cgroup inițial, creăm un cgroup
       copil în ierarhia freezer și plasăm un  proces  în  acel  cgroup  pe  care  îl  vom  folosi  ca  parte  a
       demonstrației de mai jos:

           # mkdir -p /sys/fs/cgroup/freezer/sub2
           # sleep 10000 &     # Creează un proces care există o perioadă de timp
           [1] 20124
           # echo 20124 > /sys/fs/cgroup/freezer/sub2/cgroup.procs

       Apoi creăm un alt cgroup copil în ierarhia freezer și punem shell-ul în acel cgroup:

           # mkdir -p /sys/fs/cgroup/freezer/sub
           # echo $$                      # Afișează PID-ul acestui shell
           30655
           # echo 30655 > /sys/fs/cgroup/freezer/sub/cgroup.procs
           # cat /proc/self/cgroup | grep freezer
           7:freezer:/sub

       În  continuare,  folosim  unshare(1) pentru a crea un proces care rulează un nou shell în noile spații de
       nume cgroup și mount:

           # PS1="sh2# " unshare -Cm bash

       Din noul shell pornit  de  unshare(1),  inspectăm  apoi  fișierele  /proc/pid/cgroup  ale  noului  shell,
       respectiv  ale  unui  proces  care  se  află  în  spațiul  de nume cgroup inițial (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 ieșirea primei comenzi, vedem că apartenența la freezer cgroup  a  noului  shell  (care  se  află  în
       același  cgroup ca și shell-ul inițial) este afișată definită în raport cu directorul rădăcină al freezer
       cgroup care a fost stabilit atunci când a fost creat noul spațiu de nume cgroup;  (în  termeni  absoluți,
       noul  shell  se  află  în cgroup-ul freezer /sub, iar directorul rădăcină al ierarhiei freezer cgroup din
       noul spațiu de nume cgroup este, de asemenea, /sub. Astfel, apartenența la cgroup  a  noului  shell  este
       afișată ca „/”).

       Cu toate acestea, când ne uităm în /proc/self/mountinfo vedem următoarea anomalie:

           sh2# cat /proc/self/mountinfo | grep freezer
           155 145 0:32 /.. /sys/fs/cgroup/freezer ...

       Al  patrulea  câmp al acestei linii (/..) trebuie să arate directorul din sistemul de fișiere cgroup care
       formează rădăcina acestei montări. Deoarece, prin definiția spațiilor de nume cgroup,  directorul  cgroup
       freezer curent al procesului a devenit directorul cgroup freezer rădăcină al acestuia, ar trebui să vedem
       „/” în acest câmp. Problema aici este că vedem o intrare de montare pentru  sistemul  de  fișiere  cgroup
       corespunzător  spațiului  de  nume  cgroup  inițial  (al  cărui sistem de fișiere cgroup este într-adevăr
       înrădăcinat în directorul părinte al lui sub). Pentru a remedia această problemă, trebuie să  montăm  din
       nou sistemul de fișiere cgroup freezer din noul shell (adică să efectuăm montarea dintr-un proces care se
       află în noul spațiu de nume cgroup), după care vedem rezultatele așteptate:

           sh2# mount --make-rslave /     # Nu propagă evenimentele de montare
                                          # în alte spații 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 spațiilor de nume cgroup necesită un nucleu care să fie configurat cu opțiunea CONFIG_CGROUPS.

       Virtualizarea oferită de spațiile de nume cgroup servește mai multor scopuri:

       •  Aceasta previne scurgerile de  informații  prin  care  rutele  directoarelor  cgroup  din  afara  unui
          container  ar  fi altfel vizibile pentru procesele din container.  Astfel de scurgeri de informații ar
          putea, de exemplu, dezvălui informații despre cadrul containerului pentru aplicațiile containerizate.

       •  Aceasta ușurează sarcini precum migrarea containerelor. Virtualizarea oferită de spațiile de nume  ale
          cgroup-urilor  permite ca containerele să fie izolate de cunoașterea numelor de rută ale cgroup-urilor
          ancestrale. Fără o astfel de izolare, ar trebui ca numele complete ale rutelor cgroup-urilor  (afișate
          în /proc/self/cgroups) să fie reproduse pe sistemul țintă atunci când se migrează un container; aceste
          nume de rute ar trebui, de asemenea, să fie unice, astfel încât să nu intre în conflict cu  alte  nume
          de rute de pe sistemul țintă.

       •  Aceasta  permite o mai bună confinare a proceselor containerizate, deoarece este posibil să se monteze
          sistemele de fișiere cgroup ale containerului astfel încât procesele containerului să nu poată  obține
          acces la directoarele cgroup ancestrale. Luați în considerare, de exemplu, următorul scenariu:

          •  Avem un director cgroup, /cg/1, care este deținut de utilizatorul ID 9000.

          •  Avem un proces, X, deținut de asemenea de utilizatorul ID 9000, care este plasat în spațiul de nume
             al cgroupului /cg/1/2 (adică X a fost plasat într-un nou spațiu de nume de cgroup prin clone(2) sau
             unshare(2) cu indicatorul CLONE_NEWCGROUP).

          Dacă  cgroup-ul  nu este pus într-un spațiu de nume, deoarece directorul cgroup /cg/1 este deținut (și
          poate fi scris) de UID 9000 și procesul X este, de asemenea, deținut  de  ID-ul  utilizatorului  9000,
          procesul  X ar putea modifica conținutul fișierelor cgroups (adică ar putea schimba parametrii cgroup)
          nu numai în /cg/1/2, ci și în directorul cgroup ancestral /cg/1. Plasarea procesului X sub  directorul
          cgroup /cg/1/2, în combinație cu operațiile de montare adecvate pentru sistemul de fișiere cgroup (așa
          cum s-a arătat mai sus), îl împiedică să modifice fișierele din /cg/1, deoarece nu  poate  vedea  nici
          măcar  conținutul  acestui  director  (sau  al  directoarelor  ancestrale  cgroup mai îndepărtate). În
          combinație cu aplicarea corectă a limitelor ierarhice, acest lucru împiedică procesul X  să  scape  de
          limitele impuse de cgroup-urile ancestrale.

CONSULTAȚI ȘI

       unshare(1),   clone(2),   setns(2),   unshare(2),  proc(5),  cgroups(7),  credentials(7),  namespaces(7),
       user_namespaces(7)

TRADUCERE

       Traducerea   în   limba   română   a   acestui   manual   a   fost   făcută   de   Remus-Gabriel    Chelu
       <remusgabriel.chelu@disroot.org>

       Această   traducere  este  documentație  gratuită;  citiți  Licența  publică  generală  GNU  Versiunea  3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ sau o versiune ulterioară  cu  privire  la  condiții  privind
       drepturile de autor.  NU se asumă NICIO RESPONSABILITATE.

       Dacă  găsiți  erori  în  traducerea acestui manual, vă rugăm să trimiteți un e-mail la ⟨translation-team-
       ro@lists.sourceforge.net⟩.