跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.5

35 使用 QEMU 监视器管理虚拟机 编辑源文件

当使用 qemu-system-ARCH 命令(例如 qemu-system-x86_64)启动虚拟机时,会提供一个监视器控制台,用于与用户进行交互。使用监视器控制台中的可用命令,可以检查正在运行的操作系统,更改可移动介质,截取屏幕截图或音频,以及控制虚拟机的其他方面。

Note
注意

以下部分列出了选定的有用的 QEMU 监视器命令及其用途。要获取完整的列表,请在 QEMU 监视器命令行中输入 help

35.1 访问监视器控制台 编辑源文件

Tip
提示:对于 libvirt 没有监视器控制台

只有在使用 qemu-system-ARCH 命令直接启动虚拟机,并且正在原生 QEMU 窗口中查看其图形输出时,才能访问监视器控制台。

如果您使用 libvirt(例如,使用 virt-manager)启动虚拟机,并通过 VNC 或 Spice 会话查看其输出,则无法直接访问监视器控制台。但是,您可以通过 virsh 将监视器命令发送到虚拟机

# virsh qemu-monitor-command COMMAND

访问监视器控制台的方式取决于用于查看虚拟机输出的显示设备。有关显示的更多详细信息,请参阅 第 34.3.2.2 节,“显示选项”。例如,要在使用 -display gtk 选项时查看监视器,请按 CtrlAlt2。 同样,当使用 -nographic 选项时,可以通过按以下组合键切换到监视器控制台:CtrlAC

在使用控制台时获取帮助,请使用 help?。要获取特定命令的帮助,请使用 help COMMAND

35.2 获取有关客户机系统的信息 编辑源文件

要获取有关客户机系统的信息,请使用 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

显示可用的跟踪事件及其状态。

35.3 更改 VNC 密码 编辑源文件

要更改 VNC 密码,请使用 change vnc password 命令并输入新密码

(qemu) change vnc password
Password: ********
(qemu)

35.4 管理设备 编辑源文件

要在客户机运行时添加新磁盘(热插拔),请使用 drive_adddevice_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-pciscsi-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"
Tip
提示

使用 device_add 命令添加的设备可以使用 device_del 从客户机中删除。有关更多信息,请在 QEMU 监视器命令行中输入 help device_del

要释放连接到可移动介质设备的设备或文件,请使用 eject DEVICE 命令。使用可选的 -f 强制弹出。

要更改可移动介质(如 CD-ROM),请使用 change DEVICE 命令。可以使用 info block 命令确定可移动介质的名称

(qemu) info block
ide1-cd0: type=cdrom removable=1 locked=0 file=/dev/sr0 ro=1 drv=host_device
(qemu) change ide1-cd0 /path/to/image

35.5 控制键盘和鼠标 编辑源文件

如果需要,可以使用监视器控制台模拟键盘和鼠标输入。例如,如果您的图形用户界面在较低级别拦截某些键组合(例如 X Window Syustem 中的 CtrlAltF1),则可以使用 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 命令获取设备索引号。

35.6 更改可用内存 编辑源文件

如果虚拟机使用 -balloon virtio 选项启动(因此启用了半虚拟化气球设备),则可以动态更改可用内存。有关启用气球设备的更多信息,请参阅 第 33.1 节,“使用 qemu-system-ARCH 进行基本安装”

要在监视器控制台中获取有关气球设备的信息并确定是否启用了该设备,请使用 info balloon 命令

(qemu) info balloon

如果启用了气球设备,请使用 balloon MEMORY_IN_MB 命令设置请求的内存量

(qemu) balloon 400

35.7 转储虚拟机内存 编辑源文件

要将虚拟机的内存内容保存到磁盘或控制台输出,请使用以下命令

memsaveADDRSIZEFILENAME

将从 ADDR 开始、大小为 SIZE 的虚拟内存转储保存到文件 FILENAME

pmemsaveADDRSIZEFILENAME

将从 ADDR 开始、大小为 SIZE 的物理内存转储保存到文件 FILENAME

x /FMTADDR

从地址 ADDR 开始进行虚拟内存转储,并根据 FMT 字符串进行格式化。FMT 字符串由三个参数组成 COUNTFORMATSIZE

COUNT 参数是要转储的项目数。

FORMAT 可以是 x(十六进制)、d(有符号十进制)、u(无符号十进制)、o(八进制)、c(字符)或 i(汇编指令)。

SIZE 参数可以是 b(8 位)、h(16 位)、w(32 位)或 g(64 位)。在 x86 上,可以使用 i 格式指定 hw,以分别选择 16 位或 32 位代码指令大小。

xp /FMTADDR

从地址 ADDR 开始进行物理内存转储,并根据 FMT 字符串进行格式化。FMT 字符串由三个参数组成 COUNTFORMATSIZE

COUNT 参数是要转储的项目数。

FORMAT 可以是 x(十六进制)、d(有符号十进制)、u(无符号十进制)、o(八进制)、c(字符)或 i(汇编指令)。

SIZE 参数可以是 b(8 位)、h(16 位)、w(32 位)或 g(64 位)。在 x86 上,可以使用 i 格式指定 hw,以分别选择 16 位或 32 位代码指令大小。

35.8 管理虚拟机快照 编辑源文件

目前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

1

快照的唯一自动递增的标识号。

2

快照的唯一描述字符串。旨在作为ID的可读版本。

3

快照占用的磁盘空间。请注意,运行应用程序消耗的内存越多,快照越大。

4

创建快照的时间和日期。

5

虚拟机的当前时钟状态。

35.9 暂停和恢复虚拟机执行 编辑源文件

以下命令可用于暂停和恢复虚拟机

stop

暂停虚拟机的执行。

cont

恢复虚拟机的执行。

system_reset

重置虚拟机。效果类似于物理机上的重置按钮。这可能会导致文件系统处于不干净的状态。

system_powerdown

向机器发送ACPI关机请求。效果类似于物理机上的电源按钮。

qquit

立即终止QEMU。

35.10 实时迁移 编辑源文件

实时迁移过程允许在不中断可用性的情况下,将任何虚拟机从一个主机系统传输到另一个主机系统。可以永久更改主机,或仅在维护期间更改主机。

实时迁移的要求

  • 第10.7.1节,“迁移要求”中的所有要求均适用。

  • 实时迁移只能在具有相同CPU功能的VM主机服务器之间进行。

  • AHCI接口、VirtFS功能以及-mem-path命令行选项与迁移不兼容。

  • 源主机和目标主机上的Guest必须以相同的方式启动。

  • -snapshot qemu命令行选项不应用于迁移(并且此qemu命令行选项不受支持)。

Important
重要:支持状态

openSUSE Leap中,postcopy模式尚未得到支持。它仅作为技术预览发布。有关postcopy的更多信息,请参见http://wiki.qemu.org/Features/PostCopyLiveMigration

更多建议可以在以下网站找到:http://www.linux-kvm.org/page/Migration

实时迁移过程的步骤如下

  1. 虚拟机实例正在源主机上运行。

  2. 虚拟机在目标主机上以冻结侦听模式启动。使用的参数与源主机上的参数相同,再加上-incoming tcp:IP:PORT参数,其中IP指定IP地址,PORT指定侦听传入迁移的端口。如果将0设置为IP地址,虚拟机将侦听所有接口。

  3. 在源主机上,切换到监视器控制台,并使用migrate -d tcp: DESTINATION_IP:PORT命令启动迁移。

  4. 要确定迁移的状态,请在源主机上的监视器控制台中使用info migrate命令。

  5. 要取消迁移,请在源主机上的监视器控制台中使用migrate_cancel命令。

  6. 要设置迁移的可容忍的最大停机时间(以秒为单位),请使用migrate_set_downtime NUMBER_OF_SECONDS命令。

  7. 要设置迁移的最大速度(以字节/秒为单位),请使用migrate_set_speed BYTES_PER_SECOND命令。

35.11 QMP - QEMU 机器协议 编辑源文件

QMP是一个基于JSON的协议,允许应用程序(例如libvirt)与正在运行的QEMU实例进行通信。有几种方法可以使用QMP命令访问QEMU监视器。

35.11.1 通过标准输入/输出访问QMP 编辑源文件

使用QMP的最灵活方法是指定-mon选项。以下示例使用标准输入/输出创建QMP实例。在以下示例中,->标记从客户端发送到正在运行的QEMU实例的行,而<-标记QEMU返回的输出行。

> sudo qemu-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": {
    }
}

35.11.2 通过telnet访问QMP 编辑源文件

除了标准输入/输出之外,您可以将QMP接口连接到网络套接字并通过指定的端口与其进行通信

> sudo qemu-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上

> sudo qemu-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

35.11.3 通过Unix套接字访问QMP 编辑源文件

使用-qmp选项调用QEMU,并创建一个Unix套接字

> sudo qemu-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)从同一主机上的另一个终端

> sudo nc -U /tmp/qmp-sock
<- {"QMP": {"version": {"qemu": {"micro": 0, "minor": 0, "major": 2} [...]

35.11.4 通过libvirtvirsh命令访问QMP 编辑源文件

如果您的虚拟机在libvirt下运行(请参见第II部分,“使用libvirt管理虚拟机”),您可以通过运行virsh qemu-monitor-command与其正在运行的Guest进行通信

> sudo virsh qemu-monitor-command vm_guest1 \
--pretty '{"execute":"query-kvm"}'
<- {
    "return": {
        "enabled": true,
        "present": true
    },
    "id": "libvirt-8"
}

在上面的示例中,我们运行了简单的命令query-kvm,它检查主机是否能够运行KVM以及KVM是否已启用。

Tip
提示:生成人类可读的输出

要使用QEMU的标准人类可读输出格式而不是JSON格式,请使用--hmp选项

> sudo virsh qemu-monitor-command vm_guest1 --hmp "query-kvm"
打印此页面