一、概述
hyper daemon是hyper的后台守护进程,我们必须要通过输入hyperd命令先打开hyper daemon,然后才能执行hyper run,hyper stop等一系列对于hyper虚拟机的操作命令。与hyper client不同的是,hyper daemon承担了整个hyper程序的大部分任务且主要由三部分组成:server,engine和job。
其中server用于接收来自hyper client端的请求,然后将请求转发到engine中。engine则主要是路由的作用,通过一个handler对象将具体的请求分发到相应的job去执行。至于job则用于将任务转发的具体的函数去执行。其实从上面的叙述我们可以发现,这些任务的转发的确显得有点啰嗦,所以在docker中engjine和job这个两个概念已经被移除了。希望hyper在以后的代码重构时也能对这部分代码进行精简。下面我们就通过源码来观察hyper daemon的整个启动过程。
二、flag 参数解析
当你输入在shell中输入hyperd命令时,我们就进入hyperd.go文件中的main函数开始创建hyper daemon了!首先和hyper client中类似,我们需要对命令行参数进行解析。main函数中先是定义了三个flag参数flConfig,flHost,flHelp分别表示hyper daemon的配置信息,host的IP地址和端口号,以及是否输出帮助信息。当然,这些我们都没有,所以直接采用默认设置。接下来执行语句
mainDaemon(*flConfig, *flHost)正式进入hyper daemon的创建。
三、mainDaemon函数分析
因为我们并没有显式指定配置文件的地址,所以首先要做的就是指定默认的配置文件地址为/etc/hyper/config,其实里面指定的无非是hyper kernel,hyper initrd等等用于启动虚拟机的组件的地址而已。如果你想用自己的kernel启动虚拟机,可以试着修改里面的内容。
接下来是两条非常关键的语句,分别用于初始化engine和daemon 。
eng := engine.New(config)
d, err := daemon.NewDaemon(eng)
因为它们都非常重要,所以在下面的小节中再进行详细的叙述。在初始化engine和daemon之后,通过err := d.Install(eng)函数将具体的方法注册到engine的handler中,其实做的不过就是初始化一个映射表map[string]engine.Handler而已。例如通过</