qemu-guest-agentを使用して仮想マシンのホスト名とIPアドレスを取得する方法

qemu-guest-agentを使用して仮想マシンのホスト名とIPアドレスを取得する方法

私は以下を使用して仮想マシンを実行しています。

qemu-system-x86_64 -accel kvm,thread=multi -cpu host -smp 1 -m 2048 \
-drive file=ubuntu-server1.qcow2,if=virtio -vga virtio -display none -daemonize \
-nic bridge,model=virtio-net-pci,mac=DE:AD:BE:EF:E0:00

IP アドレスを取得するには、以下を使用する必要があります。

ps -ef | grep qemu
arp | grep -i DE:AD:BE:EF:38:C4
ip neigh | grep -i DE:AD:BE:EF:38:C4

後で読むウィキペディアqemu-guest-agentゲストからインストールして有効にしました。

sudo apt install qemu-guest-agent
sudo systemctl start qemu-guest-agent
sudo systemctl enable qemu-guest-agent

私は以下を使って仮想マシンを実行しました。

qemu-system-x86_64 -accel kvm,thread=multi -cpu host -smp 1 -m 2048 \
-drive file=ubuntu-server1.qcow2,if=virtio -vga virtio -display none -daemonize \
-nic bridge,model=virtio-net-pci,mac=DE:AD:BE:EF:E0:00 \
-chardev socket,path=/tmp/qga.sock,server,nowait,id=qga0 \
-device virtio-serial \
-device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0

したがって、ソケットはにあります/tmp/qga.sock

これで、このソケットを使用してゲストのホスト名とIPを取得する方法を理解できません。

明確にするために確認しました。SSH経由で接続できるKVM仮想マシンのIPアドレスをどのように見つけますか?しかし、私はそれを使用することに興味がありませんvirt-manager

ベストアンサー1

~からQEMUドキュメントたとえば、socatソケットを介してゲストエージェントを照会するために使用できるAPIがあります。すべてがJSON形式のように見えるので、そのjqツールもインストールすることをお勧めします。

mdroth@illuin:~$ sudo socat unix-connect:/tmp/qga.sock readline

[...]

{"execute": "guest-info"}

[...]

上記のコマンドは、何よりも送信できるすべての可能なコマンドのリストを提供します。

私のDebianシステムでは読書船次の機能が無効になっています。socat、マニュアルページでは、代わりにstdio(alias -)を使用するように指示します。残念ながら出力が発生しないか不完全な場合がありますが、socatこの場合EOF条件が最適に処理されないようです。左側に遅延を追加すると問題が解決するようです。

これは次のとおりです(rootまたは適切なユーザーとして)。

{ echo '{"execute": "guest-info"}'; sleep 2; } | socat unix-connect:/tmp/qga.sock -| jq .

[...]
      {
        "enabled": true,
        "name": "guest-network-get-interfaces",
        "success-response": true
      },
[...]

これで{"execute": "guest-network-get-interfaces"}いくつかのフィルタを送信して使用できます(そして少しトレーニング)使用jq

# { echo '{"execute": "guest-network-get-interfaces"}'; sleep 2; } |
      socat unix-connect:/tmp/qga.sock - |
      jq -j '."return"[] | ."name", (."ip-addresses"[] | " ", ."ip-address","/",."prefix"),"\n"'
lo 127.0.0.1/8 ::1/128
ens3 192.0.2.2/24

null値(アドレスのないインターフェイス)のエラー処理は練習のままにします。

ホスト名部分にはより単純で値があります。コマンドは次のとおり"guest-get-host-name"です。

{ echo '{"execute": "guest-get-host-name"}'; sleep 2; } | socat unix-connect:/tmp/qga.sock - | jq  -r '."return"."host-name"'

おすすめ記事