我正在使用运行虚拟机
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
之后,阅读wiki后,我已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。
为了清楚起见,我已经检查了如何找到 KVM 虚拟机的 IP 地址,我可以通过 SSH 进入它吗?,但我没有兴趣使用virt-manager
.
从QEMU 文档示例中,
socat
可用于通过其套接字查询来宾代理的 API。由于一切似乎都在 JSON 中,最好也jq
安装该工具。上面的命令除其他外提供了可以发送的所有可能命令的列表。
在我的 Debian 系统上,readline功能在 中被禁用
socat
,并且手册页告诉使用stdio
(alias-
) 代替。唉,有时输出不会发生或不完整,我怀疑socat
在这种情况下不能最佳地处理 EOF 条件。在左侧添加延迟似乎可以解决此问题。这变成(作为 root 或适当的用户):
现在可以使用以下方式发送
{"execute": "guest-network-get-interfaces"}
并使用一些过滤器(和一些培训)jq
:空值(没有地址的接口)的错误处理留作练习。
对于主机名部分,它更容易,只有一个值。命令是
"guest-get-host-name"
: