1. 程式人生 > >使用 monitor command 監控 QEMU 執行狀態

使用 monitor command 監控 QEMU 執行狀態

在虛擬化的研究領域,QEMU 有著舉足輕重的地位。2007 年 2 月釋出的 Linux 2.6.20 核心中,集成了 KVM 作為其虛擬化的具體實現。而 KVM 是基於 QEMU 並且利用 CPU 的輔助虛擬化特性而略加修改而成的。自此以後,QEMU 專案引起 Linux 開發人員的廣泛關注。

在啟動 QEMU 的時候,同時也會啟動 monitor 的控制檯,通過這個控制檯,可以與 QEMU 或者執行狀態的虛擬機器進行互動。雖然現在有諸如 virt-manager 之類的圖形介面的虛擬機器管理工具,但是在 monitor 的控制檯視窗輸入命令似乎更符合 Linux 程式設計師的開發習慣,而且還能完成一些圖形化管理工具所不具備的功能。在 monitor 控制檯中,可以完成很多常規操作,比如新增刪除裝置、虛擬機器音視訊擷取、獲取虛擬機器執行狀態、更改虛擬機器執行時配置等等。

事實上,啟動 QEMU 後通常是看不到 monitor 介面的。要進入該介面,可以在 QEMU 視窗啟用的時候按住 Ctrl+Alt+2 進入,切換回工作介面需要按 Ctrl+Alt+1。另外,還可以在 QEMU 啟動的時候指定 -monitor 引數。比如 -monitor stdio 將允許使用標準輸入作為 monitor 命令源。這種方式和常見的 Linux 互動式的使用者程式無異,所以在做測試工作的時候,可以很方便的編寫出對虛擬機器監控的 shell 指令碼程式。


清單 1. 使用標準輸入作為 QEMU monitor 命令源
				
 [[email protected]
]# qemu -hda rhel61-oc.img -m 1024 --enable-kvm -vnc :51 -monitor stdio Using CPU model "cpu64-rhel6" QEMU 0.12.1 monitor - type 'help' for more information (qemu)

QEMU monitor 的命令非常繁雜,並且由於 QEMU 是廣受關注的開源專案,程式碼更新也特別迅速。同樣,monitor 命令也會時常得到更新和升級。概括的說,命令可以分為如下幾個部分:

輔助類命令

有一部分命令可以稱為輔助性命令,比如 info 和 help。help 可以查詢顯示某個命令的簡要幫助資訊;info 命令主要用來顯示虛擬機器的執行資訊。比如 info blockstats 將顯示虛擬機器中的塊裝置的讀寫操作的資訊:讀入位元組、寫入位元組、讀寫操作的次數等。


清單 2. Info 命令顯示塊裝置狀態資訊
				
 (qemu) info blockstats 
 ide0-hd0: rd_bytes=42276864 wr_bytes=828416 rd_operations=2352 wr_operations=119 
 ide1-cd0: rd_bytes=0 wr_bytes=0 rd_operations=0 wr_operations=0 
 floppy0: rd_bytes=0 wr_bytes=0 rd_operations=0 wr_operations=0 


清單 3. Help 命令顯示 info 命令的幫助資訊
 (qemu) help savevm 
 savevm [tag|id] -- save a VM snapshot. 
                   If no tag or id are provided, a new snapshot is created 
 

除錯類命令

在某些場景下,需要遠端除錯 QEMU。正常情況下需要被除錯端安裝有 gdbserver 程式,否則將無法進行遠端除錯。而在 QEMU 的 monitor 中集成了 gdbserver,就解決了這個問題。內建的 gdbserver 允許被除錯端不安裝 gdbserver 就能進行遠端除錯。清單 4 中在 tcp 埠 12345 開啟了 gdbserver 的遠端除錯伺服程式。


清單 4. gdbserver 開啟除錯埠
				
 (qemu) gdbserver tcp::12345 
 Waiting for gdb connection on device 'tcp::12345'

在客戶機,就可以通過 gdb 連線到 gdbserver 的監聽埠進行除錯工作。與常規的本地程式除錯程式相似,清單 5 中顯示了執行中的 qemu 的堆疊資訊。


清單 5. 從客戶端連線 gdbserver 進行除錯工作
				
 $:~/work/qemu$ gdb qemu -q 
 Reading symbols from /home/wdongxu/work/qemu/qemu...done. 
 (gdb) target remote localhost:12345 
 Remote debugging using localhost:12345 
 Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done. 
 Loaded symbols for /lib/ld-linux.so.2 
 0xc012c21a in ?? () from /lib/ld-linux.so.2 
 (gdb) break qcow2_co_readv 
 Breakpoint 1 at 0x8077f1a: file block/qcow2.c, line 381. 
 (gdb) bt 
 #0  0x0018846b in ?? () 
 #1  0x0032d067 in ?? () 
 #2  0x0032d9d5 in ?? () 
 #3  0x0032c729 in ?? () 
 #4  0x0032d334 in ?? () 
 #5  0x0037006c in ?? () 
 #6  0x08123278 in configure_rtc_date_offset ( 
    startdate=0x81267af "\213FH\211\a\213FD\211G\004\215\203\254q", 
    legacy=-1080558488) at /home/wdongxu/work/qemu/vl.c:514 
 #7  0x0809cefa in bt_submit_hci (info=0xf2f1f0, 
    data=0x3 <Address 0x3 out of bounds>, length=163370640) 
    at /home/wdongxu/work/qemu/hw/bt-hci.c:1689 
 #8  0x0809d477 in bt_submit_hci (info=0xbf97fd44, 
    data=0x438001 "_alloc_failed_handler", length=18894760) 
    at /home/wdongxu/work/qemu/hw/bt-hci.c:1837 
 #9  0x081b6303 in cirrus_bitblt_rop_fwd_transp_notdst_16 (s=0x809d3b0, 
 ---Type <return> to continue, or q <return> to quit--- 

x/xp 用法基本上同 gdb 中的 x 相似:

  • x 用來列印虛地址的值。
  • xp 用來列印從某實地址開始的特定格式的值,比如類似於 x 命令使用的 10 進位制、16 進位制,甚至能夠以 i 作為格式列印指令序列。

清單 5 將列印 0x08123278 起始的一個位元組,然後列印了 eip 暫存器所示地址開始的三條指令。


清單 6. 從客戶端連線 gdbserver 進行除錯工作
				
 (qemu) x/b 0x08123278 
 0000000008123278: 0x8b 
 (qemu) xp /3i $eip 
 0x000000000018846b:  les    0x208039c0(%ebx),%ecx 
 0x0000000000188471:  add    (%eax),%al 
 0x0000000000188473:  add    %cl,(%edi) 

print 可以進行數學運算,也可以引用某暫存器的值,類似於 gdb 中的 print 命令。如清單 6 所示:


清單 7. print 進行數學運算
				
 (qemu) print 1 + 3 
 4 
 (qemu) print $eax 
 3079397632 
 (qemu) print $eax + 2 
 3079397634 

在除錯 QEMU 的時候,可能還會需要鑑別某一塊記憶體區域是否正確,這就需要 sum 命令來計算某一個記憶體區域的校驗和,也可以將記憶體轉儲到檔案供日後分析。


清單 8. 記憶體轉儲
				
 (qemu) x/10x 0x0809d477 
 000000000809d477: 0x8b 0x55 0xc8 0x8b 0x4d 0xc4 0x80 0x7d 
 000000000809d47f: 0xd0 0x00 
 (qemu) memsave 0x0809d477 10 mem.log 

清單 7 列印了一塊記憶體,並且將 10 個位元組的記憶體轉儲到 mem.log 檔案。清單 8 中用 hexdump 來校驗轉儲記憶體資料的正確性。


清單 9. 校驗記憶體轉儲
				
 $:~/work/qemu$ hexdump -C mem.log 
 00000000  8b 55 c8 8b 4d c4 80 7d  d0 00                    |.U..M..}..| 
 0000000a 
控制類命令

控制類命令操作虛擬機器、虛擬磁碟和 qemu。

QEMU 執行的時候,如果指定 -snapshot 引數,則會允許虛擬機器在執行的時候建立快照 (snapshot,類似於 Windows XP 中的一個系統還原點 )。在清單 9 中,首先用 info snapshots 檢視當前已經存在的快照資訊,然後用 savevm 命令建立了一個名為 save_name_1 的快照。再使系統還原到 vm-20111025134936 快照時的狀態,最後刪除了名為 save_name_1 的快照。


清單 10. snapshot 操作
				
 (qemu) info snapshots 
 ID        TAG                 VM SIZE                DATE       VM CLOCK 
 1         vm-20111025134936      202M 2011-10-25 13:49:36   00:02:19.524 
 (qemu) savevm save_name_1 
 (qemu) info snapshots 
 ID        TAG                 VM SIZE                DATE       VM CLOCK 
 1         vm-20111025134936      202M 2011-10-25 13:49:36   00:02:19.524 
 2         save_name_1            202M 2011-10-25 13:51:53   00:04:28.395 
 (qemu) loadvm vm-20111025134936 
 (qemu) delvm save_name_1 
 (qemu) info snapshots 
 ID        TAG                 VM SIZE                DATE       VM CLOCK 
 1         vm-20111025134936      202M 2011-10-25 13:49:36   00:02:19.524 
 (qemu) 



由於塊裝置允許使用快取,所以會有在虛擬機器執行的時候可能會有某些寫操作未實際寫到裝置上。commit 命令將對塊裝置執行強制重新整理操作。對於仍然在快取中的資料,將會立即寫入到塊裝置上。

對於虛擬機器的開關控制,system_reset/system_powerdown 則相當於在電腦上的 reset 和 powerdown 按鈕,將強制虛擬機器進行重啟和關機操作。stop/cont 將使得虛擬機器進入 / 退出掛起狀態。而 quit 則將直接退出 qemu.

裝置類命令

change 命令用的比較廣泛。能在虛擬機器執行的時候動態更改虛擬機器的配置。清單 10 中首先將啟動 QEMU 時指定的 vnc :1 埠更改為 :2,然後將 ubuntu-11.04-desktop-i386.iso 作為虛擬 CD 插入到 ide1-cd0 中,最後將其彈出。我們可以通過 info block 來檢視每步塊裝置的變化情況。


清單 11. change 更改系統配置
				
 (qemu) change vnc :2 
 (qemu) change ide1-cd0 /home/public/ubuntu-11.04-desktop-i386.iso 
 (qemu) info block 
 virtio0: removable=0 io-status=ok file=/tmp/vl.KsIMFQ \
  backing_file=/home/public/ubuntu.img ro=0 drv=qcow2 encrypted=0 
 ide1-cd0: removable=1 locked=0 tray-open=0 io-status=ok \
 file=/home/public/ubuntu-11.04-desktop-i386.iso ro=0 drv=raw encrypted=0 
 floppy0: removable=1 locked=0 tray-open=0 [not inserted] 
 sd0: removable=1 locked=0 tray-open=0 [not inserted] 
 (qemu) eject ide1-cd0 
 (qemu) info block 
 virtio0: removable=0 io-status=ok file=/tmp/vl.KsIMFQ \
 backing_file=/home/public/ubuntu.img ro=0 drv=qcow2 encrypted=0 
 ide1-cd0: removable=1 locked=0 tray-open=1 io-status=ok [not inserted] 
 floppy0: removable=1 locked=0 tray-open=0 [not inserted] 
 sd0: removable=1 locked=0 tray-open=0 [not inserted] 

可能是由於相容性問題,QEMU 在滑鼠的虛擬化方面做的並不是十分完美。經常有使用者抱怨客戶作業系統的游標和宿主游標不同步的問題。如果熟悉 monitor 命令,可以變通的解決這一問題。清單 11 將滑鼠移動到 (500,500) 的位置,然後虛擬機器中的滑鼠按下了左鍵,最後向虛擬機發送了 Ctrl+Alt+Del。


清單 12. 滑鼠和鍵盤操作
				
 (qemu) mouse_move 500 500 
 (qemu) mouse_button 1 
 (qemu) sendkey ctrl-alt-del 

小結

本文介紹了 QEMU monitor 的常用命令,並且大部分給出了執行的例項,希望對使用 QEMU 進行開發和測試的讀者有所幫助。當然 monitor 的命令還有很多,比如做遷移測試的時候可能會用到 migrate 系列的命令,需要讀者根據 QEMU 的進化演變逐漸地學習和體會。


相關推薦

使用 monitor command 監控 QEMU 執行狀態

在虛擬化的研究領域,QEMU 有著舉足輕重的地位。2007 年 2 月釋出的 Linux 2.6.20 核心中,集成了 KVM 作為其虛擬化的具體實現。而 KVM 是基於 QEMU 並且利用 CPU 的輔助虛擬化特性而略加修改而成的。自此以後,QEMU 專案引起 Linu

利用superlance監控supervisor執行狀態

此文已由作者張家裕授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 最近開發問到supervisor管理下的程序重啟了,有無辦法做到主動通知,樓主最先想到的是supervisor自帶的eventlistener,於是找到了下面的解決方法。 supervisor與superlance簡

jProfiler遠端連線Linux監控jvm1執行狀態

隨風迎 第一步:下載軟體 官網地址:https://www.ej-technologies.com/download/jprofiler/files,下載一個linux服務端,一個windows客戶端 GUI介面 第二步:安裝 1、下載好後把tar包上傳的lin

SpringBoot2.0學習筆記 使用Actualor監控專案執行狀態

SpringBoot的一大特性就是開發者可以通過它其中的Actualor元件檢視專案的執行狀態 在SpringBoot2.0推出之後,Actualor的配置資訊發生了一些變化,與之前的版本有所不同,本文就針對SpringBoot2.0對Actualor的使用做簡單的說明.

Linux Centos7通過shell指令碼來監控mysql的執行狀態

vim checkmysql.sh #!/bin/sh #create by mingongge at 2018-10-10 port=`netstat -lnt|grep 3306|wc -l` if  [ $post -ne 1 ] ;then    now

cronmon 定時任務執行狀態監控

       cronmon是一個計劃任務(定時任務)監控系統,可以對迴圈執行的程式和指令碼進行監控告警,當其未按照預期執行時,傳送郵件到對應郵箱進行通知。同時可以將監控任務劃分到不同業務下面,每個業務可以分配不同的通知人,建立業務、通知人和監控任務的多層級關係。&nb

SpringBoot專案啟執行狀態監控Actuator

1. 在專案pom中加入Actuator依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x

mysql 架構篇系列 3 複製執行狀態監控與選項引數說明

一. 概述   在上一篇中,搭建了一主一從的複製架構,這篇通過一些診斷方法來了解複製的執行狀態和一些選項引數說明。上次mysql主從服務關機,今天在開啟mysql服務,出現了錯誤資訊。   1.首先 啟動主從mysql服務   2.在從庫上執行START SLAVE, 開始複製。   3.在從庫上執行SHOW

執行狀態監控使用 Actuator

springboot2.0 的配置 #actuator埠 management.server.port: 9001 #修改訪問路徑 2.0之前預設是/ 2.0預設是 /actuator 可以通過這個屬性值修改 management.endpoints.web.base-path: /

Springboot2(16)執行狀態監控使用Actuator

原始碼地址 文章目錄 新增依賴 springboot2.0 的配置 可配置端點 個別介面講解 health 編寫自定義HealthIndicat

jProfiler遠端連線Linux監控jvm、tomcat執行狀態(很詳細)

第一步、下載軟體 第二步、安裝 1、下載好後把tar包上傳的linux伺服器,解壓。    / 2、修改tomcat的bin/catalina.sh檔案       jprofiler的安裝路徑和埠,我配的埠是10001 3、再重啟tomcat 我們可以看看

MongoDB 執行狀態、效能監控,分析

mongostat詳解 mongostat是mongdb自帶的狀態檢測工具,在命令列下使用。它會間隔固定時間獲取mongodb的當前執行狀態,並輸出。如果你發現數據庫突然變慢或者有其他問題的話,你第一手的操作就考慮採用mongostat來檢視mong

監控 Java 執行緒池及檢測執行緒池執行狀態

轉自:https://www.jianshu.com/p/2c4c49e3a758 之前寫過一篇 Java 執行緒池的使用介紹文章《執行緒池全面解析》,全面介紹了什麼是執行緒池、執行緒池核心類、執行緒池工作流程、執行緒池分類、拒絕策略、及如何提交與關閉執行緒池等。 但在實際開發過程中,線上程

Spark執行狀態監控

強力推薦,相見恨晚的文件,建議先看 關於Spark監控,推薦一個講的非常好的PPT:monitoring-spark-applications,簡練、全面的講解了Spark監控的必要性、方法、缺點及改進方法。 下面是我自己的一些總結 Spark

乾貨:教你如何監控 Java 執行緒池執行狀態

之前寫過一篇 Java 執行緒池的使用介紹文章《執行緒池全面解析》,全面介紹了什麼是執行緒池、執行緒池核心類、執行緒池工作流程、執行緒池分類、拒絕策略、及如何提交與關閉執行緒池等。 但在實際開發過程中,線上程池使用過程中可能會遇到各方面的故障,如執行緒池阻塞,

MySQL系統執行狀態實時監控(python版本)

昨天的文章,用shell寫了一個簡單的MySQL系統執行狀態實時監控的模版,《MySQL系統執行狀態實時監控(shell版本)》,對於這種操作,任何語言都可以完成,今兒就用python寫一下,寫的不優雅

使用 pm2-web 監控 pm2 服務執行狀態

pm2-web 是一款 pm2 服務狀態監控程式,基於 web 。 安裝 $ npm install -g pm2-web 執行(預設是在8080埠) $ pm2-web 配置 pm2-web 將會載入預設的配置檔案(如果存在)

Tomcat學習--tomcat執行狀態監控

    上一篇部落格Tomcat學習--war服務相關狀態資訊監控中我們已經瞭解了一下對war包的啟動、停止、執行狀態、過載和解除安裝操作的實現機制,接下來我們用這篇部落格瞭解一下tomcat執行過程中伺服器,作業系統,jvm和war的一些狀態資訊。    目前tomcat將

springboot 2.0 執行狀態監控使用 Actuator

  springboot的Actuator提供了執行狀態監控的功能,可以通過REST、遠端Shell和JMX方式來檢視。      使用時倒入spring-boot-starter-actuator的依賴即可。   這裡說下springboot2.0的配置

實時檢視及監控PHP-FPM的執行狀態

轉自 http://www.phpddt.com/php/php-fpm-monitor.html PHP-FPM內建了狀態頁,開啟後可檢視PHP-FPM的詳細執行狀態,給PHP-FPM優化帶來幫助。開啟php-fpm.conf,配置php-fpm狀態頁選項 pm.sta