![如何为 systemd 用户切片设置 cgroup 限制?](https://linux22.com/image/714156/%E5%A6%82%E4%BD%95%E4%B8%BA%20systemd%20%E7%94%A8%E6%88%B7%E5%88%87%E7%89%87%E8%AE%BE%E7%BD%AE%20cgroup%20%E9%99%90%E5%88%B6%EF%BC%9F.png)
我想限制每个用户的系统使用情况。由于 Systemd 本身支持 cgroup,我认为使用用户切片是可行的方法。
问题是:我不知道如何设置单独的限制。我可以编辑 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 源中并且不允许使用模板。
答案1
这对我而言在 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.
答案2
这对我有用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)使用以下方式查找 UIDid -u someuser
4)执行systemctl restart user@[UID].service
验证someuser
可以执行systemctl --user show somesvr.service | grep NOFILE