runc start container流程分析
1、runc/start.go
Action: func(context *cli.Context) error
该函数首先调用container, err := getContainer(context)获取container信息,接着调用status, err := container.Status()获取容器的当前状态。最后,如果status为libcontainer.Created,则调用container.Exec()在创建的容器内执行用户定义的进程。若status为libcontainer.Stopped,则报错,因为runc不能start一个已经run并且stop了的容器,其他状况则都报错。
--------------------------------------------------------------------------------获取容器实例-----------------------------------------------------------------------------------------------
2、runc/utils_linux.go
// getContainer returns the specified container instance by loading it from state with the default factory
func getContainer(context *cli.Context) (libcontainer.Container, error)
首先调用 id := context.Args().First()获取容器id,再调用factory, err := loadFactory(context)获取默认工厂实例,最后,return factory.Load(id)返回容器实例。
3、runc.utils_linux.go
// loadFactory returns the configured factory instance for execing containers
获取存储容器信息的目录abs,一般为/run/runc/,获取cgroupManager,最后调用return libcontainer.New(abs, cgroupManager, libcontainer.CriuPath(context.GlobalString("criu")))返回默认factory实例。(详细的描述参见《runc create container流程分析》)
4、runc/libcontainer/factory_linux.go
func (l *LinuxFactory) Load(id string) (Container, error)
调用containerRoot := filepath.Join(l.Root, id)获取容器目录(一般为/run/runc/container-id)。再调用state, err := l.loadState(containerRoot, id)加载容器状态(即加载/run/runc/container-id/state.json)。接着根据配置文件填充获得process和container,如下所示:
r := &nonchildProcess {
processPid: state.InitProcessPid,
processStartTime: state.InitProcessStartTime,
fds: state.ExternalDescriptors,
}
c := &linuxContainer {
initProcess: r,
initProcessStartTime: state.InitProcessStartTime,
id: id,
config: &state.Config,
initArgs: l.InitArgs,
criuPath: l.CriuPath,
cgroupManager: l.NewCgroupsManager(state.Config.Cgroups, state.CgroupPaths)
root: containerRoot,
created: state.Created,
}
c.state = &loadedState{c: c}
最后c.refreshState()
------------------------------------------------------------------------------结束容器实例获取----------------------------------------------------------------------------------------
5、runc/libcontainer/container_linux.go
func (c *linuxContainer) exec() error
获取容器实例之后,其实只要打开/run/runc/container-id/exec.fifo文件,通知之前已经创建的容器可以开始执行用户进程了。然后再从fifo文件中,获取一个字节的同步数据,最后删除fifo文件,容器start 完成。
注:runc run命令与runc create & start的不同之处在于run命令在容器创建完成之后,就直接调用c.exec()启动容器内的用户进程,而create & start是把c.exec单独划分至start命令当中。
runc start container流程分析的更多相关文章
- runc create container 流程分析
1.// runc/create.go Action: func(context *cli.Context) error 首先调用spec, err := setupSpec(context)加载配置 ...
- runv start container 流程分析
1.runv/start.go func startContainer(context *cli.Context, container, address string, config *spec.Sp ...
- spark 启动job的流程分析
从WordCount開始分析 编写一个样例程序 编写一个从HDFS中读取并计算wordcount的样例程序: packageorg.apache.spark.examples importorg.ap ...
- 8、Struts2 运行流程分析
1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...
- freeswitch呼叫流程分析
今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...
- u-boot 流程分析
u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 , 这个启动程序就叫启动加载程序(Boot ...
- thttpd和cgilua安装与运行流程分析
安装 参考如下博文安装thttpd软件 http://blog.csdn.net/21aspnet/article/details/7045845 http://blog.csdn.net/drago ...
- 【转】Hostapd工作流程分析
[转]Hostapd工作流程分析 转自:http://blog.chinaunix.net/uid-30081165-id-5290531.html Hostapd是一个运行在用户态的守护进程,可以通 ...
- u-boot中nandflash初始化流程分析(转)
u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...
随机推荐
- webservice 原理
webservice 原理1.soap协议,其实就是用http协议来传输xml格式的数据,可以post,get.一般有post.2.服务端有:本地程序代码(也不是dll)和xml格式的文件用来描述dl ...
- java之内的工具分享,附带下载链接,方便以后自己寻找
class反编译工具:http://pan.baidu.com/s/1geYvX5L redis客户端工具:http://pan.baidu.com/s/1eRJ4ThC mysql客户端-[mysq ...
- How Tomcat Works读书笔记之升级架构
上一篇HttpServer类职责很多,包括启动服务器,创建ServerSocket,得到客户端Socket,创建Request对象和Response对象,并解析Http请求,这样很混乱,不利于以后服务 ...
- PPP模式下的融资结构优化
PPPcode{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && d ...
- Orchard中文版源码下载
本版本基于Orchard1.7.2修改: 新增Bootstrap主题 新增中文语言包 增加了对Sqlite.Orchard数据库的支持 优化工程,减少临时符号生成,增加工程效率 和一些BUG的修正 默 ...
- .NET Core添加项目之间的依赖关系
- [翻译]:SQL死锁-阻塞
一般情况下死锁不是一步到位的,它必须满足特定的条件,然后形成资源的循环依赖才会产生死锁,死锁之前一定会出现阻塞,由阻塞升级才有可能出现死锁,所以我们有必要了解系统中都有哪些已经被阻塞的锁. 我在解决共 ...
- Follow me to learn what is repository pattern
Introduction Creating a generic repository pattern in an mvc application with entity framework is th ...
- Android5.0新特性——图片和颜色(drawable)
图片和颜色 tint属性 tint属性一个颜色值,可以对图片做颜色渲染,我们可以给view的背景设置tint色值,给ImageView的图片设置tint色值,也可以给任意Drawable或者NineP ...
- VM虚拟机忘记密码
关掉虚拟机. VM->Settings,选中Hard Disk,在右边出现了Utilities的一个下拉栏,OK,点击它选择Map,这时弹出一个"Map Virtual Disk&qu ...