CGroups
Reading time: 5 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne Informacije
Linux kontrolne grupe, ili cgroups, su funkcija Linux jezgra koja omogućava dodeljivanje, ograničavanje i prioritetizaciju sistemskih resursa kao što su CPU, memorija i disk I/O među grupama procesa. One nude mehanizam za upravljanje i izolaciju korišćenja resursa kolekcija procesa, što je korisno za svrhe kao što su ograničenje resursa, izolacija radnog opterećenja i prioritetizacija resursa među različitim grupama procesa.
Postoje dve verzije cgroups: verzija 1 i verzija 2. Obe se mogu koristiti istovremeno na sistemu. Primarna razlika je u tome što cgroups verzija 2 uvodi hijerarhijsku, stablo-sličnu strukturu, omogućavajući suptilniju i detaljniju distribuciju resursa među grupama procesa. Pored toga, verzija 2 donosi razne poboljšanja, uključujući:
Pored nove hijerarhijske organizacije, cgroups verzija 2 takođe je uvela nekoliko drugih promena i poboljšanja, kao što su podrška za nove kontrolere resursa, bolja podrška za nasleđene aplikacije i poboljšane performanse.
Sve u svemu, cgroups verzija 2 nudi više funkcija i bolje performanse od verzije 1, ali se potonja može i dalje koristiti u određenim scenarijima gde je kompatibilnost sa starijim sistemima važna.
Možete navesti v1 i v2 cgroups za bilo koji proces gledajući njegov cgroup fajl u /proc/<pid>. Možete početi tako što ćete pogledati cgroups vašeg shell-a sa ovom komandom:
$ cat /proc/self/cgroup
12:rdma:/
11:net_cls,net_prio:/
10:perf_event:/
9:cpuset:/
8:cpu,cpuacct:/user.slice
7:blkio:/user.slice
6:memory:/user.slice 5:pids:/user.slice/user-1000.slice/session-2.scope 4:devices:/user.slice
3:freezer:/
2:hugetlb:/testcgroup
1:name=systemd:/user.slice/user-1000.slice/session-2.scope
0::/user.slice/user-1000.slice/session-2.scope
- Brojevi 2–12: cgroups v1, pri čemu svaka linija predstavlja različiti cgroup. Kontroleri za njih su navedeni pored broja.
- Broj 1: Takođe cgroups v1, ali isključivo za upravljačke svrhe (postavlja, npr., systemd), i nema kontroler.
- Broj 0: Predstavlja cgroups v2. Nema navedene kontrolere, a ova linija je ekskluzivna na sistemima koji koriste samo cgroups v2.
- Imena su hijerarhijska, podsećajući na putanje fajlova, što ukazuje na strukturu i odnos između različitih cgroups.
- Imena kao što su /user.slice ili /system.slice specificiraju kategorizaciju cgroups, pri čemu user.slice obično služi za sesije prijavljivanja koje upravlja systemd, a system.slice za sistemske usluge.
Pregled cgroups
Datotečni sistem se obično koristi za pristup cgroups, odstupajući od Unix sistemskog poziva koji se tradicionalno koristi za interakciju sa kernelom. Da bi se istražila cgroup konfiguracija shelle, treba ispitati /proc/self/cgroup fajl, koji otkriva cgroup shelle. Zatim, navigacijom do /sys/fs/cgroup (ili /sys/fs/cgroup/unified
) direktorijuma i pronalaženjem direktorijuma koji deli ime cgroup-a, može se posmatrati razne postavke i informacije o korišćenju resursa relevantne za cgroup.
Ključni interfejs fajlovi za cgroups su prefiksirani sa cgroup. Fajl cgroup.procs, koji se može pregledati standardnim komandama kao što je cat, navodi procese unutar cgroup-a. Drugi fajl, cgroup.threads, uključuje informacije o nitima.
Cgroups koje upravljaju shellovima obično obuhvataju dva kontrolera koja regulišu korišćenje memorije i broj procesa. Da bi se interagovalo sa kontrolerom, treba konsultovati fajlove sa prefiksom kontrolera. Na primer, pids.current bi se referisao da bi se utvrdio broj niti u cgroup-u.
Naznaka max u vrednosti sugeriše odsustvo specifičnog limita za cgroup. Međutim, zbog hijerarhijske prirode cgroups, limiti mogu biti nametnuti od strane cgroup-a na nižem nivou u hijerarhiji direktorijuma.
Manipulacija i kreiranje cgroups
Procesi se dodeljuju cgroups pisanjem njihovog ID-a procesa (PID) u cgroup.procs
fajl. Ovo zahteva root privilegije. Na primer, da bi se dodao proces:
echo [pid] > cgroup.procs
Slično, modifikovanje cgroup atributa, kao što je postavljanje limita za PID, se vrši pisanjem željene vrednosti u odgovarajući fajl. Da biste postavili maksimum od 3.000 PID-ova za cgroup:
echo 3000 > pids.max
Kreiranje novih cgroups podrazumeva pravljenje nove poddirektorijuma unutar hijerarhije cgroup, što pokreće kernel da automatski generiše potrebne interfejsne datoteke. Iako se cgroups bez aktivnih procesa mogu ukloniti pomoću rmdir
, budite svesni određenih ograničenja:
- Procesi se mogu postaviti samo u leaf cgroups (tj. najdublje u hijerarhiji).
- Cgroup ne može imati kontroler koji nije prisutan u svom roditelju.
- Kontroleri za child cgroups moraju biti eksplicitno deklarisani u datoteci
cgroup.subtree_control
. Na primer, da biste omogućili CPU i PID kontrolere u child cgroup:
echo "+cpu +pids" > cgroup.subtree_control
root cgroup je izuzetak od ovih pravila, omogućavajući direktno postavljanje procesa. Ovo se može koristiti za uklanjanje procesa iz systemd upravljanja.
Praćenje korišćenja CPU-a unutar cgroup-a je moguće kroz cpu.stat
datoteku, koja prikazuje ukupno vreme CPU-a koje je potrošeno, što je korisno za praćenje korišćenja kroz podprocese servisa:
.png)
Statistika korišćenja CPU-a kako je prikazano u cpu.stat datoteci
References
- Book: How Linux Works, 3rd Edition: What Every Superuser Should Know By Brian Ward
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.