欢迎光临散文网 会员登陆 & 注册

深究Runc源码-2-创建Create流程分析

2022-11-15 12:31 作者:黑暗光影DIY  | 我要投稿


代码基于1.1.0

首先将OCI runtime-spec转换成libcontainer Config

libcontainer.Create复制Container实例的构建,首先根据root,创建对应目录,root是一个全局命令行参数,默认是$XDG_RUNTIME_DIR/runc

main.go

XDG_RUNTIME_DIR=/run/user/${uid},root目录用户保存创建的容器state.json,全路径为$root/$container-id/state.json

然后构建cgroup.Manager实例,存在三种Manager实例,systemd,cgroupv1,cgroupv2,systemd通过全局配置项--systemd-cgroup控制,cgroupv1/v2则判断操作系统是否开启了v2,优先使用v2

默认dirPath是/sys/fs/cgroup/$ownCgroup/$container-id

最终构建的Container实例为

runner实例为

然后进入到runner.run流程

首先根据spec.Process构建Process实例

根据CT_ACT_CREATE进入Container.Start流程

首先创建execFifo文件,${root}/exec.fifo, root是上述container root,例如/run/user/1000/runc/mycontainer/exec.fifo,然后调用Container.start,首先构建ParentProcess实例

其中Cmd实例为

initProcess.start首先调用cmd.start启动runc init子进程,然后在父进程中与子进程进行通信和同步等待runc init 完成。此时进程已经分化成两个进程,runc create和runc init。runc init流程在2.2.2 章节中详细分析。runc create流程中重点分析一下cgroup的设置,如前面分析,默认支持cgroupv1 cgroupv2 systemd三种类型,systemd通过命令行指定,cgroupv1 v2是通过检测linux释放开启v2,优先使用v2,在parent Process.start流程中调用manage.Apply设置runc init进程的pid。

CreateCgroupPath调用根据manager.dirPath,从/sys/fs/cgroup开始,如果目录不存在的话,依次循环创建对应目录,并写入cgroup.subtree_control。

WriteCgroupProc将Init Pid写入到dirPath/cgroup.procs中。

在parentProcess.start流程中,parseSync procHooks case中通过manage.Set设置cgroup资源控制值。

核心Kernel Cgroupv2接口的调用,详细可参考kernel文档https://docs.kernel.org/admin-guide/cgroup-v2.html


开源的东西,转发不需要出处,就说你自己写的

深究Runc源码-2-创建Create流程分析的评论 (共 条)

分享到微博请遵守国家法律