使用 monitor command 监控 QEMU 运行状态

2023-05-16

使用 monitor command 监控 QEMU 运行状态

在虚拟化的研究领域,QEMU 有着举足轻重的地位。2007 年 2 月发布的 Linux 2.6.20 内核中,集成了 KVM 作为其虚拟化的具体实现。而 KVM 是基于 QEMU 并且利用 CPU 的辅助虚拟化特性而略加修改而成的。自此以后,QEMU 项目引起 Linux 开发人员的广泛关注。

回页首

进入 QEMU monitor

在启动 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 命令源

				
 [root@kvm]# 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 的命令非常繁杂,并且由于 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 的进化演变逐渐地学习和体会。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 monitor command 监控 QEMU 运行状态 的相关文章

  • 使用shell脚本删除文件夹内容

    我在尝试清空脚本中的文件夹时遇到问题 这在我的命令行中工作 rm r Folder1 Folder2 但如果在我的脚本中我这样做 DIR Folder1 Folder2 rm r DIR 它说 rm Folder1 Folder2 没有这样
  • 从 C、GCC(裸机)调用 ARM 汇编

    我正在尝试使用 GCC 在 ARM 中进行一些裸机编程并在 QEMU 上进行测试 每当我从 C 调用 ARM 标签时 我的程序就会挂起 我有一个简单的代码示例 显示了问题https gist github com 1654392 https
  • 我可以通过 DataTrigger (XAML) 调用函数吗?

    我在 xaml cs 中有一个我想调用的函数 xaml cs private void treeView SelectedItemChanged object sender EventArgs e treeView ScrollToCent
  • 找不到 docker 命令

    我在Mac上安装了docker 安装成功 它还正在运行 并尝试在终端中执行以下命令 docker v 请参阅以下错误 bash docker command not found 我该如何解决这个问题 在 Windows 中这些命令运行良好
  • MVVM 中的命令

    我看过一些教程 人们在他们的代码中创建像 CanExecute 这样的方法 我假设他们这样做是为了帮助读者理解这一切是如何运作的 当我查找 Command 和 ICommand 时 它会将我带到 MSDN 上用于 Windows 应用商店应
  • 跳转后 vim 中自动 'zz'

    当我跳转到世界上的任何地方后 无论是在当前文件还是在不同的文件中 是否可以让vim自动运行zz 重新以当前行为中心 在搜索之类的事情之后我想要这个 ctrl o and ctrl i 以及几乎任何运动 除了hjkl Thanks Voila
  • 如何通过命令行关闭Android模拟器

    我无法从命令提示符正常停止模拟器 我使用的是 Linux Ubuntu v10 04 64 位 和 Android v2 3 API 9 Gingerbread 我使用其快照启动了模拟器 现在我关心的是优雅地关闭正在运行的模拟器实例 我尝试
  • MonoDroid 的 MVVM 框架?

    MonoDroid 已经有 MVVM 框架了吗 或者 MonoDroid 是否能够自行绑定属性和命令 例如用于 WPF Silverlight WP7 的 MVVM Light Toolkit 还没有 MVVM 但是有 MonoCross
  • 从 UNIX 树中删除路径前缀

    我对 UNIX 命令有一个要求 我有一条与此类似的路径 path to file manyfiles extensions 现在我想要的输出类似于 file manyfiles extensions 现在我可以列出 path to 和 pa
  • 如何在 C 中使用 write() 函数写入整数? [复制]

    这个问题在这里已经有答案了 我是 C 菜鸟 正在尝试使用write 显示整数的函数 这是我的代码 int n 7 write 1 n 4 我想展示7 但是当我设置时程序没有显示任何内容或其他奇怪的字符n到一个大数字 我缺少什么 类似的对象i
  • 命令 test -x 在 ubuntu 中做什么?

    什么是test x从 etc cron daily logrotate 做什么 test x usr sbin logrotate exit 0 usr sbin logrotate etc logrotate conf 它是否测试是否已经
  • 使用命令中断循环

    在我的 Python Discord Bot 中 我想创建一个命令 这会导致循环运行 当我输入第二个命令时 循环应该停止 那么粗略地说 client event async def on message message if message
  • Vim:如何将一组行重新格式化为一行(如果该行是一个句子)?

    不是重复的在 Vim 中 将文件中的所有行连接成一行的最简单方法是什么 https stackoverflow com questions 391710 in vim what is the simplest way to join all
  • MVVM 中的事件而不是命令?

    在MVVM的各种教程中经常会指出 MVVM的目标不是消除代码隐藏 并且代码隐藏中的一些事件处理可能仍然是必要的 在什么场景下您需要在代码隐藏中编写事件而不是在视图模型中使用命令 一般来说 如果您的代码与 UI 逻辑相关 请将其保留在视图的
  • 如何在c#中使用net user

    我正在尝试将 net user 与 c 一起使用 System Diagnostics ProcessStartInfo proccessStartInfo new System Diagnostics ProcessStartInfo n
  • WPF - 从 UserControl 发出命令时 CanExecute 不会触发

    我有一个按钮条用户控件 我想在我的大多数表单上使用它 我添加了如下命令 public ICommand Create get return buttonCreate Command set buttonCreate Command valu
  • 如何使用 wamp 在 Windows 上烘焙 cakephp 2.0 应用程序

    我想在Windows系统上烤蛋糕php项目 我正在使用 wamp 服务器来运行 PHP mysql 我已经浏览过 cakephp 网站上的视频投射 并设置了环境设置 按照演示给出命令 蛋糕 后 最后我收到一条消息说 php 不被识别为内部或
  • Django:如何从管理界面调用管理自定义命令执行?

    参考 从代码执行管理命令 https stackoverflow com questions 907506 how can i call a custom django manage py command directly from a t
  • 从java程序调用SVN命令

    我想从 java 程序调用 SVN 命令 update commit 有什么帮助吗 SVN 乌龟SVN 环境 java程序将在jBoss服务器内运行 从应用程序服务器内使用 GUI SVN 客户端是一个非常非常糟糕的主意 而Tortoise
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba

随机推荐

  • yolov5-pytorch导出模型问题

    在官网提供的代码中 xff0c 很方便的可以把pytorch的模型转为libtorch的模型 xff0c 但是在转换前要明白自己转换后的模型是仅仅为了推理部署 xff0c 还是说用转换后的模型作为libtorch的预训练模型继续使用呢 xf
  • libtorch与pytorch索引张量值操作([:]与index)

    由于我最近在学习libtorch相关的东西 xff0c 所以就记录一下使用libtorch与pytorch一样对张量操作的语法 下面是我转载的一位大佬的文章 xff0c 这里只做技术探讨 xff0c 不做其他用途 想要学习的可以参考一下大佬
  • QT 报 QMetaObject::connectSlotsByName: No matching signal for on_btn_clicked()

    在QT中 xff0c 自己编写命名信号和槽的时候 xff0c 在用connect的时候报出以下错误 xff1a QMetaObject span class token double colon punctuation span conne
  • CRNN-模型转换问题Missing Errorin loading state_dict for CRNN

    在将CRNN pytorch模型转为libtorch模型的时候出现报错情况 xff0c Missing Errorin loading state dict span class token keyword for span CRNN 96
  • CRNN-libtorch模型推理的时候报错std:runtime_error

    使用libtorch模型推理的时候出现报错std runtime error 这里报错的情况一般是数据不同步的问题 xff0c 也就是说我们的模型是在gpu上 xff0c 而数据是在cpu上 xff0c 那么要做的一件事就是检查forwar
  • 数据集txt格式划分为多个txt文件夹

    简单记录一下数据标签txt格式划分为多个文件 xff0c 通常我们标注号的标签 xff0c 都是在一个txt文件夹中 xff0c 我们训练的时候需要把txt中的标签按照一定的比例划分为多个文件 xff0c 这里贴出划分为三个文件的代码 xf
  • 租用终端训练网络遇到的一些坑

    最近由于电脑配置和经济的问题 xff0c 想训练模型 xff0c 无奈只能选择在平台上训练了 xff0c 我使用的是AutoDL这个平台 xff0c 感觉还行 xff0c 还是挺划算 感兴趣或者需要的老铁可以点击蓝色字体进去尝试一下 接下来
  • CRNN-pytorch模型转libtorch模型踩坑记录

    这段时间一直在做CRNN文字识别的问题 xff0c 从pytorch中训练好的模型然后转到libtorch中去 xff0c 但是CRNN提供的代码没有转libtorch模型的部分 xff0c 于是就在网上到处乱找 xff0c 其中找到了这篇
  • 如何升级gcc版本

    下面将整个过程更新的过程写下来 xff0c 希望对有需要的人提供一些帮助 首先需要准备需要材料 xff1a gcc4 4 2版需要安装gmp4 2 0 43 和mpfr2 3 0 43 xff0c 到GMP的网站 xff08 http gm
  • 召回率与精确率的理解

    写在前面 识别精度主要由召回率 xff08 recall xff09 和精确率 xff08 precision xff09 两个指标决定 xff0c 在训练结束时可以通过re pre曲线来表示模型的准确度 xff0c 也可以根据二者之间的关
  • vs常见的错误集锦-error C4996: ‘wcstombs‘: This function or variable may be unsafe

    问题所在 xff1a 缺少宏定义 在使用wcstombs这个函数时遇到了题目所说的这个情况 xff0c 查找得知是缺少宏定义 xff0c 按照网上查找的问题 xff0c 在vs的配置中添加宏定义就行了 xff1b 在以下的位置 xff1a
  • Keil左侧Function列表无法显示(已解决)

    左侧的Functions框框会显示所有的库函数 xff0c 方便查找 查找的来源是工程所在的目录 如果把目录放得太深 xff0c 就会导致扫描不出来 在工程文件里面并列新建一个LIB文件夹用来存放 xff0c 把Inc和Src放进去 打开F
  • Linux服务器配置ulimit的常用参数介绍

    最近在小鸟云配置了一个Linux服务器 xff0c 实例是debian 7 5 系统 xff0c 在进行系统优化的过程中遇到一些有关Ulimit的事项 xff0c 整理了相关的参数介绍和配置介绍 xff0c 有需要可以简单看看 Ulimit
  • 【视觉检测C++接口实现】vs2019使用动态链接库yolo_cpp_dll调用yolov3

    目录 0 前言 1 准备工作 1 1 yolo cpp dll dll和yolo cpp dll lib的获取 1 2 pthreadGC2 dll和pthreadVC2 dll的获取 1 3 yolo v2 class hpp的获取 1
  • 【jetson nano】在ubuntu18.04下,c++调用链接库实现yolov3

    目录 0 前言 1 下载安装opencv 3 4 0 1 1 配置相应的以来库 1 2 下载opencv 3 4 0 xff08 源码 xff09 1 3 编译 xff08 时间较长 xff09 1 4 安装 1 5 配置opencv路径
  • 51单片机寄存器篇

    以下依次为IE IP TMOD TCON SCON寄存器结构 xff1a B7B6B5B4B3B2B1B0EA ET2ESET1EX1ET0EX0 B7B6B5B4B3B2B1B0 PT2PSPT1PX1PT0PX0 B7B6B5B4B3B
  • 单片机蓝桥杯——串口通信

    1 什么是串行 并行 单工 全双工 半双工 同步 异步 通讯的方式分类 xff1a 并行通信 串行通信 并行通信 xff1a 数据的各位同时在多根数据线上发送或接收 串行通信 xff1a 数据的各位在同一根数据线上逐位发送和接收7 并行通信
  • 串口、UART、USART、COM、USB、TTL、RS232、RS485、RS422简介

    串口 COM口 USB口是指的物理接口形式 xff08 硬件 xff09 xff1b TTL RS 232 RS 485 USB电平是指的电平标准 xff08 电信号 xff09 串口 UART口 USART口 COM口 USB口 xff0
  • 无线收发模块——NRF24L01

    1 什么是nRF24L01 nRF24L01是由NORDIC生产的工作在2 4GHz 2 5GHz的ISM 频段的单片无线收发器芯片 有着极低的电流消耗 nRF24L01与5V单片机的连接通过SPI接口进行通讯 xff0c 输出功率频道选择
  • 使用 monitor command 监控 QEMU 运行状态

    使用 monitor command 监控 QEMU 运行状态 在虚拟化的研究领域 xff0c QEMU 有着举足轻重的地位 2007 年 2 月发布的 Linux 2 6 20 内核中 xff0c 集成了 KVM 作为其虚拟化的具体实现