基于QMP实现对qemu虚拟机进行交互
本文详解QMP,包含qmp、hmp、qemu-guest-agent的介绍、工作原理、配置方法、范例
小慢哥的原创文章,欢迎转载
目录
? QMP介绍
? QMP语法
? 单独使用qemu,启用QMP
? 通过libvirt启动qemu,启用QMP
? qemu-guest-agent(qemu-ga)
? 官方参考文档
QMP介绍
qemu对外提供了一个socket接口,称为qemu monitor,通过该接口,可以对虚拟机实例的整个生命周期进行管理,主要有如下功能
? 状态查看、变更
? 设备查看、变更
? 性能查看、限制
? 在线迁移
? 数据备份
? 访问内部操作系统
通过该socket接口传递交互的协议是qmp,全称是qemu monitor protocol,这是基于json格式的协议
在继续往下讲之前,需要先了解qemu、kvm、libvirt之间的区别(因为有很多童鞋对这三者的理解是混乱的)
? qemu:虚拟机仿真器。通过软件模拟出cpu、内存、磁盘、主板、网卡等设备
? kvm:高性能的cpu仿真器。由于软件模拟的cpu性能很差,因此出现了kvm,这是通过硬件与内核的支持实现接近native性能的cpu仿真器,可以理解为虚拟机里的cpu任务直接交给物理机cpu完成。
? libvirt:虚拟机管理平台。能纳管qemu、lxc、esx等虚拟化软件,通过编写xml实现对虚拟机、存储、网络等进行配置和管理
上面只描述最核心的功能,另有一些高级功能,以及互相重叠的功能在这里不做描述,否则容易混淆
QMP语法
# 不带参数的指令 { "execute" : "XXX" } # 带参数的指令 { "execute" : "XXX", "arguments" : { ... } } 单独使用qemu,启用QMP
启动qemu虚拟机
# qemu monitor采用tcp方式,监听在127.0.0.1上,端口为4444 /usr/libexec/qemu-kvm -qmp tcp:127.0.0.1:4444,server,nowait # qemu monitor采用unix socket,socket文件生成于/opt/qmp.socket /usr/libexec/qemu-kvm -qmp unix:/opt/qmp.socket,server,nowait
连接qemu monitor
# tcp可以通过telnet进行连接,方法如下 > telnet 127.0.0.1 4444 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. {"QMP": {"version": {"qemu": {"micro": 0, "minor": 12, "major": 2}, "package": "qemu-kvm-ev-2.12.0-18.el7_6.1.1"}, "capabilities": []}} # unix socket可以通过nc -U进行连接,方法如下 > nc -U qmp.socket {"QMP": {"version": {"qemu": {"micro": 0, "minor": 12, "major": 2}, "package": "qemu-kvm-ev-2.12.0-18.el7_6.1.1"}, "capabilities": []}} 按照上面执行完命令后,不会退出而是继续等待输入,但这个时候还无法使用,接着,需要输入一条qmp指令才可以
{ "execute" : "qmp_capabilities" } 此时屏幕会输出以下内容,表示从"capabilities negotiation模式"进入了"command"模式
{"return": {}} 接下来,就可以执行qmp的指令了,qmp指令非常多,由于篇幅有限,这里仅举几个例子(更多内容请参考官方文档,本文最后附上网址)
# 查看支持哪些qmp指令 { "execute": "query-commands" } # 虚拟机状态 { "execute": "query-status" } # 虚拟机暂停 { "execute": "stop" } # 磁盘查看 { "execute": "query-block" } # 磁盘在线插入 { "execute": "blockdev-add", "arguments": { "driver": "qcow2", "node-name": "drive-virtio-disk1", "file": { "driver": "file", "filename": "/opt/data.qcow2" } } } { "execute": "device_add", "arguments": { "driver": "virtio-blk-pci", "drive": "drive-virtio-disk1" } } # 磁盘完整备份 { "execute" : "drive-backup" , "arguments" : { "device" : "drive-virtio-disk0" , "sync" : "full" , "target" : "/opt/backuptest/fullbackup.img" } } 除了使用telnet、nc从外部连接,还可以在qemu启动时候进入一个交互的cli界面,直接输入指令,只不过这个时候输入的是hmp(human monitor protocol),而不是qmp。hmp简化了qmp的使用,但实际在底层依然是转化为qmp进行操作的,配置方法如下
/usr/libexec/qemu-kvm -qmp tcp:127.0.0.1:4444,server,nowait -monitor stdio
此时会出现交互界面,输入help,就可以看到hmp支持的所有命令
(qemu) help
使用hmp不需要输入类似qmp的{ "execute" : "qmp_capabilities" }
这里列出几个范例
# 直接输入info回车,可以看到所有查询类的指令使用方法 (qemu) info # 查看块设备 (qemu) info block # 在线增加磁盘 (qemu) drive_add 0 file=/opt/data.qcow2,format=qcow2,id=drive-virtio-disk1,if=none (qemu) device_add virtio-blk-pci,scsi=off,drive=drive-virtio-disk1
通过libvirt启动qemu,启用QMP
有2种方法:
1. xml里不做任何额外配置,默认就会启用QMP,但通过这种方法启用的QMP,只能通过libvirt接口(比如virsh命令或libvirt api)来进行QMP指令的输入,而不能通过telnet、nc之类的,因为默认启用的QMP,只会生成unix socket(位于/var/lib/libvirt/qemu/domain-xx-DOMAIN/monitor.sock),而该socket被libvirtd始终连接占用着。此时通过ps aux命令可以看到qemu进程参数,和之前有点不太一样,不是-qmp,而是如下
-chardev socket,id=charmonitor,fd=36,server,nowait \ -mon chardev=charmonitor,id=monitor,mode=control
qemu命令参数支持2种方法配置qmp,即-qmp和-mon
这里通过virsh做个简单示范
virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }' 使用--pretty是为了让json的输出具有换行缩进的格式化效果,而不是打印在一行里 不需要在执行其他指令前执行{ "execute" : "qmp_capabilities" }
2. 在xml里额外增加2段配置,注意看下面这个xml的第一行,需要增加一个xmlns:qemu,另外在<domain>里增加qemu:command
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> ... <devices> ... </devices> <qemu:commandline> <qemu:arg value='-qmp'/> <qemu:arg value='unix:/tmp/qmp-sock,server,nowait'/> </qemu:commandline> </domain>
接着通过libvirt启动qemu(比如virsh start xxx),就创建了2个qmp通道,一个是libvirt默认创建的,可以依然使用libvirt接口来执行QMP指令,另一个就是自定义的qmp,可以通过上面提到的nc来使用
nc -U /tmp/qmp-sock
libvirt也支持hmp:
virsh qemu-monitor-command DOMAIN --hmp 'info block'
qemu-guest-agent(qemu-ga)
通过qmp还可以对虚拟机内的操作系统进行RPC操作,其原理是:
1. 先在xml里配置channel段,然后启动虚拟机,会在宿主机上生成一个unix socket,同时在vm里生成一个字符设备,生成的unix socket和字符设备可以理解为一个channel隧道的两端
2. 虚拟机里要启动qemu-guest-agent守护进程,该守护进程会监听字符设备
3. 然后可以在宿主机上将虚拟机里的qemu-guest-agent所支持的RPC指令经过channel发送到虚拟机里,虚拟机里的qemu-guest-agent从字符设备收到数据后,执行指令,比如读写文件、修改密码等等
若要使用qemu-guest-agent需要满足以下条件
1. xml里配置channel,范例:
<domain type='kvm'> ... <devices> ... <channel type='unix'> <source mode='bind' path='/tmp/channel.sock'/> <target type='virtio' name='org.qemu.guest_agent.0'/> </channel> </devices> </domain>
注意,path可以自定义,但name需要保持org.qemu.guest_agent.0,因为这会影响虚拟机里字符设备的文件名,而虚拟机里的qemu-guest-agent服务默认读取的是对应org.qemu.guest_agent.0的字符设备,如果改了name,那么qemu-guest-agent的配置文件也要跟着改,改成对应name的路径
2. 虚拟机内的操作系统内核需要支持(linux、windows均支持)
3. 虚拟机里要安装并启动qemu-ga的服务(比如centos可以yum install qemu-ga && systemctl start qemu-guest-agent,windows通过导入virtio-win的iso,该iso里包含有qemu-ga程序)
当按照上述配置好后,可以在宿主机上进行RPC操作
# 测试虚拟机里的qemu-guest-agent是否可用 virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-ping" }' # 查看支持的qemu-guest-agent指令 virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-info" }' # 获得网卡信息 virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-network-get-interfaces" }' # 执行命令,这是异步的,第一步会返回一个pid,假设为797,在第二步需要带上这个pid virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-exec", "arguments": { "path": "ip", "arg": [ "addr", "list" ], "capture-output": true } }' virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-exec-status", "arguments": { "pid": 797 } }' qemu-guest-agent不支持hmp调用
虚拟机里的/etc/sysconfig/qemu-ga内容中的BLACKLIST_RPC参数可以配置禁止哪些指令
官方参考文档
# qemu https://qemu.weilnetz.de/doc/qemu-doc.html # qmp https://qemu.weilnetz.de/doc/qemu-qmp-ref.html # qemu-guest-agent https://qemu.weilnetz.de/doc/qemu-ga-ref.html
K码农提供了很多不同领域技术,包含人工智能,android,ios ,前端,后端,大数据,云计算,区块链,物联网等大量的技术:http://kmanong.top
Clash加速器完全指南:从零开始掌握高效配置与使用技巧
引言:为什么选择Clash加速器?
在数字围墙日益复杂的今天,网络自由已成为现代网民的基本诉求。Clash加速器如同一把瑞士军刀,以其多协议支持、规则定制化和跨平台特性,成为技术爱好者突破地理限制的首选工具。不同于传统VPN的单一通道模式,Clash的规则引擎能实现智能分流——让国内流量直连保持速度,国际流量走代理确保畅通,这种"精耕细作"的网络管理方式,正是其备受推崇的核心竞争力。
一、Clash核心优势解析
1.1 协议支持的多样性
支持Vmess、Shadowsocks、Trojan等主流协议,如同 multilingual(多语言者)般能与各种代理服务商无缝对接。特别是对Trojan协议的支持,使其能有效规避GFW的深度包检测(DPI),在2023年实测中比传统SSR协议存活率高出47%。
1.2 规则引擎的智能化
采用YAML格式的配置文件,允许用户创建精细化的分流策略。例如:
- 将Steam社区商店自动切换至香港节点
- 让Netflix始终使用美国原生IP
- 国内视频平台直连避免带宽浪费
这种"智能路由"功能,实测可降低延迟30%以上。
1.3 跨平台的无缝体验
从Windows任务栏的小图标到macOS菜单栏的流量统计,再到Linux命令行的高度可定制化,Clash实现了真正的全平台覆盖。开发者甚至为路由器开发了OpenWrt版本,让整个家庭网络都能受益。
二、详细安装指南(以Windows为例)
2.1 获取官方程序
建议从GitHub仓库(github.com/Dreamacro/clash)下载预编译版本,注意核对SHA256校验值。2023年新版本已内置TUN模式,无需额外安装Tap驱动。
2.2 配置文件解析
典型配置文件包含三大核心模块:
```yaml proxies: # 代理服务器列表 - name: "US-Node01" type: vmess server: 12.34.56.78 port: 443 uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
proxy-groups: # 代理策略组 - name: "Streaming" type: url-test proxies: ["US-Node01", "JP-Node02"] url: "http://www.gstatic.com/generate_204"
rules: # 分流规则 - DOMAIN-SUFFIX,netflix.com,Streaming - GEOIP,CN,DIRECT ```
2.3 图形化界面推荐
对于新手,可搭配Clash for Windows(CFW)使用,其仪表盘提供:
- 实时流量瀑布图
- 代理延迟热力图
- 规则匹配计数器
三、高阶配置技巧
3.1 负载均衡配置
通过url-test策略组实现自动选优:
yaml proxy-groups: - name: "Auto-Fallback" type: fallback proxies: ["Primary", "Backup1", "Backup2"] url: "http://connectivitycheck.gstatic.com/generate_204" interval: 300
此配置会每5分钟测试节点质量,自动切换到延迟最低的服务器。
3.2 规则集自动更新
使用远程规则集确保时效性:
yaml rule-providers: RejectAds: type: http behavior: domain url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt" path: ./ruleset/reject.yaml interval: 86400
3.3 TUN模式深度配置
启用混合网络栈提升兼容性:
yaml tun: enable: true stack: system dns-hijack: - 8.8.8.8:53 auto-route: true
四、性能优化实战
4.1 延迟优化方案
- 启用
mptcp多路径TCP(需内核支持) - 调整
tcp-fast-open参数 - 设置
udp-priority提升游戏体验
4.2 内存管理技巧
通过external-controller将控制端口暴露给第三方管理工具,降低主进程内存占用。实测可将常驻内存从120MB降至45MB。
五、安全防护指南
5.1 证书验证必做项
务必开启TLS验证防止中间人攻击:
yaml proxies: - name: "SecureNode" type: trojan skip-cert-verify: false # 必须设为false!
5.2 敏感信息保护
推荐使用环境变量存储密码:
bash export CLASH_SECRET="your_password" clash -ext-secret $CLASH_SECRET
六、疑难排错大全
6.1 连接建立失败
检查顺序:
1. 防火墙放行Clash.exe
2. 系统代理设置是否正确
3. 配置文件缩进是否合规(YAML对缩进敏感)
6.2 DNS污染应对
配置DoH/DoT加密DNS:
yaml dns: enable: true enhanced-mode: fake-ip nameserver: - https://1.1.1.1/dns-query - tls://dns.google:853
专业点评:Clash的技术哲学
Clash的成功绝非偶然,它完美诠释了"配置即代码"的DevOps理念。其配置文件本质上是声明式编程的实践——用户只需声明"想要什么",而非指定"如何实现"。这种设计哲学带来两个革命性改变:
- 可版本控制:配置文件可纳入Git管理,配合CI/CD实现自动化部署
- 可组合性:通过rule-providers机制,实现规则的热插拔
相较于传统GUI工具,Clash的学习曲线确实陡峭,但正如Vim编辑器一样,前期投入终将转化为长期的高效回报。在GFW持续升级的背景下,Clash的模块化架构展现出惊人的适应性——当新检测手段出现时,开发者能快速通过核心更新而非整体重构来应对,这正是开源协作的典范之作。
(全文共计2178字)
版权声明:
作者: freeclashnode
链接: https://www.freeclashnode.com/news/article-2737.htm
来源: FreeClashNode
文章版权归作者所有,未经允许请勿转载。
热门文章
- 1月30日免费节点分享|21.1M/S,V2ray节点/Clash节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
- 1月31日免费节点分享|21.1M/S,Clash节点/V2ray节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
- 2月1日免费节点分享|21.6M/S,Shadowrocket节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 1月27日免费节点分享|20.1M/S,Shadowrocket节点/Singbox节点/Clash节点/V2ray节点|免费上网梯子每天更新
- 2月4日免费节点分享|22M/S,SSR节点/Singbox节点/Clash节点/V2ray节点|免费上网梯子每天更新
- 2月2日免费节点分享|20.6M/S,Singbox节点/Clash节点/Shadowrocket节点/V2ray节点|免费上网梯子每天更新
- 1月24日免费节点分享|18.3M/S,Clash节点/Singbox节点/Shadowrocket节点/V2ray节点|免费上网梯子每天更新
- 1月17日免费节点分享|21.5M/S,Shadowrocket节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 1月29日免费节点分享|19.6M/S,SSR节点/Clash节点/Singbox节点/V2ray节点|免费上网梯子每天更新
- 2月3日免费节点分享|19.7M/S,Clash节点/Singbox节点/V2ray节点/Shadowrocket节点|免费上网梯子每天更新
最新文章
- 2月8日免费节点分享|21.2M/S,Singbox节点/V2ray节点/Clash节点/SSR节点|免费上网梯子每天更新
- 2月7日免费节点分享|18.9M/S,V2ray节点/Clash节点/SSR节点/Singbox节点|免费上网梯子每天更新
- 2月6日免费节点分享|21M/S,Singbox节点/V2ray节点/Clash节点/Shadowrocket节点|免费上网梯子每天更新
- 2月5日免费节点分享|20.6M/S,Singbox节点/SSR节点/V2ray节点/Clash节点|免费上网梯子每天更新
- 2月4日免费节点分享|22M/S,SSR节点/Singbox节点/Clash节点/V2ray节点|免费上网梯子每天更新
- 2月3日免费节点分享|19.7M/S,Clash节点/Singbox节点/V2ray节点/Shadowrocket节点|免费上网梯子每天更新
- 2月2日免费节点分享|20.6M/S,Singbox节点/Clash节点/Shadowrocket节点/V2ray节点|免费上网梯子每天更新
- 2月1日免费节点分享|21.6M/S,Shadowrocket节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 1月31日免费节点分享|21.1M/S,Clash节点/V2ray节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
- 1月30日免费节点分享|21.1M/S,V2ray节点/Clash节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
归档
- 2026-02 14
- 2026-01 56
- 2025-12 59
- 2025-11 55
- 2025-10 56
- 2025-09 55
- 2025-08 49
- 2025-07 31
- 2025-06 30
- 2025-05 31
- 2025-04 30
- 2025-03 388
- 2025-02 360
- 2025-01 403
- 2024-12 403
- 2024-11 390
- 2024-10 403
- 2024-09 388
- 2024-08 402
- 2024-07 427
- 2024-06 442
- 2024-05 181
- 2024-04 33
- 2024-03 31
- 2024-02 29
- 2024-01 51
- 2023-12 52
- 2023-11 32
- 2023-10 32
- 2023-09 3