什么是 CGManager?¶
CGManager 是一个中央特权守护进程,它通过一个简单的 D-Bus API 管理所有你的 cgroups。它被设计用来与嵌套的 LXC 容器一起工作,并接受非特权请求,包括解析用户命名空间 UIDs/GIDs。
注意
从 2014 年 4 月开始,CGManager 在 Ubuntu 中默认与 LXC 一起使用,之后其他发行版在需要工作非特权容器时也开始使用它。
它现在已被最新的 Linux 内核中的 CGroup 命名空间所取代。在旧的内核中,LXCFS 仍然提供了一个 cgroupfs 模拟,可以用来代替 CGManager,并且与现有的用户空间更加兼容。
组件¶
cgmanager¶
这个守护进程运行在主机上,将 cgroupfs 挂载到一个单独的挂载命名空间中(因此从主机上不可见),将 /sys/fs/cgroup/cgmanager/sock 绑定到传入的 D-Bus 查询,并通常处理所有直接运行在主机上的客户端。
cgmanager 接受使用 D-Bus + SCM 凭据进行的身份验证请求,用于跨命名空间转换 uid、gid 和 pid,或者使用简单的“未经身份验证”(只是初始 ucred)D-Bus 用于来自主机级别的查询。
cgproxy¶
你可能会在两种情况下看到这个守护进程运行。如果你的内核版本低于 3.8(没有 pidns 附加支持),那么在主机上会运行它,或者在容器中(只有 cgproxy 运行)。
cgproxy 本身不会进行任何 cgroup 配置更改,而是像它的名字所暗示的那样,将请求代理到主 cgmanager 进程。
这是必要的,这样进程就可以通过直连 D-Bus 与 /sys/fs/cgroup/cgmanager/sock 交谈(例如使用 dbus-send)。
cgproxy 然后会从该查询中捕获 ucred,并对真正的 cgmanager 套接字进行经过身份验证的 SCM 查询,通过 ucred 结构传递参数,以便它们被正确地转换为主机命名空间中的 cgmanager 可以理解的东西。
cgm¶
一个简单的命令行工具,它与 D-Bus 服务通信,并允许你从命令行执行所有常用的 cgroup 操作。
通信协议¶
如上所述,cgmanager 和 cgproxy 使用 D-Bus。建议外部客户端(不是 cgproxy 本身)使用标准的 D-Bus API,不要尝试实现 SCM 凭据协议,因为它是不必要的,而且很容易出错。
相反,只需假设与 /sys/fs/cgroup/cgmanager/sock 通信始终会做正确的事情。
cgmanager API 仅在该单独的 D-Bus 套接字上可用,cgmanager 本身不会连接到系统总线,因此运行中的 dbus 守护进程不是 cgmanager/cgproxy 的要求。
你可以阅读更多关于 D-Bus API 的信息 这里。
许可证¶
CGManager 是自由软件,大部分代码是在 GNU LGPLv2.1+ 许可证的条款下发布的,一些二进制文件是在 GNU GPLv2 许可证下发布的。
该项目的默认许可证是 GNU LGPLv2.1+。
支持¶
CGManager 的稳定版本支持依赖于 Linux 发行版及其对推动稳定修复和安全更新的承诺。