Каталог пользовательского среза cgroups не распознается в /sys/fs/cgroups на CentOS 7.3.

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

Я использую Centos 7.3 и хочу реализовать cgroups, чтобы ограничить ресурсы для всех пользователей, входящих в систему.

Я использую концепцию Dropin-файлов, создавая каталог /etc/systemd/system/user-.slice.d/ и создавая файл конфигурации в этом каталоге, затем выполняя systemctl daemon-reload.

Когда пользователь входит в систему, я не вижу, чтобы какой-либо каталог создавался в /sys/fs/cgroup/memory/user.slice с именем user-{UID}.slice, и настройки по умолчанию не применяются. То же самое работает с Alma 8 / 9.

  • версия systemd – 219
  • версия cgroups – 1

Я использую концепцию Dropin-файлов, создавая каталог /etc/systemd/system/user-.slice.d/

Возможность размещать drop-in в каталогах с “префиксом” была реализована только в systemd v239 (который вышел примерно через 3 года после релиза v219). До этого считались только каталоги drop-in с “точным совпадением”.

systemd/NEWS
ИЗМЕНЕНИЯ С 239: [...] * При загрузке файлов юнита systemd теперь будет искать drop-in файлы в дополнительных местах. Ранее для имени файла юнита "foo-bar-baz.service" он искал drop-in файлы в "foo-bar-baz.service.d/*.conf". Теперь он также будет искать в "foo-bar-.service.d/*.conf" и "foo-.service.d/", т.е. по имени сервиса без всех внутренних дефисов. Эта схема позволяет легко писать drop-in, которые применяются к целому набору файлов юнитов сразу. Это особенно полезно для монтирования и слоев (так как их наименование основано на префиксах), но также полезно для сервисов и других юнитов, для пакетов, которые устанавливают несколько файлов юнитов одновременно, следуя строгому правилу именования, начинающему имя файла юнита с имени пакета. Два новых спецификатора теперь поддерживаются в файлах юнитов: %j и %J заменяются частью имени юнита после последнего дефиса.

Либо обновите вашу систему, либо настройте PAM для автоматической генерации индивидуальных drop-in для каждого среза всякий раз, когда новый UID входит в систему. Для этого вы можете использовать pam_exec.so – добавьте его в секцию session выше pam_systemd (последний регистрирует пользовательские срезы) и заставьте его вызвать скрипт, который создает drop-in в /run/systemd.

#!/bin/bash
if [ "${PAM_TYPE?}" = open_session ]; then
    uid=$(id -u "${PAM_USER?}")
    cat > "/run/systemd/system/user-$uid.slice.d/limits.conf" <<-EOF
    ...
    EOF
fi

То же самое работает с Alma 8 / 9.

У них более новая версия systemd.

Ответ или решение

Проблема, с которой вы столкнулись в CentOS 7.3, связана с использованием системы cgroups для ограничения ресурсов пользователей при входе в систему. Ваша попытка применить конфигурацию через файлы "drop-in" не работает должным образом, так как версия systemd, которую вы используете (219), не поддерживает эту функциональность в той форме, как это реализовано в более поздних версиях, таких как Alma 8 или 9.

Проблема с версиями systemd и cgroups

Как вы уже отметили, cgroups не создаются для пользователя, не происходит автоматического применения заданных вами настроек. Это связано с тем, что в вашем случае вы используете механизмы, которые были внедрены только в более новых версиях systemd. Начиная с версии 239, systemd позволяет создавать drop-in файлы в "префиксных" директориях, предполагая более гибкий подход к управлению конфигурациями.

В версии 219 механика работы такова, что systemd ищет drop-in файлы только в точных директориях, соответствующих именам юнитов. Поэтому директория /etc/systemd/system/user-.slice.d/ не распознаётся.

Возможные решения

  1. Обновление системы: Наиболее простым, хотя и трудоемким, решением было бы обновить вашу систему до версии CentOS с более новой версией systemd (например, AlmaLinux 8/9), где эти возможности уже доступны.

  2. Использование PAM для автоматической генерации drop-in для каждого пользователя: Если обновление невозможно, вы можете воспользоваться встроенными возможностями PAM. Вам нужно будет настроить pam_exec.so для создания индивидуальных drop-in файлов при каждой новой сессии пользователя. Добавьте его в секцию session вашего файла конфигурации PAM, который отвечает за управление сессиями.

Пример скрипта для генерации drop-in файлов:

#!/bin/bash
if [ "${PAM_TYPE?}" = open_session ]; then
    uid=$(id -u "${PAM_USER?}")
    cat > "/run/systemd/system/user-$uid.slice.d/limits.conf" <<-EOF
    # Настройки лимитов для пользователя с UID $uid
    MemoryLimit=512M
    CPUQuota=50%
    EOF
fi

Настройки PAM

Ваша конфигурация PAM может выглядеть следующим образом:

session required pam_unix.so
session optional pam_exec.so /путь/к/вашему/скрипту.sh
session required pam_systemd.so

Важно, чтобы вызов pam_exec.so был выше pam_systemd.so, чтобы гарантировать создание и применение drop-in файлов до регистрации сессии пользователя.

Заключение

Таким образом, проблема с тем, что cgroups не создаются для пользователя под /sys/fs/cgroup/memory/user.slice, связана с ограничениями вашей текущей версии systemd. Вам доступны два основных пути: обновление системы или использование PAM для автоматической генерации настроек. Надеемся, данное объяснение поможет вам успешно решить задачу и настроить cgroups для ограничения ресурсов пользователей в вашей системе.

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

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