【vdsm 源代码漫步】 1. 总体架构

vdsm的位置

Ovirt的总体架构请参考网站的其它文章。vdsm 在这个架构中处于底层,部署于主机之中。管理台是不存在vdsm代码的。vdsm的主要功能就是接收engine管理台的函数调用,并且执行。vdsm类似于linux操作系统中的驱动。它只接收engine的命令并进行处理,并不关心engine的逻辑是否正确。 vdsm就是一把刀,而engine就是拿刀的人。刀是没有思想的,同样vdsm也是没有用户逻辑的。

vdsm代码的构成

vdsm的核心代码如下:不同版本会有所不同,但是大的架构是类似的。

【vdsm 源代码漫步】 1. 总体架构

(1) 首先 vdsm存在一个服务vdsmd.service. 这个服务是vdsm的最初始入口。服务做两件事情,一个是检查当前的环境是否可以启动vdsmd进程。另一个事情便是在检查通过的情况下启动vdsmd服务。主要是启动相关线程,用来接收engine的命令,以及监控主机和虚拟机状况。代码从vdsmd.py开始一直看下去即可。

(2) vdsm作为engine的“驱动”,有专门的模块处理彼此的交互。交互协议主要是xmlrpc, jsonrpc等。vdsm做了技巧性的架构,把不同的交互协议进行了整合。用户甚至可以添加自己的交互协议。这一块的代码主要放在了rpc文件夹。

(3) vdsm需要处理大量的需求,因而会在适合的时候开辟若干线程。vdsm对于线程的管理是进行过设计的。主要还是通过线程池。不过这一块的代码有点散乱,不是很好梳理。线程在监控模块用的比较多。

(4)vdsm需要根据engine的要求对存储进行管理。包括文件存储,块存储,分布式文件存储,本地存储。代码主要放在了storage文件夹。这个模块是vdsm最复杂的模块之一(另一个是virt模块,主要用来管理虚拟机)。storage模块采用了经典的面向对象编程,层次感很强。 另外考虑到分布式存储的复杂性,其实现单独放在了gluster文件夹。

(5)vdsm一个另一个主要功能就是虚拟机的生成管理等。主要放在了virt文件夹。里面包含了虚拟机的各种操作。

这个模块是比较复杂的两个模块之一。主要还是调用libvirt来实现engine要求的功能。

(6) network文件夹下,存放了和网络管理有关的代码。代码写的很宽泛,但是在实际使用用到的只是一部分。

(7)profiling metrics host文件夹主要是启动线程进行监控,代码的难点在于理解线程的处理过程。监控内容本身还是比较简单的。

(8)vdsm作为一个集群管理工具,集群管理是不可少的,目前主要是通过sanlock处理集群,但是这一块的代码一直在演进,有些老代码没有删除,有些新代码没有启用。

(9)vdsm把一些需要root权限操作的内容单独拎了出来放到了supervdsm_api下面。

(10) 作为一套大型代码,一些公共服务函数,都放到了common或者tools里面。

代码阅读的难点

  1. vdsm的最终操作都会化为linux命令或者是linux api调用。所以需要对linux本身的存储管理,网络管理,常用命令,要深刻理解,熟练运用。
  2. vdsm毕竟是要实现虚拟化的。所以对于libvirt,qume 常用命令要熟悉。方便调试。
  3. vdsm的线程管理以及sanlock等处理,有些烦杂,需要认真对待。

后续

  1. 后续将对每一个模块进行详细说明。
  2. 本系列文章会假设读者对虚拟化有基本了解,对linux基本操作不陌生。
2 条回复 A 作者 M 管理员 E
  1. ,有后面更新 吗

  2. 有源码吗

欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论