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) :