📜  无法在 sys fs cgroup systemd 上挂载 cgroup:不允许操作 (1)

📅  最后修改于: 2023-12-03 15:26:16.247000             🧑  作者: Mango

无法在 sys fs cgroup systemd 上挂载 cgroup:不允许操作

问题描述

在使用系统中的cgroups进行资源管理时,可能会遇到以下错误:

mount: cgroup2: no space available on device
mount: /sys/fs/cgroup/systemd: cgroup filesystem type 'systemd' not supported by kernel.
Failed to mount cgroup at /sys/fs/cgroup/systemd: Operation not permitted

或者

mount: /sys/fs/cgroup/systemd: cgroup filesystem type 'systemd' not supported by kernel.
Failed to mount cgroup at /sys/fs/cgroup/systemd: Permission denied

这些错误的原因是由于内核不支持或权限不足。

解决方案
1. 检查内核

确保你的内核支持cgroup

对于cgroup v1,可以检查以下位置:

$ zcat /proc/config.gz | grep -i cgroup
CONFIG_CGROUPS=y
# CONFIG_BLK_CGROUP is not set
CONFIG_CGROUP_DEBUG=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_NS=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_BPF=y
CONFIG_CGROUP_DEBUG_MEMORY=y
# CONFIG_CGROUP_MEM_RES_CTLR_SWAP is not set
CONFIG_CGROUP_MEM_RES_CTLR=y
# CONFIG_CGROUP_CGROUP8 is not set
CONFIG_CGROUP_SYSTEMD=y

对于cgroup v2,可以检查以下位置:

$ zcat /proc/config.gz | grep -i cgroup2
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CGROUP_CGROUP_RCU=y
CONFIG_CGROUP_PID_SELFTESTS=y
CONFIG_CGROUP_BLK_CGROUP=y
CONFIG_CGROUP_RDMA=y
CONFIG_CGROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_NET_CLASSID=y
CONFIG_CGROUP_NET_CLS_ACT=y
CONFIG_CGROUP_BPF=y
CONFIG_CGROUP_TAGGED=y
CONFIG_CGROUP_XATTR=y
CONFIG_CGROUP_DEVICE_QUEUE=y
CONFIG_CGROUP_SYSFS=y
CONFIG_CGROUP_CPUACCT=y

如果你的内核不支持cgroup或缺少所需的模块,则必须重新编译内核或加载所需的模块。

2. 检查文件系统

检查文件系统是否支持cgroups

cgroup v1

对于cgroup v1,需要检查/etc/fstab文件系统表:

none /sys/fs/cgroup cgroup defaults 0 0

cgroup v2

对于cgroup v2,需要检查/etc/fstab文件系统表:

none /sys/fs/cgroup cgroup2 rw,nosuid,nodev,noexec 0 0

确保cgroup挂载在/sys/fs/cgroup目录下,并具有正确的权限。

3. 检查权限

确保你有足够的权限来挂载cgroups

对于cgroup v1,你必须属于cgroup组,或者以超级用户身份运行:

$ id -a
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare)

对于cgroup v2,你必须以超级用户身份运行。

4. 检查systemd版本

确保你使用的是systemd的正确版本。

对于cgroup v1,需要systemd的版本为>=209

对于cgroup v2,只有在systemd版本为>=232时才受支持。

5. 检查SELinux

如果你的系统使用了SELinux,请确保SELinux的类型是svirt_lxc_net_t

$ ps -Z | grep systemd
system_u:system_r:svirt_lxc_net_t:s0:c141,c875 ...

如果类型不正确,请设置正确的类型:

$ sudo semanage fcontext -a -t svirt_lxc_net_t /sys/fs/cgroup
$ sudo restorecon -Rv /sys/fs/cgroup
总结

在使用cgroups进行资源管理时,可能会遇到无法挂载的问题。本文介绍了一些可能导致问题的原因,并提供了相应的解决方案,希望对你有所帮助。