Вопрос или проблема
Я использую 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/
не распознаётся.
Возможные решения
-
Обновление системы: Наиболее простым, хотя и трудоемким, решением было бы обновить вашу систему до версии CentOS с более новой версией systemd (например, AlmaLinux 8/9), где эти возможности уже доступны.
-
Использование 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 для ограничения ресурсов пользователей в вашей системе.