virsh源码分析

文章目录

  • 一、前提说明
  • 二、Makefile编译virsh过程分析
    • (一)主Makefile
    • (二)次级Makefile
  • 三、virsh源码框架分析

一、前提说明

  • virsh所属libvirt版本号:4.0.0
  • 只分析ubuntu环境下的代码
  • 只会介绍源码执行框架,不会详细介绍每行代码

二、Makefile编译virsh过程分析

在源码根目录下执行configure命令会生成各级Makefile,包括源码根目录下的主Makefile。

(一)主Makefile

  • 主目标如下 :
all: config.h
        $(MAKE) $(AM_MAKEFLAGS) all-recursive
  • 生成主目标的命令会再次执行主Makefile来生成目标all-recursive
    生成目标all-recursive的规则如下
  1. 变量RECURSIVE_TARGETS包含all-recursive
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
        ctags-recursive dvi-recursive html-recursive info-recursive \
        install-data-recursive install-dvi-recursive \
        install-exec-recursive install-html-recursive \
        install-info-recursive install-pdf-recursive \
        install-ps-recursive install-recursive installcheck-recursive \
        installdirs-recursive pdf-recursive ps-recursive \
        tags-recursive uninstall-recursive
  1. 变量am__recursive_targets包含变量RECURSIVE_TARGETS
am__recursive_targets = \
  $(RECURSIVE_TARGETS) \
  $(RECURSIVE_CLEAN_TARGETS) \
  $(am__extra_recursive_targets)
  1. 变量am__recursive_targets的生成过程如下:
$(am__recursive_targets):
        @fail=; \
        if $(am__make_keepgoing); then \
          failcom='fail=yes'; \
        else \
          failcom='exit 1'; \
        fi; \
        dot_seen=no; \
        target=`echo $@ | sed s/-recursive//`; \
        case "$@" in \
          distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
          *) list='$(SUBDIRS)' ;; \
        esac; \
        for subdir in $$list; do \
          echo "Making $$target in $$subdir"; \
          if test "$$subdir" = "."; then \
            dot_seen=yes; \
            local_target="$$target-am"; \
          else \
            local_target="$$target"; \
          fi; \
          ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
          || eval $$failcom; \
        done; \
        if test "$$dot_seen" = "no"; then \
          $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
        fi; test -z "$$fail"

在变量am__recursive_targets的生成过程中,当遇到all-recursive时,会依次调用变量SUBDIRS中各个目录下的Makefile。当调用到tools目录下的Makefile时,会生成virsh

(二)次级Makefile

tools目录下的Makefile,属于二级Makefile

virsh的生成规则如下

virsh$(EXEEXT): $(virsh_OBJECTS) $(virsh_DEPENDENCIES) $(EXTRA_virsh_DEPENDENCIES) 
        @rm -f virsh$(EXEEXT)
        $(AM_V_CCLD)$(virsh_LINK) $(virsh_OBJECTS) $(virsh_LDADD) $(LIBS)

当在linux系统中编译时,EXEEXT的值为空。
virsh生成规则中的各依赖的值如下:

am_virsh_OBJECTS = virsh-virsh.$(OBJEXT) \
        virsh-virsh-completer.$(OBJEXT) virsh-virsh-console.$(OBJEXT) \
        virsh-virsh-domain.$(OBJEXT) \
        virsh-virsh-domain-monitor.$(OBJEXT) \
        virsh-virsh-host.$(OBJEXT) virsh-virsh-interface.$(OBJEXT) \
        virsh-virsh-network.$(OBJEXT) virsh-virsh-nodedev.$(OBJEXT) \
        virsh-virsh-nwfilter.$(OBJEXT) virsh-virsh-pool.$(OBJEXT) \
        virsh-virsh-secret.$(OBJEXT) virsh-virsh-snapshot.$(OBJEXT) \
        virsh-virsh-util.$(OBJEXT) virsh-virsh-volume.$(OBJEXT)
virsh_OBJECTS = $(am_virsh_OBJECTS)
virsh_DEPENDENCIES = $(am__DEPENDENCIES_1) ../src/libvirt-lxc.la \
        ../src/libvirt-qemu.la libvirt_shell.la $(am__append_13)

变量virsh_DEPENDENCIES中的文件,除了am__append_13,其它的是在src/Makefile中生成的。而am__append_13未定义,其值为空
变量EXTRA_virsh_DEPENDENCIES未定义,其值为空。

到此,可知道virsh的编译生成过程

三、virsh源码框架分析

注:
只是标明流程图,不详细介绍源码
在virsh命令中,目前发现virsh子命令会使用到eventloop
Created with Raphaël 2.2.0 开始 初始化virsh的控制结构变量 获取程序自身名称 初始终端文本环境 初始化互斥锁 初始化virsh底层:初始加密库 初始化virsh底层:根据环境变量配置log 初始化virsh底层:初始化tls 初始化virsh底层:注册操作各个虚拟化平台的回调函数集 初始化virsh终端:设置virsh子命令的处理函数,根据环境变量配置debug级别及打开log文件 解析参数 初始化连接:重新配置debug及readline库 初始化连接:配置对错误进行处理的回调函数 初始化连接:创建wakeup管道句柄并为read句柄设置回调函数 初始化连接:保存操作eventloop中的回调函数和定时器的函数 初始化连接:创建eventloop线程后位于主线程? 创建永不过期的定时器,作用是在唤醒时向管道eventPipe[1]写入:因超时唤醒 指明了hypervisor的地址? 连接hypervisor 是交互模式? 读取输入的virsh命令 需要连接hypervisor? 连接hypervisor 执行virsh命令 退出交互模式? 关闭日志文件,关闭hypervisor连接,将eventloop标记为需要退出的状态 结束 需要连接hypervisor? 连接hypervisor 执行virsh命令 继续处理eventloop? 处理被删除的定时器及事件 发生了event? 处理event 处理被删除的定时器及事件 yes no yes no yes no yes no yes no yes no yes no yes no

你可能感兴趣的:(云计算,libvirt)