CGroups
学习并练习AWS Hacking:HackTricks 培训 AWS 红队专家 (ARTE)
学习并练习GCP Hacking:
HackTricks 培训 GCP 红队专家 (GRTE)
基本信息
Linux 控制组,或称为 cgroups,是 Linux 内核的一个功能,允许在进程组之间分配、限制和优先处理系统资源,如 CPU、内存和磁盘 I/O。它们提供了一种机制,用于管理和隔离进程集合的资源使用,有助于资源限制、工作负载隔离以及在不同进程组之间进行资源优先处理。
cgroups 有两个版本:版本 1 和版本 2。两者可以同时在系统上使用。主要区别在于 cgroups 版本 2 引入了一个 层次化、类似树状结构,使得在进程组之间能够进行更精细和详细的资源分配。此外,版本 2 带来了各种增强功能,包括:
除了新的层次化组织外,cgroups 版本 2 还引入了其他几项更改和改进,如支持新的资源控制器、更好地支持传统应用程序和提高性能。
总体而言,cgroups 版本 2 提供了更多功能和更好的性能,但在某些情况下仍可以使用版本 1,特别是在需要与旧系统兼容性的情况下。
您可以通过查看进程的 cgroup 文件在 /proc/<pid> 中列出任何进程的 v1 和 v2 cgroups。您可以通过以下命令查看您的 shell 的 cgroups 开始:
查看 cgroups
文件系统通常用于访问 cgroups,与传统用于内核交互的 Unix 系统调用接口不同。要调查 shell 的 cgroup 配置,应检查 /proc/self/cgroup 文件,其中显示了 shell 的 cgroup。然后,通过导航到 /sys/fs/cgroup(或 /sys/fs/cgroup/unified
)目录,并找到一个与 cgroup 名称相同的目录,可以观察与 cgroup 相关的各种设置和资源使用信息。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-86da99243ae911189aabbf8a13c86941870048b6%252Fimage%2520%281128%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=906aca8d&sv=1)
用于 cgroups 的关键接口文件以 cgroup 为前缀。cgroup.procs 文件可以使用像 cat 这样的标准命令查看,其中列出了 cgroup 中的进程。另一个文件 cgroup.threads 包含线程信息。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-a3049cbbd1080fa0fc80cdba03ed32e2a22ba700%252Fimage%2520%28281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=19816f8e&sv=1)
管理 shell 的 cgroups 通常包括两个控制器,用于调节内存使用和进程计数。要与控制器交互,应查阅带有控制器前缀的文件。例如,pids.current 将被引用以确定 cgroup 中线程的计数。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-9659bd69fa13927ee9ef86a11e58e96ae24c72f2%252Fimage%2520%28677%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=93ee4cbd&sv=1)
数值中的 max 表示 cgroup 没有特定限制。但是,由于 cgroups 的层次结构,限制可能由目录层次结构中较低级别的 cgroup 强加。
操纵和创建 cgroups
通过将其进程 ID(PID)写入 cgroup.procs
文件,将进程分配给 cgroups。这需要 root 权限。例如,要添加一个进程:
同样,修改 cgroup 属性,比如设置 PID 限制,是通过将期望的值写入相关文件来完成的。要为 cgroup 设置最多 3,000 个 PID:
创建新的 cgroups 包括在 cgroup 层次结构中创建一个新的子目录,这会促使内核自动生成必要的接口文件。尽管可以使用 rmdir
删除没有活动进程的 cgroups,但要注意一些限制:
进程只能放置在叶子 cgroups 中(即,在层次结构中最嵌套的 cgroups)。
一个 cgroup 不能拥有其父级中不存在的控制器。
子 cgroups 的控制器必须在
cgroup.subtree_control
文件中显式声明。例如,要在子 cgroup 中启用 CPU 和 PID 控制器:
根 cgroup 是这些规则的一个例外,允许直接放置进程。这可以用来将进程从 systemd 管理中移除。
通过 cpu.stat
文件可以监视 cgroup 中的 CPU 使用情况,显示总 CPU 时间消耗,有助于跟踪服务的子进程的使用情况:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-5109dd9b3911242380921b2541abe06a93c63259%252Fimage%2520%28908%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=2187d82&sv=1)
参考资料
书籍:《How Linux Works, 第3版:每个超级用户都应该了解的内容》作者 Brian Ward
Last updated