Вопрос или проблема
Кто-нибудь может показать, как запустить cgcreate
без привилегий под cgroups v2 с монтированием nsdelegate
(как по умолчанию в Ubuntu 24.04.1 LTS)?
$ mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
Systemd может создать новый cgroup без привилегий:
$ systemd-run --scope --user --shell --property=Delegate=true
Running as unit: run-rcd6d59c10941413faa58a2f762c3fde1.scope; invocation ID: c2ae9d32475d42db987f2ed148729473
$ echo $$
31634
$ cat /proc/$$/cgroup
0::/user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope
Я могу включить pids
в своём текущем cgroup:
$ cgset -r cgroup.subtree_control=+pids user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope
$ cgget -n -v -r cgroup.subtree_control user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope
pids
Я могу поместить процессы в текущий cgroup:
$ sleep 999 &
[1] 31811
$ cgclassify -g pids:user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope 31811
$ cgget -n -v -r cgroup.procs user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope
31634
31811
31824
Я не могу использовать cgcreate
для создания подгруппы в текущем cgroup:
$ cgcreate -g pids:user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope/foo
cgcreate: can't create cgroup user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope/foo: Cgroup, requested group parameter does not exist
Но я могу использовать mkdir
без проблем:
$ mkdir /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope/foo
$ cgget -n -v -r cgroup.controllers user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope/foo
pids
$ rmdir /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/app.slice/run-rcd6d59c10941413faa58a2f762c3fde1.scope/foo
Я не могу использовать cgcreate
для создания чего-либо на том же уровне, что и мой текущий cgroup:
$ cgcreate -g pids:user.slice/user-1000.slice/[email protected]/app.slice/run-my.scope
cgcreate: can't create cgroup user.slice/user-1000.slice/[email protected]/app.slice/run-my.scope: Cgroup, requested group parameter does not exist
Но mkdir
работает нормально:
$ mkdir /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/app.slice/run-my.scope
$ cgget -n -v -r cgroup.controllers user.slice/user-1000.slice/[email protected]/app.slice/run-my.scope
cpu memory pids
$ rmdir /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/app.slice/run-my.scope
Что я неверно понимаю в cgcreate
?
Ответ или решение
Cgroups (control groups) — это механизм ядра Linux, который позволяет администраторским процессам организовывать и управлять ресурсами программ и процессов. Cgroups V2 в частности предлагает улучшенную интеграцию и более гибкий контроль над процессами по сравнению с V1. Ваша проблема заключается в создании подгрупп в cgroups V2 с помощью инструмента cgcreate
без использования привилегированных прав. Следует учесть, как работает V2 и как особенности Ubuntu 24.04.1 LTS влияют на настройки.
Теория
Cgroups V2 существенно изменяет подход к управлению и иерархии групп. В отличие от V1, где можно было создавать отдельные иерархии для разных контроллеров (например, cpu, memory), в V2 все контроллеры включены в одну иерархию. Это упрощает управление, но может привести к некоторым ограничениям, если вы привыкли к V1.
В приведенной вами системе cgroup2 смонтирована с опцией nsdelegate
, что позволяет управлять cgroups в рамках пространств имен непривилегированными пользователями. Однако, важно понимать, что такие действия требуют определённых настроек и параметров, чтобы быть успешными.
Пример
-
Создание cgroup с помощью systemd-run:
Вы упоминали, что можете создавать группы через
systemd-run
. Это связано с тем, что systemd, как менеджер системных служб, имеет встроенные механизмы работы с cgroups и может обрабатывать их иерархию в V2. Используя командуsystemd-run
, вы можете запускать процессы в новой cgroup:systemd-run --scope --user --shell --property=Delegate=true
Команда создаёт новый scope в инстанции пользователя, делегирует управление cgroup и позволяет вам вручную изменять параметры.
-
Управление контроллерами и процессами в cgroup:
Используя команды вроде
cgset
иcgclassify
, вы можете изменять контроллеры и перемещать процессы между группами. Однако для успешного использованияcgcreate
могут потребоваться дополнительные разрешения или привилегии, которые не всегда предоставляются непривилегированному пользователю. -
Создание подгрупп с помощью mkdir:
Ваш пример показывает, что создание подкаталогов вручную с помощью
mkdir
работает, в отличие отcgcreate
. Данная команда просто создаёт новую директорию в иерархии cgroups, что является основным способом создания новых групп в V2:mkdir /sys/fs/cgroup/user.slice/user-1000.slice/.../foo
Это подтверждает, что cgroups V2 поддерживает создание иерархий таким способом, когда проконтролированы права доступа.
Применение
Чтобы использовать cgcreate
в непривилегированном контексте, можно рассмотреть следующие подходы:
-
Корректировка прав доступа и настроек контроллера: Убедитесь, что необходимые контроллеры активированы для группы, в которой вы работаете. Используя
cgroup.subtree_control
, можно управлять тем, какие контроллеры будут активны. -
Использование системных возможностей: В случае использования systemd, возможно, стоит использовать его возможности для создания и управления группами, так как они часто оптимизированы по сравнению с ручными методами.
-
Обновление и проверка версий инструментов: Некоторые инструменты для работы с cgroups могут различаться в зависимости от версии дистрибутива или пакетов. Убедитесь, что ваши инструменты и система обновлены.
-
Необходимые права для команд: Настройте права команд и соответствующих директорий так, чтобы пользователи имели доступ создать и управлять cgroups.
Основное препятствие заключается в возможных ограничениях, наложенных на инструменты в непривилегированной среде. Возможно, использование встроенных механизмов управления командой systemd-run
предоставит больше возможностей для корректного и гибкого управления cgroups без необходимости в cgcreate
.
Эти рекомендации должны помочь вам понять способы управления cgroups V2 и их многочисленные возможности. Если потребуется письменный анализ, контекст или инструкции, наилучший подход заключается в изучении документации к вашей версии Ubuntu и инструментов управления cgroups.