Назад | Перейти на главную страницу

Как установить ограничения cgroup для пользовательских фрагментов systemd?

Я хотел бы ограничить использование системы для каждого пользователя. Поскольку Systemd имеет встроенную поддержку cgroups, я думаю, что использование пользовательских фрагментов - лучший вариант.

Проблема в том, что я не могу понять, как установить индивидуальные ограничения. Я могу отредактировать файл модуля user.slice, чтобы установить ограничения, которые в совокупности применяются ко всем пользовательским фрагментам, но я не вижу способа создать шаблон для этих пользовательских фрагментов.

Я могу переопределить эти настройки для отдельных пользователей, создав файл юнита user- (uid) .slice, но я бы предпочел применить ограничения по умолчанию ко всем пользователям.

Можно ли установить ограничения по умолчанию?

редактировать: Поковырявшись еще немного, я обнаружил, что файлы модулей для пользовательских фрагментов создаются в / run / systemd / system /.

[foo@bar Downloads]$ systemctl cat user-1000.slice
# /run/systemd/system/user-1000.slice
# Transient stub

# /run/systemd/system/user-1000.slice.d/50-After-systemd-logind\x2eservice.conf
[Unit]
After=systemd-logind.service
# /run/systemd/system/user-1000.slice.d/50-After-systemd-user-sessions\x2eservice.conf
[Unit]
After=systemd-user-sessions.service
# /run/systemd/system/user-1000.slice.d/50-Description.conf
[Unit]
Description=User Slice of foo
# /run/systemd/system/user-1000.slice.d/50-TasksMax.conf
[Slice]
TasksMax=infinity

Эти файлы создаются этим сегментом кода в systemd: https://github.com/systemd/systemd/blob/401e33ed56f3cd3736bbab02ca6eb31aa592cf53/src/login/logind-dbus.c#L2928-L2998

Кажется, что создание этого файла жестко запрограммировано в исходном коде systemd и не позволяет использовать шаблоны.

Это сработало для меня в Ubuntu 16.04:

редактировать /etc/systemd/logind.conf и установить

UserTasksMax=12299

После перезагрузки моей машины я мог видеть указанное выше значение (1000 - мой UID):

cat /sys/fs/cgroup/pids/user.slice/user-1000.slice/pids.max
12299

Распакуйте форму man logind.conf:

   UserTasksMax=
       Sets the maximum number of OS tasks each user may run concurrently. This controls the TasksMax= setting of the per-user slice unit, see systemd.resource-control(5) for details. Defaults to 12288
       (12K). If assigned the special value "infinity", no tasks limit is applied.

Это сработало для меня в Ubuntu 18.04:

1) Редактировать /data/repos/mhservers/etc/pam.d/common-session и добавить:

session  optional  pam_systemd.so

2) Редактировать /etc/security/limits.d/somename.conf и установить

someuser  soft  nofile  1024000
someuser  hard  nofile  1024000

3) Поиск UID с помощью id -u someuser

4) Выполнить systemctl restart user@[UID].service

Проверять someuser может выполнить systemctl --user show somesvr.service | grep NOFILE