我正在使用运行虚拟机
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
Run Code Online (Sandbox Code Playgroud)
要获取 IP 地址,我必须使用:
ps -ef | grep qemu
arp | grep -i DE:AD:BE:EF:38:C4
ip neigh | grep -i DE:AD:BE:EF:38:C4
Run Code Online (Sandbox Code Playgroud)
之后,阅读了wiki,我已经qemu-guest-agent
在来宾中安装并启用了。
sudo apt install qemu-guest-agent
sudo systemctl start qemu-guest-agent
sudo systemctl enable qemu-guest-agent
Run Code Online (Sandbox Code Playgroud)
我已经使用运行虚拟机
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
Run Code Online (Sandbox Code Playgroud)
所以,套接字位于/tmp/qga.sock
.
现在我不明白如何使用这个套接字来获取来宾的主机名和IP。
需要明确的是,我已经检查了如何查找 KVM 虚拟机的 IP 地址,我可以通过 SSH 访问它吗?,但我没兴趣使用virt-manager
。
从QEMU 文档示例来看,socat
可用于通过套接字查询来宾代理的 API。由于一切似乎都是 JSON 格式,因此最好jq
也安装该工具。
Run Code Online (Sandbox Code Playgroud)mdroth@illuin:~$ sudo socat unix-connect:/tmp/qga.sock readline
[...]
Run Code Online (Sandbox Code Playgroud){"execute": "guest-info"}
[...]
上面的命令除其他外还给出了可以发送的所有可能命令的列表。
在我的 Debian 系统上,readline功能在 中被禁用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
},
[...]
Run Code Online (Sandbox Code Playgroud)
现在可以使用以下方法发送{"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
Run Code Online (Sandbox Code Playgroud)
空值(没有地址的接口)的错误处理留作练习。
对于主机名部分,更简单,有一个值。命令是"guest-get-host-name"
:
{ echo '{"execute": "guest-get-host-name"}'; sleep 2; } | socat unix-connect:/tmp/qga.sock - | jq -r '."return"."host-name"'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5072 次 |
最近记录: |