探寻内核环境创建cgroup组的可行性

离成功最近的一次

// test_cgroup_create.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/cgroup.h>
#include <linux/kernfs.h>

static struct kernfs_node *my_kn = NULL;   /* 保存创建的节点 */

static int __init test_cgroup_init(void)
{
    struct cgroup_root *root = &cgrp_dfl_root;
    struct kernfs_node *parent_kn = root->cgrp.kn;
    int ret;

    /* 1. 获取 v2 根 kernfs 节点 */
    pr_info("parent_kn = %px\n", parent_kn);
    if (!parent_kn) {
        pr_err("test: no default root kn\n");
        return -ENOENT;
    }

    /* 2. 创建子 cgroup 目录 mygroup */
    char name[32];
    snprintf(name, sizeof(name), "mygroup_%lu", jiffies);
    ret = cgroup_mkdir(root->cgrp.kn, name, 0755);
    //ret = cgroup_mkdir(parent_kn, "mygroup", 0777);
    if (ret) {
        pr_err("test: mkdir failed %d\n", ret);
        return ret;
    }

    /* 3. 保存节点,方便卸载时删除 */
    my_kn = kernfs_find_and_get(parent_kn, "mygroup");
    if (!my_kn) {
        pr_warn("test: mygroup kn not found\n");
        return -ENOENT;
    }

    pr_info("test: created /sys/fs/cgroup/mygroup\n");
    return 0;
}

static void __exit test_cgroup_exit(void)
{
    if (my_kn) {
        /* 同步删除目录 */
        cgroup_rmdir(my_kn);
        kernfs_put(my_kn);
        my_kn = NULL;
        pr_info("test: removed /sys/fs/cgroup/mygroup\n");
    }
}

module_init(test_cgroup_init);
module_exit(test_cgroup_exit);
MODULE_LICENSE("GPL");
obj-m += test_cgroup_create.o

all:
	$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
posted @ 2025-07-30 15:30  爱吃鸡魔人zf  阅读(6)  评论(0)    收藏  举报