6

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バックエンドで機能すると予想されますか?

libvirt0.9.6とqemu-kvm0.15.1を含むFedora16システムを実行しています。

<searchengine>を介してここにいる人々のために:

更新2013-10-04

何ヶ月も後にいくつかのFedoraリリースがあり、libvirtgitリポジトリーのevent-test.pyコードはFedora19で正しく実行されます。

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 に答える