wiki:linux/kvmmon

qemu monitor/agent

qemu monitor

kvm(qemu)には、QMPと呼ばれるプロトコルを使って、qemuのモニタを実行することができます。

# virsh qemu-monitor-command DOMAIN '{"execute": "query-version"}'|python -mjson.tool
{
    "id": "libvirt-7", 
    "return": {
        "package": "(qemu-kvm-0.12.1.2)", 
        "qemu": {
            "major": 0, 
            "micro": 1, 
            "minor": 12
        }
    }
}

qemu guest agent

VMのスナップショットを取得する際に、ゲストOSの状況を考慮せずにスナップショットを取得すると、ファイルシステムの整合性が取れずにファイルが消失したり、ディスクが壊れたりすることがあります。qemu guest agentをゲストOSに導入し、KVM側でqemu guest agentを利用する設定をすることにより、ホスト-ゲスト間の通信ができるようになり、fsfreezeを利用しスナップショット時にキャッシュやバッファ上のデータをディスク上に書き出してから安全にスナップショットを取ることができるようになります。

qemu guest agentを利用するには、libvirt xmlファイルにguestエージェントと通信するためのunix socketを作ってやります。

    <channel type='unix'>
      <source mode='bind' path='/var/lib/libvirt/qemu/LIVEBKUP1_TRUNK.agent'/>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>

XMLファイルは、/etc/libvirt/qemuにあります。編集したら、

# service libvirtd restart
# virsh start DOMAIN

ゲスト側では、

# yum install qemu-guest-agent
# service qemu-ga start

などで、qemu guest agentをインストール、起動します。ホスト側から、virsh qemu-agent-commandを実行することで、guest agentを介した操作をすることができます。

# virsh qemu-agent-command DOMAIN '{"execute":"guest-info"}' | python -mjson.tool
{
    "return": {
        "supported_commands": [
            {
                "enabled": true, 
                "name": "guest-network-get-interfaces"
            }, 
...
            {
                "enabled": true, 
                "name": "guest-fsfreeze-thaw"
            }, 
            {
                "enabled": true, 
                "name": "guest-fsfreeze-freeze"
            }, 
             {
                "enabled": true, 
                "name": "guest-fsfreeze-status"
            }, 
...
        ], 
        "version": "1.0"
    }
}

guest-network-get-interfacesコマンドを利用すると、ゲスト側のネットワーク設定を取得できます。

# virsh qemu-agent-command DOMAIN '{"execute":"guest-network-get-interfaces"}' | python -mjson.tool
{
    "return": [
        {
            "hardware-address": "00:00:00:00:00:00", 
            "ip-addresses": [
                {
                    "ip-address": "127.0.0.1", 
                    "ip-address-type": "ipv4", 
                    "prefix": 8
                }, 
                {
                    "ip-address": "::1", 
                    "ip-address-type": "ipv6", 
                    "prefix": 128
                }
            ], 
            "name": "lo"
        }, 
        {
            "hardware-address": "52:54:00:47:20:de", 
            "ip-addresses": [
                {
                    "ip-address": "192.168.1.3", 
                    "ip-address-type": "ipv4", 
                    "prefix": 18
                }, 
                {
                    "ip-address": "fe80::5054:ff:fe47:20de", 
                    "ip-address-type": "ipv6", 
                    "prefix": 64
                }
            ], 
            "name": "eth0"
        }
    ]
}