LXC1.0.7-- lxc-start 源码分析 04

本文详细分析了LXC 1.0.7中`lxc-start`命令在启动容器时如何处理namespace和cgroup。主要关注`cgroup_create`和`lxc_cgroupfs_create`函数,包括cgroup路径创建、权限设置和进程绑定等关键步骤,以理解容器资源管理和隔离的实现。
摘要由CSDN通过智能技术生成

lxc start部分的源码的大致工作流程已经熟悉,那么就要关注他的核心内容了,就是关于namespace 和 cgroup的内容了。

根据前面的分析已经知道,lxc根据一些配置会自动将flag设置成CLONE_NEWXXX,然后会通过cgroup init 来初始化一堆 cgroup。我们先来看一下。

首先通过cgroup_create 来创建 cgroup,前面介绍都是有个ops 指向函数指针,这里先假设我们用的cgfs,理论上应该和cgroupmanager是一样的方式,可能细节有区别而已。

那么顺理成章create指向cgfs_create,后面就直接说函数指针的位置了。

函数内部通过调用lxc_cgroupfs_create。那么就要从create a newcgroup

static struct cgroup_process_info *lxc_cgroupfs_create(const char*name, const char *path_pattern, struct cgroup_meta_data *meta_data, const char*sub_pattern)

 

char**cgroup_path_components = NULL;

    char **p = NULL;

    char *path_so_far = NULL;

    char **new_cgroup_paths =NULL;

    char **new_cgroup_paths_sub =NULL;

    struct cgroup_mount_point*mp;

    struct cgroup_hierarchy *h;

    struct cgroup_process_info*base_info = NULL;

    struct cgroup_process_info*info_ptr;

    int saved_errno;

    int r;

    unsigned suffix = 0;

    bool had_sub_pattern = false;

size_t i;

 

if (!is_valid_cgroup(name)){                                      //判断name 是否有效

        ERROR("Invalidcgroup name: '%s'", name);

        errno = EINVAL;

        return NULL;

}

 

if (!strstr(path_pattern,"%n")) {

        ERROR("Invalidcgroup path pattern: '%s'; contains no %%n for specifying container name",path_pattern);

        errno = EINVAL;

        return NULL;

}

根据privilege 和unprivilege  container的不同读取到proc 下面的pid的不同来确定不同的cgroup 信息。

base_info = (path_pattern[0]== '/') ?

       lxc_cgroup_process_info_get_init(meta_data) :

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值