转自chinaunix上的一篇博文:
XenAPI:一个Xen的项目,目的是提供管理控制Xen所需要的数据模型和远程调用接口。
XenStore:一个存储Xen运行信息的机构,包含各个VM的信息,类似于Win中的注册表。
libxc 是一个C语言库,它提供了一些简单易用的API,使用户程序可以方便的和Hypervisor进行通信。它的工作原理很简单,主要封装了dom0中的/proc/xen/privcmd,/dev/xen/evtchn以及/dev/xen/gntdev提供的IOCTL接口。也就是说,我们本来可以直接通过上面这些内核级设备驱动进行相关的操作控制,但有了libxc之后,只需要调用其相应接口函数,由它负责数据结构的解析/封装,然后再与底层hypervisor通信。这就是为什么说xm发出命令之后,到达xend,而xend需要调用libxc再处理后才与底层hypervisor通信:libxc是一个接口库。
看到有这样的解析,借鉴一下:
/proc/xen/privcmd
1. xc_interface_open()
打开/proc/xen/privcmd,获得文件描述符。
2. xc_sysctl()
填充xen_sysctl结构体,发送ioctl请求。
3. xc_interface_close()
关闭1中打开的文件描述
/dev/xen/evtchn
1. xc_evtchn_open
2. xc_evtchn_notify等函数
evtchn的操作比较简单,不需要填充结构体,一般指明远程Dom id,port即可
3. xc_evtchn_close
/dev/xen/gntdev
1. xc_gnttab_open
2. xc_gnttab_map_grant_ref等
3. xc_gnttab_close
用来控制Xen内核的库,位于xen-../tools/libxc。包括两个部分:
一个是libxenctrl,封装了各种Hypercall提供的功能,其函数列表在xenctrl.h中列出;
另一个是libxenguest,提供在内核中创建domain的方法,其函数列表在xenguest.h中列出。
若在内核中通过修改hypercall的方式为Xen添加功能,需要在libxenctrl中进行封装。
libxc中的函数的第一个参数均为int xc_handler,这其实是一个句柄,这个句柄对应着dom0中与guest kernel进行交互的proc文件,即/proc/xen/privcmd。
libxc中进行Hypercall的调用可以利用do_domctl这个函数,这个函数的定义在xc_private.h中。do_domctl的第二个参数struct xen_domctl封装了一个hypercall的number and arguments。
如要在其中加入自己的新接口,需要在libxc目录下执行make install命令,之后,可以自己编写一个小型C程序,并引用,在编译时加入参数-lxenctrl就可以了。
Python
教程:
C与Python进行交互: 重点参考:concrete.html
在xen-.../tools/python/lowlevel文件夹下,有xc和xs两个子目录,其中分别实现了对libxc和libxenstore的封装。我们在libxc中添加自己的功能后,还需要在xc中进行python的封装,这样才能在python的代码中调用这个功能。
在python的代码中,初始化C封装的类通常会以如下代码:
import xen.lowlevel.xc
xc=xen.lowlevel.xc.xc()
Xend
Xend是一个守护进程,它的一个重要作用是充当各种RPC(Remote Procedure Call)服务器。其代码位于python/xen/xend目录下。其中的server子目录下是和RPC服务器有关的代码。server/XMLRPCServer.py这个文件中的run方法,是关于Xend把那些方法暴露到远程去的。
关于XMLRPC,参考文档:和
Xend中常见的功能:
XendConfig.py 这个类代表了创建domain的配置文件,它负责解析各种格式的domain配置文件并将他们转化为接近于XenAPI的表示方式。
XendDomain.py这个类表示了Xend中的一个虚拟机。也就是说它代表了Xend本身所存储的关于一个Domain的信息以及相关的方法。在XendDomain中形似domain_*的方法会被自动加入RPC服务器中,被添加成xend.domain.*方法。
XendDomainInfo.py这个类表示了Xen中的一个虚拟机。也就是说它代表了从Xen中通过hypercall获取的一个domain的信息,同时提供了操作domain的方法。XendDomainInfo中的方法往往是直接向Xen发命令,而XendDomain中的方法往往会调用XendDomainInfo中的方法。
XendAPI.py,这个是用来实现XenAPI的。
Xend的调试问题。Xend的标准输出是不会输出到屏幕上的,因此无法用print进行调试。解决方法是再xend
的配置文件/etc/xen/xend-config.sxp中加入loglevel DEBUG这一行,然后在平时用print的地方改用log.debug。最后在/var/log/xen/xend.log中可以看到输出的内容。另外,终端下推荐使用tail -f /var/log/xen/xend.log这一命令,它会把向一个文件中追加的内容打印到屏幕上。
xm,这个命令仅仅是解析命令行参数,创建一个远程过程调用实例(就是server这变量),然后根据配置文件的不同,如果使用XenAPI,就调用server.api.*这一系的方法,如果不使用XenAPI(默认情况),就调用server.xend.*这一系的方法。