Libvirt は、VM 内で実行される Qemu ゲスト エージェントを使用します。この投稿では、Qemu エージェントが KVM ホストとゲストの間の通信チャネルとして機能する方法について詳しく説明します。
通信プロトコル
VM OS の情報を取得したり、ゲスト OS にコマンドを発行したりするために使用される通信プロトコルは、Qemu Machine Protocol (QMP) です。 QMP は JSON ベースのプロトコルです。
たとえば、libvirt はゲストエージェントを使用して、ゲストからファイルシステムの詳細をフェッチします。ゲスト エージェントが動作しているかどうかを確認するには:
# virsh qemu-agent-command >vm_name> '{"execute": "guest-info"}'
例:
# virsh qemu-agent-command TestVM '{"execute": "guest-get-host-name"}' --pretty Please enter your authentication name: vdsm@ovirt Please enter your password: { "return": { "host-name": "<VM FQDN>" }
# virsh qemu-agent-command TestVM '{"execute": "guest-get-osinfo"}' --pretty Please enter your authentication name: vdsm@ovirt Please enter your password: { "return": { "name": "Oracle Linux Server", "kernel-release": "4.14.35-1902.300.11.el7uek.x86_64", "version": "7.8", "variant": "Server", "pretty-name": "Oracle Linux Server 7.8", "version-id": "7.8", "variant-id": "server", "kernel-version": "#2 SMP Tue Mar 17 17:11:47 PDT 2020", "machine": "x86_64", "id": "ol" } }
通信方法
ゲスト エージェントとホスト間の通信は、virtio-serial および isa-serial チャネル org.qemu.guest_agen.0 を介して行われます。
– VM ゲストからの qemu.guest_agent プロセス:
# ps auxwww |grep guest root 811 0.0 0.0 44232 4572 ? Ss Feb22 0:51 /usr/bin/qemu-ga --method=virtio-serial --path=/dev/virtio -ports/org.qemu.guest_agent.0 --blacklist=guest-file-open,guest-file-close,guest-file-read,guest-file-write,guest-file-seek ,guest-file-flush,guest-exec,guest-exec-status -F/etc/qemu-ga/fsfreeze-hook
– ホストから、対応するソケット ファイルも /var/lib/libvirt/qemu/channels/
# file /var/lib/libvirt/qemu/channels/56f42910-82d1-4e14-b4a4-646d220567c7.org.ovirt.hosted-engine-setup.0 /var/lib/libvirt/qemu/channels/56f42910-82d1-4e14-b4a4-646d220567c7.org.ovirt.hosted-engine-setup.0: socket
# virsh -r dumpxml TestVM |grep guest_agent <source mode='bind' path='/var/lib/libvirt/qemu/channels/56f42910-82d1-4e14-b4a4-646d220567c7.org.qemu.guest_agent.0'/> <target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
通信に問題がなければ、UNIX ソケットには「ESTAB」接続があります:
# ss |grep guest_agent u_str ESTAB 0 0 /var/lib/libvirt/qemu/channels/56f42910-82d1-4e14-b4a4-646d220567c7.org.qemu.guest_agent.0 82797274 * 82971852 u_str ESTAB 0 0 /var/lib/libvirt/qemu/channels/9c798303-1c30-4965-b447-e1c12588db14.org.qemu.guest_agent.0 82944156 * 82971680
通信間隔
デフォルトでは、VDSM は QEMU ゲスト エージェント (qemu-ga) を 5 分ごとにポーリングして情報を取得します。 QEMU ゲスト エージェントが実行されておらず、5 分以内に応答する場合、libvirtd は「ゲスト エージェントが応答していません:QEMU ゲスト エージェントが接続されていません」のようなエラーを報告します。
その他
hmp と呼ばれる QMP のサブネットも利用できます。 「qemu-monitor-command」は、-hmp オプションにより、「hmp」形式で情報を交換する機能を備えています。 ovirt-guest-agent に接続されている virtio-serial ポートのステータスを確認するには:
# virsh qemu-monitor-command --hmp <Virtual Machine Name Here> 'info qtree'
例:
# virsh qemu-monitor-command --hmp TestVM 'info qtree' Please enter your authentication name: vdsm@ovirt Please enter your password: dev: virtserialport, id "channel1" chardev = "charchannel1" nr = 2 (0x2) name = "org.qemu.guest_agent.0" port 2, guest on, host on, throttle off