前言
在Xen 半虚拟环境下增加新的设备,首先需要将新设备进行注册,前后端设备的注册可通过3步完成。
v 对配置文件进行解析,获取虚拟设备的信息
v 根据获取的虚拟设备信息将设备写入到XenStore上
v XenBus遍历XenStore目录,将前后端设备注册到XenBus总线
备注:前后端设备既可以在XenBus初始化时加载,也可以通过Hotplug的方式加载。虚拟机启动时会初始化XenBus总线,在初始化过程中将遍历XenStore读取所有前端设备信息,然后注册前端设备到XenBus总线,后端设备则通过Hotplug方式注册到XenBus总线。
具体实现过程如下:
(一)解析配置文件,获取自定义设备信息
配置文件中关于自定义设备的信息如下
mydevice=[‘example=zxm’]
在之前的博客中提到过配置文件的编写,可参考博客:http://blog.csdn.net/ysbj123/article/details/49497059
配置文件中虚拟机的配置信息是由一条条包含等号的字符串表示,等号左边代表配置项,等号右边代表选项信息。对配置文件的解决,就是将配置文件中的这些字符串进行提取,然后将提取到的信息保存到配置文件字典中,格式为键值对。
接下来就是代码追踪阶段了,关于Xen源码分析的资料网上很少,所以我通过一层层的追踪代码,最终找到了正确解析配置文件的方法。
首先从创建半虚拟机命令入手:xl create myexample -c
1. Xl_cmdtable.c
查看cmdtable: main_create( )函数用来实现xl create 命令
2. Xl_cmdimpl.c
main_create( ):位于Xl_cmdimpl.c
v 定义一个libxl_domain_config 类型变量 d_config;
n Libxl_domain_config_init:
n Libxl_domain_create_info
n rc = create_domain( );
create_domain( ):
v 初始化配置文件变量:
n Libxl_domain_config_init()
3. _libxl_types.C
Libxl_domain_config_init(libxl_domain_config *p):
v Libxl_domain_config 在_libxl_types.h中定义
n typedef struct libxl_domain_config{
Libxl_domain_create_info c_info;
Libxl_domain_build_info b_info;
Int num_disks;
Libxl_device_disk *disks;
......
//添加自定义设备mydevice;
int num_mydevices;
libxl_device_mydevice *mydevices;
......
}
v 分别初始化libxl_domain_create_info c_info、libxl_domain_build_info b_info;
n Lib_domain_create_info_init(p->c_info);
n Libxl_domain_build_info_init(p->b_info);
4. 回到Xl_cmdimpl.C
Parse_config_data():
v 添加XLU_ConfigList *mydevices;
v 添加解析代码
If(!Xlu_cfg_get_list(config,”disk”,&vbds,0,0)){
........
//解析代码
buf=xlu_cfg_get_listitem(mydevice,d_config->num_mydevice);
......
d_config->mydevice = (libxl_device_mydevice *)realloc(d_config->mydevices,sizeof(libxl_device_mydevice)*(d_config->num_mydevices+1));
libxl_device_mydevice_init(mydevice);
p=strtok(buf2,",");
......
}
回到create_domain():
Start:
ret=libxl_domain_create_new(...);
5、libxl_create.c
do_domain_create(.....);
init_domain_create(......);
至此,配置文件的解析结束。接下来是将介绍如何将设备信息写入Xenstore。