CGroups

Вивчайте та практикуйте взлом AWS: Школа взлому AWS для Червоної Команди (ARTE) Вивчайте та практикуйте взлом GCP: Школа взлому GCP для Червоної Команди (GRTE)

Підтримайте 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.

Файлова система Cgroup

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

Cgroup Procs

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

Пам'ять 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 не може мати контролера, відсутнього у його батька.

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

echo "+cpu +pids" > cgroup.subtree_control

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

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

Статистика використання ЦП, як показано в файлі cpu.stat

References

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

Last updated