libvirt的event监听机制和代码实现


1.简介

libvirt是目前使用最为广泛的对KVM虚拟机继续管理的工具和应用程序接口,而且一些常用的虚拟机管理工具(如virsh、virt-manager等)和云计算框架平台(如:OpenStack、ZStack等)都在底层使用libvirt的应用程序接口。
libvirt是为了更方便地管理平台虚拟化技术而设计的开放源代码的应用程序接口(libvirt API)、守护进程(libvirtd)和管理工具(virsh),它不仅提供了对虚拟化客户机的管理,也提供了对虚拟化网络和存储的管理。
libvirt支持事件机制,在使用该机制注册之后,可以在发生特定的事件(如:domain的启动、暂停、恢复和停止等)时得到自己定义的一些通知。该功能由以virStream开头的一系列函数实现。


2.通过virsh演示event监听

第一步:使用命令event --help,查看event命令后面需要接哪些选项。
在这里插入图片描述
第二步:使用命令event --all --loop --timestamp,监听hypervisor上所有domain的所有类型事件,并且循环监听,直到手动中断。
在这里插入图片描述
第三步:另外打开一个窗口,destroy,或者start虚拟机。
在这里插入图片描述
第四步:查看监听界面,会收到事件。
在这里插入图片描述

3.通过libvirt API实现event监听的流程图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. virEvent API简介

4.1 virEventRegisterDefaultImpl

语法
int virEventRegisterDefaultImpl (void)
描述
注册基于poll()系统调用的默认事件实现。这是一个通用实现,任何客户机应用程序都可以使用它,不需要与外部事件循环impl集成。
为了进行正确的事件处理,一定要在打开到Hypervisor的连接之前实现事件注册。
注册之后,应用程序必须在循环中调用 virEventRunDefaultImpl ()来处理事件。如果不这样做,可能会导致连接由于keepalive超时而被意外关闭。默认事件循环完全支持处理和超时事件,但只在libvirt API调用(如virEventAddHandle()或virConnectDomainEventRegisterAny())注册的事件上唤醒。
返回值
0,表示成功。1,表示失败。

4.2. virEventHandleType

handle事件的类型。
enum virEventHandleType {
VIR_EVENT_HANDLE_READABLE = 1 (0x1; 1 << 0) // 可读
VIR_EVENT_HANDLE_WRITABLE = 2 (0x2; 1 << 1) // 可写
VIR_EVENT_HANDLE_ERROR = 4 (0x4; 1 << 2) // 异常
VIR_EVENT_HANDLE_HANGUP = 8 (0x8; 1 << 3) // 挂起
}

4.3. virEventAddHandle

语法
int virEventAddHandle (int fd, int events, virEventHandleCallback cb, void * opaque, virFreeCallback ff)
描述
为监视文件句柄事件注册一个回调。这个函数要求一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值