首页 文章

我可以使用带有QEMU后端的libvirt Python模块注册事件回调吗?

提问于
浏览
7

我想编写一些代码来监控由libvirt管理的QEMU下运行的域的事件 . 但是,尝试注册事件处理程序会产生以下错误:

>>> import libvirt
>>> conn = libvirt.openReadOnly('qemu:///system')
>>> conn.domainEventRegister(callback, None)
libvir: Remote error : this function is not supported by the connection driver: no event support

(在这种情况下,“回调”是一个简单打印其参数的存根函数 . )

我能够找到关于libvirt事件处理的示例似乎并不具体说明哪些后端虚拟机管理程序支持哪些功能 . 这预计适用于QEMU后端吗?

我正在运行Fedora 16系统,其中包括 libvirt 0.9.6qemu-kvm 0.15.1 .

对于那些通过<searchengine>找到自己的人:

UPDATE 2013-10-04

许多月和一些Fedora版本之后,libvirt git存储库中的event-test.py代码在Fedora 19上正确运行 .

1 回答

  • 8

    在注册事件之前,请确保已在libvirt事件循环中注册(或设置自己的) .

    libvirt源附带了一个很好的事件处理示例(文件名为event-test.py) . 我附上了一个基于该代码的例子;

    import libvirt
    import time
    import threading
    
    def callback(conn, dom, event, detail, opaque):
        print "EVENT: Domain %s(%s) %s %s" % (dom.name(),
                                              dom.ID(),
                                              event,
                                              detail)
    
    eventLoopThread = None
    
    def virEventLoopNativeRun():
        while True:
            libvirt.virEventRunDefaultImpl()
    
    def virEventLoopNativeStart():
        global eventLoopThread
        libvirt.virEventRegisterDefaultImpl()
        eventLoopThread = threading.Thread(target=virEventLoopNativeRun,
                                           name="libvirtEventLoop")
        eventLoopThread.setDaemon(True)
        eventLoopThread.start()
    
    if __name__ == '__main__':
    
        virEventLoopNativeStart()
    
        conn = libvirt.openReadOnly('qemu:///system')
    
        conn.domainEventRegister(callback, None)
        conn.setKeepAlive(5, 3)
    
        while conn.isAlive() == 1:
            time.sleep(1)
    

    祝好运!

    //濑

相关问题