当使用 qemu-system-ARCH 命令(例如 qemu-system-x86_64)启动虚拟机时,会提供一个监视器控制台,用于与用户进行交互。使用监视器控制台中的可用命令,可以检查正在运行的操作系统,更改可移动介质,截取屏幕截图或音频,以及控制虚拟机的其他方面。
以下部分列出了选定的有用的 QEMU 监视器命令及其用途。要获取完整的列表,请在 QEMU 监视器命令行中输入 help。
libvirt 没有监视器控制台只有在使用 qemu-system-ARCH 命令直接启动虚拟机,并且正在原生 QEMU 窗口中查看其图形输出时,才能访问监视器控制台。
如果您使用 libvirt(例如,使用 virt-manager)启动虚拟机,并通过 VNC 或 Spice 会话查看其输出,则无法直接访问监视器控制台。但是,您可以通过 virsh 将监视器命令发送到虚拟机
# virsh qemu-monitor-command COMMAND访问监视器控制台的方式取决于用于查看虚拟机输出的显示设备。有关显示的更多详细信息,请参阅 第 34.3.2.2 节,“显示选项”。例如,要在使用 -display gtk 选项时查看监视器,请按 Ctrl–Alt–2。 同样,当使用 -nographic 选项时,可以通过按以下组合键切换到监视器控制台:Ctrl–AC。
在使用控制台时获取帮助,请使用 help 或 ?。要获取特定命令的帮助,请使用 help COMMAND。
要获取有关客户机系统的信息,请使用 info。如果未带任何选项使用,则会打印可能的选项列表。选项确定要分析的系统部分
info version显示 QEMU 的版本。
info commands列出可用的 QMP 命令。
info network显示网络状态。
info chardev显示字符设备。
info block有关块设备的信息,例如硬盘、软盘或 CD-ROM。
info blockstats块设备上的读写统计信息。
info registers显示 CPU 寄存器。
info cpus显示有关可用 CPU 的信息。
info history显示命令行历史记录。
info irq显示中断统计信息。
info pic显示 i8259 (PIC) 状态。
info pci显示 PCI 信息。
info tlb显示虚拟到物理内存映射。
info mem显示活动的虚拟内存映射。
info jit显示动态编译器信息。
info kvm显示 KVM 信息。
info numa显示 NUMA 信息。
info usb显示客户机 USB 设备。
info usbhost显示主机 USB 设备。
info profile显示分析信息。
info capture显示捕获(音频抓取)信息。
info snapshots显示当前保存的虚拟机快照。
info status显示当前的虚拟机状态。
info mice显示正在接收事件的客户机鼠标。
info vnc显示 VNC 服务器状态。
info name显示当前的虚拟机名称。
info uuid显示当前的虚拟机 UUID。
info usernet显示用户网络堆栈连接状态。
info migrate显示迁移状态。
info balloon显示气球设备信息。
info qtree显示设备树。
info qdm显示 qdev 设备模型列表。
info roms显示 ROM。
info migrate_cache_size显示当前的迁移 xbzrle(“Xor Based Zero Run Length Encoding”)缓存大小。
info migrate_capabilities显示多个迁移功能的状态,例如 xbzrle 压缩。
info mtree显示 VM Guest 内存层次结构。
info trace-events显示可用的跟踪事件及其状态。
要更改 VNC 密码,请使用 change vnc password 命令并输入新密码
(qemu) change vnc password Password: ******** (qemu)
要在客户机运行时添加新磁盘(热插拔),请使用 drive_add 和 device_add 命令。首先将要添加为总线 0 设备的驱动器定义为新驱动器
(qemu) drive_add 0 if=none,file=/tmp/test.img,format=raw,id=disk1 OK
您可以通过查询块子系统来确认您的新设备
(qemu) info block [...] disk1: removable=1 locked=0 tray-open=0 file=/tmp/test.img ro=0 drv=raw \ encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
定义新驱动器后,需要将其连接到设备,以便客户机可以看到它。典型的设备将是 virtio-blk-pci 或 scsi-disk。要获取可用值的完整列表,请运行
(qemu) device_add ? name "VGA", bus PCI name "usb-storage", bus usb-bus [...] name "virtio-blk-pci", bus virtio-bus
现在添加设备
(qemu) device_add virtio-blk-pci,drive=disk1,id=myvirtio1
并使用以下命令确认
(qemu) info pci
[...]
Bus 0, device 4, function 0:
SCSI controller: PCI device 1af4:1001
IRQ 0.
BAR0: I/O at 0xffffffffffffffff [0x003e].
BAR1: 32 bit memory at 0xffffffffffffffff [0x00000ffe].
id "myvirtio1"使用 device_add 命令添加的设备可以使用 device_del 从客户机中删除。有关更多信息,请在 QEMU 监视器命令行中输入 help device_del。
要释放连接到可移动介质设备的设备或文件,请使用 eject DEVICE 命令。使用可选的 -f 强制弹出。
要更改可移动介质(如 CD-ROM),请使用 change DEVICE 命令。可以使用 info block 命令确定可移动介质的名称
(qemu)info blockide1-cd0: type=cdrom removable=1 locked=0 file=/dev/sr0 ro=1 drv=host_device(qemu)change ide1-cd0 /path/to/image
如果需要,可以使用监视器控制台模拟键盘和鼠标输入。例如,如果您的图形用户界面在较低级别拦截某些键组合(例如 X Window Syustem 中的 Ctrl–Alt–F1),则可以使用 sendkey KEYS 输入它们
sendkey ctrl-alt-f1
要列出在 KEYS 选项中使用的键名,请输入 sendkey 并按 →|。
要控制鼠标,可以使用以下命令
mouse_move DX dy [DZ]将活动鼠标指针移动到指定的坐标 dx、dy,可选的滚动轴 dz。
mouse_button VAL更改鼠标按钮的状态(1=左键,2=中键,4=右键)。
mouse_set INDEX设置哪个鼠标设备接收事件。可以使用 info mice 命令获取设备索引号。
如果虚拟机使用 -balloon virtio 选项启动(因此启用了半虚拟化气球设备),则可以动态更改可用内存。有关启用气球设备的更多信息,请参阅 第 33.1 节,“使用 qemu-system-ARCH 进行基本安装”。
要在监视器控制台中获取有关气球设备的信息并确定是否启用了该设备,请使用 info balloon 命令
(qemu) info balloon
如果启用了气球设备,请使用 balloon MEMORY_IN_MB 命令设置请求的内存量
(qemu) balloon 400
要将虚拟机的内存内容保存到磁盘或控制台输出,请使用以下命令
memsaveADDRSIZEFILENAME将从 ADDR 开始、大小为 SIZE 的虚拟内存转储保存到文件 FILENAME
pmemsaveADDRSIZEFILENAME将从 ADDR 开始、大小为 SIZE 的物理内存转储保存到文件 FILENAME
从地址 ADDR 开始进行虚拟内存转储,并根据 FMT 字符串进行格式化。FMT 字符串由三个参数组成 COUNTFORMATSIZE
COUNT 参数是要转储的项目数。
FORMAT 可以是 x(十六进制)、d(有符号十进制)、u(无符号十进制)、o(八进制)、c(字符)或 i(汇编指令)。
SIZE 参数可以是 b(8 位)、h(16 位)、w(32 位)或 g(64 位)。在 x86 上,可以使用 i 格式指定 h 或 w,以分别选择 16 位或 32 位代码指令大小。
从地址 ADDR 开始进行物理内存转储,并根据 FMT 字符串进行格式化。FMT 字符串由三个参数组成 COUNTFORMATSIZE
COUNT 参数是要转储的项目数。
FORMAT 可以是 x(十六进制)、d(有符号十进制)、u(无符号十进制)、o(八进制)、c(字符)或 i(汇编指令)。
SIZE 参数可以是 b(8 位)、h(16 位)、w(32 位)或 g(64 位)。在 x86 上,可以使用 i 格式指定 h 或 w,以分别选择 16 位或 32 位代码指令大小。
目前SUSE尚未正式支持在QEMU监视器中管理快照。本节中的信息可能在特定情况下有所帮助。
虚拟机快照是完整虚拟机的快照,包括CPU、RAM的状态以及所有可写磁盘的内容。要使用虚拟机快照,您必须至少有一个非可移除且可写的块设备,使用qcow2磁盘镜像格式。
当您需要保存虚拟机的特定状态时,快照会很有用。例如,在您已在虚拟化服务器上配置了网络服务后,希望快速启动处于上次保存状态的虚拟机。您还可以在虚拟机关机后创建快照,以在尝试一些实验性操作并使VM Guest不稳定之前创建一个备份状态。本节介绍前者的情况,后者在第33.2.3节,“使用qemu-img管理虚拟机快照”中描述。
以下命令可用于在QEMU监视器中管理快照
savevm名称在标签名称下创建新的虚拟机快照,或替换现有的快照。
loadvm名称加载标记为名称的虚拟机快照。
delvm删除虚拟机快照。
info snapshots打印可用快照的信息。
(qemu) info snapshots Snapshot list: ID1 TAG2 VM SIZE3 DATE4 VM CLOCK5 1 booting 4.4M 2013-11-22 10:51:10 00:00:20.476 2 booted 184M 2013-11-22 10:53:03 00:02:05.394 3 logged_in 273M 2013-11-22 11:00:25 00:04:34.843 4 ff_and_term_running 372M 2013-11-22 11:12:27 00:08:44.965
以下命令可用于暂停和恢复虚拟机
stop暂停虚拟机的执行。
cont恢复虚拟机的执行。
system_reset重置虚拟机。效果类似于物理机上的重置按钮。这可能会导致文件系统处于不干净的状态。
system_powerdown向机器发送ACPI关机请求。效果类似于物理机上的电源按钮。
q 或 quit立即终止QEMU。
实时迁移过程允许在不中断可用性的情况下,将任何虚拟机从一个主机系统传输到另一个主机系统。可以永久更改主机,或仅在维护期间更改主机。
实时迁移的要求
第10.7.1节,“迁移要求”中的所有要求均适用。
实时迁移只能在具有相同CPU功能的VM主机服务器之间进行。
源主机和目标主机上的Guest必须以相同的方式启动。
-snapshot qemu命令行选项不应用于迁移(并且此qemu命令行选项不受支持)。
在openSUSE Leap中,postcopy模式尚未得到支持。它仅作为技术预览发布。有关postcopy的更多信息,请参见http://wiki.qemu.org/Features/PostCopyLiveMigration。
更多建议可以在以下网站找到:http://www.linux-kvm.org/page/Migration
实时迁移过程的步骤如下
虚拟机实例正在源主机上运行。
虚拟机在目标主机上以冻结侦听模式启动。使用的参数与源主机上的参数相同,再加上-incoming tcp:IP:PORT参数,其中IP指定IP地址,PORT指定侦听传入迁移的端口。如果将0设置为IP地址,虚拟机将侦听所有接口。
在源主机上,切换到监视器控制台,并使用migrate -d tcp: DESTINATION_IP:PORT命令启动迁移。
要确定迁移的状态,请在源主机上的监视器控制台中使用info migrate命令。
要取消迁移,请在源主机上的监视器控制台中使用migrate_cancel命令。
要设置迁移的可容忍的最大停机时间(以秒为单位),请使用migrate_set_downtime NUMBER_OF_SECONDS命令。
要设置迁移的最大速度(以字节/秒为单位),请使用migrate_set_speed BYTES_PER_SECOND命令。
QMP是一个基于JSON的协议,允许应用程序(例如libvirt)与正在运行的QEMU实例进行通信。有几种方法可以使用QMP命令访问QEMU监视器。
使用QMP的最灵活方法是指定-mon选项。以下示例使用标准输入/输出创建QMP实例。在以下示例中,->标记从客户端发送到正在运行的QEMU实例的行,而<-标记QEMU返回的输出行。
>sudoqemu-system-x86_64 [...] \ -chardev stdio,id=mon0 \ -mon chardev=mon0,mode=control,pretty=on <- { "QMP": { "version": { "qemu": { "micro": 0, "minor": 0, "major": 2 }, "package": "" }, "capabilities": [ ] } }
建立新的QMP连接时,QMP会发送其问候消息并进入功能协商模式。在此模式下,只有qmp_capabilities命令有效。要退出功能协商模式并进入命令模式,必须首先发出qmp_capabilities命令
-> { "execute": "qmp_capabilities" }
<- {
"return": {
}
}请注意,"return": {}是QMP的成功响应。
QMP的命令可以有参数。例如,要弹出CD-ROM驱动器,请输入
->{ "execute": "eject", "arguments": { "device": "ide1-cd0" } }
<- {
"timestamp": {
"seconds": 1410353381,
"microseconds": 763480
},
"event": "DEVICE_TRAY_MOVED",
"data": {
"device": "ide1-cd0",
"tray-open": true
}
}
{
"return": {
}
}除了标准输入/输出之外,您可以将QMP接口连接到网络套接字并通过指定的端口与其进行通信
>sudoqemu-system-x86_64 [...] \ -chardev socket,id=mon0,host=localhost,port=4444,server,nowait \ -mon chardev=mon0,mode=control,pretty=on
然后运行telnet连接到端口4444
> telnet localhost 4444
Trying ::1...
Connected to localhost.
Escape character is '^]'.
<- {
"QMP": {
"version": {
"qemu": {
"micro": 0,
"minor": 0,
"major": 2
},
"package": ""
},
"capabilities": [
]
}
}您可以同时创建多个监视器接口。以下示例创建一个HMP实例——理解“正常”QEMU监视器命令的人类监视器——在标准输入/输出上,以及一个QMP实例在localhost端口4444上
>sudoqemu-system-x86_64 [...] \ -chardev stdio,id=mon0 -mon chardev=mon0,mode=readline \ -chardev socket,id=mon1,host=localhost,port=4444,server,nowait \ -mon chardev=mon1,mode=control,pretty=on
使用-qmp选项调用QEMU,并创建一个Unix套接字
>sudoqemu-system-x86_64 [...] \ -qmp unix:/tmp/qmp-sock,server --monitor stdio QEMU waiting for connection on: unix:./qmp-sock,server
要通过/tmp/qmp-sock套接字与QEMU实例通信,请使用nc(有关更多信息,请参见man 1 nc)从同一主机上的另一个终端
>sudonc -U /tmp/qmp-sock <- {"QMP": {"version": {"qemu": {"micro": 0, "minor": 0, "major": 2} [...]
如果您的虚拟机在libvirt下运行(请参见第II部分,“使用libvirt管理虚拟机”),您可以通过运行virsh qemu-monitor-command与其正在运行的Guest进行通信
>sudovirsh qemu-monitor-command vm_guest1 \ --pretty '{"execute":"query-kvm"}' <- { "return": { "enabled": true, "present": true }, "id": "libvirt-8" }
在上面的示例中,我们运行了简单的命令query-kvm,它检查主机是否能够运行KVM以及KVM是否已启用。
要使用QEMU的标准人类可读输出格式而不是JSON格式,请使用--hmp选项
>sudovirsh qemu-monitor-command vm_guest1 --hmp "query-kvm"