6

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

>>> 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> 在这里找到自己的人们:

更新 2013-10-04

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

4

1 回答 1

9

在注册事件之前,请确保您已在 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)

祝你好运!

//濑户

于 2012-01-24T08:32:00.790 回答