QEMU与其他模拟器一样,也提供控制台(-monitor)接入,我们可以通过它进行虚拟机的实时监控、更改虚拟设备、系统调试、音视频截取等。除了交互式的命令访问外,我们也可以使用QMP(QEMU Monitor Protocol)——JSON格式的文本命令与其进行交互,多数云平台的虚拟化服务利用它来扩展虚拟机监控功能。
1.控制台基本命令
在此先以交互式命令访问为例介绍QEMU控制台的用途,然后再介绍一下QMP协议的基本用法。在交互式控制台中,我们可以使用help查询具体命令的用法,形如“help usb_add”;也可以使用info查询对象状态,形如“info usb”。
接下来按照各命令的操作对象将其划分为如下几类。
□访问控制
对于使用了VNC协议并且客户端认证采用的是x509或sasl的虚拟机,我们可以对VNC客户端进行授权,比如“acl_add vnc.username alpha allow”即允许VNC用户名为alpha的客户端连接桌面,“acl_add vnc.username beta deny”即禁止VNC用户名为beta的客户端连接桌面。
□设备管理
通过QEMU控制台进行热插拔的有CPU、内存、USB、驱动器等等几乎所有QEMU支持的模拟设备与透传设备,使用“info qtree”列举当前设备树。
我们通过平台对虚拟机进行的设备在线修改即是热插拔,它需要操作系统的支持,支持比较广泛的有CPU(cpu-add)、内存(object_add)、PCI设备(pci_add)、硬盘控制器(drive_add)、网卡(netdev_add)等;针对其他可热插拔的设备我们可以使用device_add命令进行添加,形如“device_add e1000,id=e1000_1”;某些设备比如内存、随机数生成器等,我们需要使用object_add命令先定义其类型然后再添加,形如添加内存的“object_add memorybackend-ram,id=mem1,size=1G;device_add pc-dimm,id=dimm1,memdev=mem1”;已经添加的设备可通过change命令对其参数进行修改,形如“change ide1-cd0/ISO/guest-tools.iso”;移除设备可通过命令eject或者对应的删除命令,比如网卡的“netdev_del e1000_1”。另外,在添加设备时赋予id或者name标签往往是一个好习惯。
对于块设备,控制台提供了较丰富命令,比如更改容量(block_resize)、拷贝(block_stream、drive_backup、drive_mirror)、任务控制(block_job_pause、block_job_resume、block_job_set_speed、block_job_cancel、block_job_complete)。
□网络控制
QEMU中的网络参数比较丰富,从层次上可以分为设备和网络连接后端,其中网络连接后端有用户态(user)、套接字(socket)、桥接(TAP/TUN)、VDE、QEMU VLAN(非802.1q)。其基本命令有网络连接增删(host_net_add、host_net_del)和网络重定向(hostfwd_add、hostfwd_del),它们的操作方法与QEMU网络选项类似,具体的原理与操作我们将在第6张进行介绍。其中,网络重定向在私有云中可用于RDP、VNC等服务在虚拟机内部的显示协议端口重定向,从而替代以往的静态地址端口映射。
□快照管理
快照在云平台中的应用非常广泛,比如数据备份、测试等。QEMU快照管理分为两部分内容,一种是虚拟机运行状态的快照(savevm、loadvm、delvm),另一种是硬盘快照(snapshot_blkdev、snapshot_blockdev_internal、snapshot_del_blockdev_internal),它们都需要虚拟机块设备的支持。
□在线迁移
这里的迁移指的是运行状态下虚拟机的在线迁移,其实现条件有两个,即共享硬盘和相同的模拟CPU特性。
迁移开始之前以及开始后,我们可以控制其过程参数并随时终止(migrate_cancel),其可直接控制的参数有缓存大小(migrate_set_cache_size)、迁移方法(migrate_set_capability)、迁移失败超时(migrate_set_downtime)、迁移最大速度(migrate_set_speed)、迁移后拷贝(migrate_start_postcopy)、全部参数(migrate_set_parameter)。迁移的目的服务器端只要启动一个选项相同QEMU进程,并设置好迁移服务端(形似“migrate_incoming tcp:0:4444”)就可以开始在源服务器上执行迁移命令(形似“migrate-d tcp:192.168.0.11:4444”)进行迁移。(www.xing528.com)
也可将虚拟机的状态迁移至文件中,然后从文件读取虚拟机状态并启动,这个过程又称为“假迁移”,其基本操作如下。
在QEMU 2.5版本及其以后,可以利用Linux 4.3内核中的userfaultfd机制来设置迁移参数“迁移后拷贝”,其过程是先使虚拟机的基本运行状态(标记userfaultfd的内存块、CPU状态等)拷贝至目的服务器中对应虚拟机,然后再将剩下的内存页迁移至目的服务器的虚拟机中,这样便节省了大型内存虚拟机的迁移时间。具体命令如下。
迁移参数也支持“exec”命令,这样就可以对迁移路径或者内容的压缩、加密、重定向等操作,更多的迁移参数目前可参考QEMU源码。
□在线调试
QEMU是Linux内核开发的绝佳工具,比如它可以直接加上kernel和initrd选项,进入QEMU控制台后输入gdbserver后会在本地1234端口启动gdb监听。
控制台中可直接调试的命令有x、xp、print、mce、log、logfile、sum、memsave、dumpguest-memory、stop、cont。其中x、xp、print可查看寄存器或者指定偏移量的内存内容,形似“xp/3i$eip”;log与logfile一般需要与进程控制命令一起使用,比如“stop;log in_asm;start”即会记录虚拟机运行时的汇编指令(即要通过TCG翻译为主机指令的汇编指令,见章节开头);memsave、dump-guest-memory即时将虚拟机的指定位置内存或者全部内存dump到文件中用于调试,一般在虚拟机死机时使用较多;stop、cont即表示暂停、继续。
□电源管理
电源管理的命令有system_powerdown、system_reset、system_wakeup,它们分别有两种模式,默认情况下是强制操作(断电、硬重启),另一种需要操作系统的ACPI支持,即会分别接受关机、重启、唤醒的请求。
□音视频录制
截图命令screendump会将当前VGA内容保存成PPM格式的图片文件;wavcapture命令默认使用双声道、16位、44 k将虚拟机的音频设备输出保存成WAV格式音频文件,使用stopcapture停止录制。
2.QMP介绍
QMP是一种基于JSON格式的QEMU控制协议,它的主要功能是使平台能以易解析的语言与QEMU控制台进行交互,被广泛地使用在各种虚拟化服务代理中,详细格式可参考QEMU源码目录中的docs/qm p-spec.txt。
使用QMP的方法也比较多,主要包括以下两类:
标准输入输出:“-qmp stdio”,“-chardev stdio,id=mon0-mon chardev=mon0,mode=control,pretty=on”。
套接字:“-qmp tcp:localhost:4444,server,nowait”,“-chardev socket,id=charmonitor,path=/tmp/monitor.sock,server,nowait-mon chardev=charmonitor,id=monitor,mode=control”,“-qmp unix:/tmp/qmp.sock,server”。
连接到QMP后,就需要以JSON文本进行交互了。首先发送“{"execute":"qmp_capabilities"}”进入控制台模式,然后再执行相应的命令(如下所示)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。