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流程分析的更多相关文章

  1. runc create container 流程分析

    1.// runc/create.go Action: func(context *cli.Context) error 首先调用spec, err := setupSpec(context)加载配置 ...

  2. runv start container 流程分析

    1.runv/start.go func startContainer(context *cli.Context, container, address string, config *spec.Sp ...

  3. spark 启动job的流程分析

    从WordCount開始分析 编写一个样例程序 编写一个从HDFS中读取并计算wordcount的样例程序: packageorg.apache.spark.examples importorg.ap ...

  4. 8、Struts2 运行流程分析

    1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...

  5. freeswitch呼叫流程分析

    今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...

  6. u-boot 流程分析

    u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 ,  这个启动程序就叫启动加载程序(Boot ...

  7. thttpd和cgilua安装与运行流程分析

    安装 参考如下博文安装thttpd软件 http://blog.csdn.net/21aspnet/article/details/7045845 http://blog.csdn.net/drago ...

  8. 【转】Hostapd工作流程分析

    [转]Hostapd工作流程分析 转自:http://blog.chinaunix.net/uid-30081165-id-5290531.html Hostapd是一个运行在用户态的守护进程,可以通 ...

  9. u-boot中nandflash初始化流程分析(转)

    u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...

随机推荐

  1. OMG 在线思维导图都有开源的

    my-mind在线思维导图 源代码: https://github.com/ondras/my-mind 演示地址: http://my-mind.github.io/ 试了一下,操作上还有些bug, ...

  2. [PE结构分析] 11.资源表结构

    资源表是一个树形结构,可以设置成2的31次方的层数,Windows 使用了3级: 类型->名称->语言 其中涉及到四个结构: Data Description Resource Direc ...

  3. [git] ignore文件规则失效

    背景 在某次项目,发现已经将.iml规则写进.ignore文件,但是对.iml的修改依然会出现在changelist中. 解决方案 先引用git官网上的描述 gitignore - Specifies ...

  4. BaseServlet

    1. 目的: 将提升Servlet的处理请求的能力,而不只限于doGet()/doPost()等请求. 让其Servlet能够自己根据请求,从而触发相应的方法进行处理. 2. 具体代码实现: impo ...

  5. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q125-Q126)

    Question 125You are creating an application for SharePoint Server 2010.The application will run on a ...

  6. Android项目实战(十二):解决OOM的一种偷懒又有效的办法

    在程序的manifest文件的application节点加入android:largeHeap=“true” 即可. 对,只需要一句话! 那么这行代码的意思是什么呢? 简单的说就是使该APP获取最大可 ...

  7. [Android]ViewPager如何只初始化一个页面

    使用过ViewPager的应该都知道,ViewPager的setoffscreenpagelimit()方法,使用该方法可以设置在ViewPager滑动时,左右两侧各保存多少个页面,那我们直接设置se ...

  8. 《C程序设计的抽象思维》2.10编程练习(未完)

    本文地址:http://www.cnblogs.com/archimedes/p/programming-abstractions-in-c-2.html,转载请注明源地址. 2.按照规定求圆柱的表面 ...

  9. Static Cell-静态TableView

    使用静态TableView有两个前提,1.要在Storyboard上  2.需要使用TableViewController PS:如果需要设置不同的cell的高度不同的话,还是需要使用tableVie ...

  10. 【转】从viewController讲到强制横屏,附IOS5强制横屏的有效办法

    文字罗嗦,篇幅较长,只需营养可直接看红字部分. 一个viewController的初始化大概涉及到如下几个方法的调用: initWithNibName:bundle: viewDidLoad view ...