virsh源码分析

Tags

  • 前提说明

    • virsh所属libvirt版本号:4.0.0
    • 运行环境为ubuntu 18.04
    • 只介绍源码执行框架,不会详细介绍每行代码
  • Makefile编译virsh过程分析

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

    1. 主Makefile生成virsh过程

      1. 主目标如下 :

        all: config.h
                $(MAKE) $(AM_MAKEFLAGS) all-recursive

      2. 生成主目标的命令会再次执行主Makefile生成目标all-recursive

        生成目标all-recursive的规则如下

        • 目标all-recursive被包含在变量RECURSIVE_TARGETS中

          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

        • 变量RECURSIVE_TARGETS被包含在变量am__recursive_targets中

          am__recursive_targets = \
            $(RECURSIVE_TARGETS) \
            $(RECURSIVE_CLEAN_TARGETS) \
            $(am__extra_recursive_targets)

        • 变量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

    2. 次级Makefile生成virsh过程

      • 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的值为空。
        变量EXTRA_virsh_DEPENDENCIES未定义,其值为空。

      • virsh生成规则中的各依赖的值如下:

        virsh_OBJECTS = $(am_virsh_OBJECTS)

        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_DEPENDENCIES = $(am__DEPENDENCIES_1) ../src/libvirt-lxc.la \
                ../src/libvirt-qemu.la libvirt_shell.la $(am__append_13)

        am_virsh_OBJECTS中各个成员,在Makefile中可以明确找到生成规则。

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

    到此,可知道virsh的编译生成过程及由哪些代码文件编译生成。

  • virsh源码框架分析

    virsh的角色:是一个客户端,通过网络将命令发送给libvirtd;libvirtd完成命令后将结果通过网络返回给virsh,virsh再将结果展示给用户。

    virsh运行框架流程如图:

    virsh flow chart

     

如果觉得本文不错,欢迎打赏