CGroups

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Основна інформація

Керуючі групи Linux, або cgroups, є функцією ядра Linux, яка дозволяє розподіляти, обмежувати та пріоритизувати ресурси системи, такі як процесор, пам'ять та введення/виведення даних між групами процесів. Вони пропонують механізм для керування та ізоляції використання ресурсів колекцій процесів, корисний для таких цілей, як обмеження ресурсів, ізоляція навантаження та пріоритизація ресурсів між різними групами процесів.

Існують дві версії cgroups: версія 1 та версія 2. Обидві можуть використовуватися одночасно на системі. Основна відмінність полягає в тому, що версія cgroups 2 вводить ієрархічну структуру, схожу на дерево, що дозволяє більш детально розподіляти ресурси між групами процесів. Крім того, версія 2 вносить різні покращення, включаючи:

Крім нової ієрархічної організації, cgroups версії 2 також ввів кілька інших змін та покращень, таких як підтримка нових контролерів ресурсів, краща підтримка застарілих додатків та покращена продуктивність.

У цілому, cgroups версії 2 пропонує більше функцій та кращу продуктивність порівняно з версією 1, але останню все ще можна використовувати в певних сценаріях, де важлива сумісність зі старішими системами.

Ви можете переглянути cgroups v1 та v2 для будь-якого процесу, подивившись на його файл cgroup у /proc/<pid>. Ви можете почати з перегляду cgroups вашої оболонки за допомогою цієї команди:

$ 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

Структура виводу виглядає наступним чином:

  • Номери 2–12: cgroups v1, кожен рядок представляє різний cgroup. Контролери для них вказані поруч з номером.

  • Номер 1: Також cgroups v1, але використовується лише для управління (встановлено, наприклад, systemd) і не має контролера.

  • Номер 0: Представляє cgroups v2. Контролери не вказані, і цей рядок є ексклюзивним для систем, які працюють лише з cgroups v2.

  • Назви ієрархічні, нагадують шляхи до файлів, вказуючи на структуру та взаємозв'язок між різними cgroups.

  • Назви, такі як /user.slice або /system.slice, вказують на категоризацію cgroups, де user.slice зазвичай використовується для сеансів входу, керованих systemd, а system.slice - для системних служб.

Перегляд cgroups

Зазвичай для доступу до cgroups використовується файлова система, відхиляючись від інтерфейсу виклику системи Unix, який традиційно використовується для взаємодії з ядром. Для дослідження конфігурації cgroup оболонки слід переглянути файл /proc/self/cgroup, який показує cgroup оболонки. Потім, перейшовши до каталогу /sys/fs/cgroup (або /sys/fs/cgroup/unified), і знаходячи каталог, який має таку ж назву, як cgroup, можна спостерігати різні налаштування та інформацію про використання ресурсів, що стосуються cgroup.

Ключові файли інтерфейсу для cgroups починаються з cgroup. Файл cgroup.procs, який можна переглянути за допомогою стандартних команд, таких як cat, містить перелік процесів у cgroup. Інший файл, cgroup.threads, включає інформацію про потоки.

Cgroups, які керують оболонками, зазвичай включають два контролера, які регулюють використання пам'яті та кількість процесів. Для взаємодії з контролером слід переглянути файли, які мають префікс контролера. Наприклад, pids.current слід переглянути, щоб визначити кількість потоків у cgroup.

Позначення max у значенні вказує на відсутність конкретного обмеження для cgroup. Однак через ієрархічний характер cgroups, обмеження можуть бути накладені cgroup на нижчому рівні в ієрархії каталогів.

Маніпулювання та створення cgroups

Процеси призначаються cgroups шляхом запису їх ідентифікатора процесу (PID) у файл cgroup.procs. Це вимагає привілеїв root. Наприклад, щоб додати процес:

echo [pid] > cgroup.procs

Аналогічно, зміна атрибутів cgroup, таких як встановлення обмеження PID, виконується шляхом запису бажаного значення у відповідний файл. Щоб встановити максимум 3,000 PID для cgroup:

echo 3000 > pids.max

Створення нових cgroups включає створення нової піддиректорії в ієрархії cgroup, що спонукає ядро автоматично генерувати необхідні інтерфейсні файли. Хоча cgroups без активних процесів можна видалити за допомогою rmdir, слід пам'ятати про певні обмеження:

  • Процеси можуть бути розміщені лише в листових cgroups (тобто найбільш вкладених в ієрархії).

  • Cgroup не може мати контролера, відсутнього в його батьківському cgroup.

  • Контролери для дочірніх cgroups повинні бути явно вказані в файлі cgroup.subtree_control. Наприклад, щоб увімкнути контролери CPU та PID в дочірньому cgroup:

echo "+cpu +pids" > cgroup.subtree_control

Коренева cgroup є винятком з цих правил, що дозволяє пряме розміщення процесів. Це можна використовувати для видалення процесів з управління systemd.

Моніторинг використання ЦП в межах cgroup можливий за допомогою файлу cpu.stat, який відображає загальний час ЦП, витрачений на процес, корисний для відстеження використання у підпроцесах служби:

Посилання

  • Книга: Як працює Linux, 3-є видання: Що кожен суперкористувач повинен знати Браяна Ворда

Last updated