cgroups V2: как запустить непривилегированный cgcreate с монтированием nsdelegate

Вопрос или проблема

Кто-нибудь может показать, как запустить 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 в рамках пространств имен непривилегированными пользователями. Однако, важно понимать, что такие действия требуют определённых настроек и параметров, чтобы быть успешными.

Пример

  1. Создание cgroup с помощью systemd-run:

    Вы упоминали, что можете создавать группы через systemd-run. Это связано с тем, что systemd, как менеджер системных служб, имеет встроенные механизмы работы с cgroups и может обрабатывать их иерархию в V2. Используя команду systemd-run, вы можете запускать процессы в новой cgroup:

    systemd-run --scope --user --shell --property=Delegate=true

    Команда создаёт новый scope в инстанции пользователя, делегирует управление cgroup и позволяет вам вручную изменять параметры.

  2. Управление контроллерами и процессами в cgroup:

    Используя команды вроде cgset и cgclassify, вы можете изменять контроллеры и перемещать процессы между группами. Однако для успешного использования cgcreate могут потребоваться дополнительные разрешения или привилегии, которые не всегда предоставляются непривилегированному пользователю.

  3. Создание подгрупп с помощью 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.

Оцените материал
Добавить комментарий

Капча загружается...