文章目录
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)
描述
为监视文件句柄事件注册一个回调。这个函数要求一