溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么基于QMP實現(xiàn)對qemu虛擬機進行交互

發(fā)布時間:2021-08-31 11:23:25 來源:億速云 閱讀:208 作者:chen 欄目:云計算

本篇內(nèi)容介紹了“怎么基于QMP實現(xiàn)對qemu虛擬機進行交互”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!



目錄

? QMP介紹

? QMP語法

? 單獨使用qemu,啟用QMP

? 通過libvirt啟動qemu,啟用QMP

? qemu-guest-agent(qemu-ga)

? 官方參考文檔

QMP介紹

qemu對外提供了一個socket接口,稱為qemu monitor,通過該接口,可以對虛擬機實例的整個生命周期進行管理,主要有如下功能

? 狀態(tài)查看、變更

? 設(shè)備查看、變更

? 性能查看、限制

? 在線遷移

? 數(shù)據(jù)備份

? 訪問內(nèi)部操作系統(tǒng)

通過該socket接口傳遞交互的協(xié)議是qmp,全稱是qemu monitor protocol,這是基于json格式的協(xié)議

在繼續(xù)往下講之前,需要先了解qemu、kvm、libvirt之間的區(qū)別(因為有很多童鞋對這三者的理解是混亂的)

? qemu:虛擬機仿真器。通過軟件模擬出cpu、內(nèi)存、磁盤、主板、網(wǎng)卡等設(shè)備

? kvm:高性能的cpu仿真器。由于軟件模擬的cpu性能很差,因此出現(xiàn)了kvm,這是通過硬件與內(nèi)核的支持實現(xiàn)接近native性能的cpu仿真器,可以理解為虛擬機里的cpu任務(wù)直接交給物理機cpu完成。

? libvirt:虛擬機管理平臺。能納管qemu、lxc、esx等虛擬化軟件,通過編寫xml實現(xiàn)對虛擬機、存儲、網(wǎng)絡(luò)等進行配置和管理

上面只描述最核心的功能,另有一些高級功能,以及互相重疊的功能在這里不做描述,否則容易混淆

QMP語法

# 不帶參數(shù)的指令
{ "execute" : "XXX" }

# 帶參數(shù)的指令
{ "execute" : "XXX", "arguments" : { ... } }

單獨使用qemu,啟用QMP

啟動qemu虛擬機

# qemu monitor采用tcp方式,監(jiān)聽在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": []}}

按照上面執(zhí)行完命令后,不會退出而是繼續(xù)等待輸入,但這個時候還無法使用,接著,需要輸入一條qmp指令才可以

{ "execute" : "qmp_capabilities" }

此時屏幕會輸出以下內(nèi)容,表示從"capabilities negotiation模式"進入了"command"模式

{"return": {}}

接下來,就可以執(zhí)行qmp的指令了,qmp指令非常多,由于篇幅有限,這里僅舉幾個例子(更多內(nèi)容請參考官方文檔,本文最后附上網(wǎng)址)

# 查看支持哪些qmp指令
{ "execute": "query-commands" }

# 虛擬機狀態(tài)
{ "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的使用,但實際在底層依然是轉(zhuǎn)化為qmp進行操作的,配置方法如下

/usr/libexec/qemu-kvm -qmp tcp:127.0.0.1:4444,server,nowait -monitor stdio

此時會出現(xiàn)交互界面,輸入help,就可以看到hmp支持的所有命令

(qemu) help

使用hmp不需要輸入類似qmp的{ "execute" : "qmp_capabilities" }

這里列出幾個范例

# 直接輸入info回車,可以看到所有查詢類的指令使用方法
(qemu) info

# 查看塊設(shè)備
(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進程參數(shù),和之前有點不太一樣,不是-qmp,而是如下

-chardev socket,id=charmonitor,fd=36,server,nowait \
-mon chardev=charmonitor,id=monitor,mode=control

qemu命令參數(shù)支持2種方法配置qmp,即-qmp和-mon

這里通過virsh做個簡單示范

virsh qemu-monitor-command DOMAIN --pretty '{ "execute": "query-block" }'

使用--pretty是為了讓json的輸出具有換行縮進的格式化效果,而不是打印在一行里 不需要在執(zhí)行其他指令前執(zhí)行{ "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),就創(chuàng)建了2個qmp通道,一個是libvirt默認創(chuàng)建的,可以依然使用libvirt接口來執(zhí)行QMP指令,另一個就是自定義的qmp,可以通過上面提到的nc來使用

nc -U /tmp/qmp-sock

libvirt也支持hmp:

virsh qemu-monitor-command DOMAIN --hmp 'info block'

qemu-guest-agent(qemu-ga)

通過qmp還可以對虛擬機內(nèi)的操作系統(tǒng)進行RPC操作,其原理是:

1. 先在xml里配置channel段,然后啟動虛擬機,會在宿主機上生成一個unix socket,同時在vm里生成一個字符設(shè)備,生成的unix socket和字符設(shè)備可以理解為一個channel隧道的兩端

2. 虛擬機里要啟動qemu-guest-agent守護進程,該守護進程會監(jiān)聽字符設(shè)備

3. 然后可以在宿主機上將虛擬機里的qemu-guest-agent所支持的RPC指令經(jīng)過channel發(fā)送到虛擬機里,虛擬機里的qemu-guest-agent從字符設(shè)備收到數(shù)據(jù)后,執(zhí)行指令,比如讀寫文件、修改密碼等等

若要使用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,因為這會影響虛擬機里字符設(shè)備的文件名,而虛擬機里的qemu-guest-agent服務(wù)默認讀取的是對應(yīng)org.qemu.guest_agent.0的字符設(shè)備,如果改了name,那么qemu-guest-agent的配置文件也要跟著改,改成對應(yīng)name的路徑

2. 虛擬機內(nèi)的操作系統(tǒng)內(nèi)核需要支持(linux、windows均支持)

3. 虛擬機里要安裝并啟動qemu-ga的服務(wù)(比如centos可以yum install qemu-ga && systemctl start qemu-guest-agent,windows通過導(dǎo)入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" }'

# 獲得網(wǎng)卡信息
virsh qemu-agent-command DOMAIN --pretty '{ "execute": "guest-network-get-interfaces" }'

# 執(zhí)行命令,這是異步的,第一步會返回一個pid,假設(shè)為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調(diào)用

虛擬機里的/etc/sysconfig/qemu-ga內(nèi)容中的BLACKLIST_RPC參數(shù)可以配置禁止哪些指令

官方參考文檔

# 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

“怎么基于QMP實現(xiàn)對qemu虛擬機進行交互”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI