跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 虚拟化指南 / 使用 libvirt 管理虚拟机 / 基本 VM Guest 管理
适用范围 SUSE Linux Enterprise Server 15 SP4

11 基本 VM Guest 管理

使用虚拟机管理器图形应用程序或者在命令行上使用 virsh 可以完成大部分管理任务,例如启动或停止 VM Guest。而要通过 VNC 连接到图形控制台,就只能从图形用户界面进行。

注意
注意:管理远程 VM 主机服务器上的 VM Guest

如果 VM 主机服务器上启动了虚拟机管理器、virshvirt-viewer 这些 libvirt 工具,则可以使用它们来管理主机上的 VM Guest。不过,您也可以管理远程 VM 主机服务器上的 VM Guest。这需要在主机上为 libvirt 配置远程访问权限。有关说明,请参见第 12 章 “连接和授权

要使用虚拟机管理器连接到此类远程主机,需要按照第 12.2.2 节 “使用虚拟机管理器管理连接”中所述设置连接。如果通过 virshvirt-viewer 连接到远程主机,需要使用参数 -c 指定连接 URI(例如,virsh -c qemu+tls://saturn.example.com/systemvirsh -c xen+ssh://)。连接 URI 的格式取决于连接类型和超级管理程序 — 有关细节,请参见第 12.2 节 “连接到 VM 主机服务器”

本章列出的所有示例都不包含连接 URI。

11.1 列出 VM Guest

VM Guest 列表显示 VM 主机服务器上由 libvirt 管理的所有 VM Guest。

11.1.1 使用虚拟机管理器列出 VM Guest

虚拟机管理器的主窗口会列出它所连接的每台 VM 主机服务器的所有 VM Guest。每个 VM Guest 项包含该计算机的名称及状态(正在运行已暂停已关闭),这些信息以图标、文本和 CPU 使用率条的形式显示。

11.1.2 使用 virsh 列出 VM Guest

使用 virsh list 命令可获取 VM Guest 的列表:

列出所有正在运行的 Guest
> virsh list
列出所有正在运行的 Guest 以及非活动的 Guest
> virsh list --all

有关详细信息和其他选项,请参见 virsh help listman 1 virsh

11.2 通过控制台访问 VM Guest

可以通过 VNC 连接(图形控制台)或串行控制台(如果受 Guest 操作系统的支持)访问 VM Guest。

11.2.1 打开图形控制台

打开与 VM Guest 连接的图形控制台可与该计算机交互,就如同通过 VNC 连接与物理主机交互一样。如果访问 VNC 服务器需要身份验证,系统会提示您输入用户名(如果适用)和口令。

当您单击进入 VNC 控制台时,光标将被夺取,不能再在控制台外部使用。要释放光标,请按 AltCtrl

提示
提示:无缝(绝对)光标移动

为防止控制台夺取光标,同时为了启用无缝光标移动,请向 VM Guest 添加绘图板输入设备。有关更多信息,请参见第 14.5 节 “输入设备”

某些组合键(例如 CtrlAltDel)由主机解释,不会传递给 VM Guest。要将此类组合键传递给 VM Guest,请在 VNC 窗口中打开发送键菜单,然后选择所需的组合键项。仅当使用虚拟机管理器和 virt-viewer 时,发送键菜单才可用。借助虚拟机管理器,可以按照提示:将组合键传递给虚拟机中所述改用粘滞键功能。

注意
注意:支持的 VNC 查看器

理论上而言,所有 VNC 查看器都可连接到 VM Guest 的控制台。但如果您是使用 SASL 身份验证和/或 TLS/SSL 连接来访问 Guest 的,那么您的选择就比较有限。tightvnctigervnc 等常见 VNC 查看器既不支持 SASL 身份验证,也不支持 TLS/SSL。唯一可替代虚拟机管理器和 virt-viewer 的工具是 Remmina(请参见第 14.2 节 “Remmina:远程桌面客户端”)。

11.2.1.1 使用虚拟机管理器打开图形控制台

  1. 在虚拟机管理器中,右键单击某个 VM Guest 项。

  2. 从弹出菜单中选择打开

11.2.1.2 使用 virt-viewer 打开图形控制台

virt-viewer 是一个简单的 VNC 查看器,其中添加了用于显示 VM Guest 控制台的功能。例如,可以 wait 模式启动该查看器,在此情况下,它会先等待 VM Guest 启动,然后再建立连接。它还支持自动重新连接到重引导的 VM Guest。

virt-viewer 按名称、ID 或 UUID 对 VM Guest 进行寻址。使用 virsh list --all 可获取这些数据。

要连接到正在运行或已暂停的 Guest,请使用 ID、UUID 或名称。已关闭的 VM Guest 没有 ID — 您只能按 UUID 或名称与其建立连接。

连接到 ID 为 8 的 Guest
> virt-viewer 8
连接到名为 sles12 的非活动 Guest;Guest 启动后,连接窗口就会打开
> virt-viewer --wait sles12

如果使用 --wait 选项,即使 VM Guest 此刻未运行,也会保持连接。当 Guest 启动时,查看器即会启动。

有关详细信息,请参见 virt-viewer --helpman 1 virt-viewer

注意
注意:通过 SSH 建立远程连接时输入的口令

使用 virt-viewer 通过 SSH 来与远程主机建立连接时,需要输入 SSH 口令两次。第一次用于向 libvirt 进行身份验证,第二次用于向 VNC 服务器进行身份验证。第二个口令需要在启动 virt-viewer 的命令行上提供。

11.2.2 打开串行控制台

要访问虚拟机的图形控制台,需要在访问 VM Guest 的客户端上提供一个图形环境。或者,也可通过串行控制台和 virsh 在外壳中访问使用 libvirt 管理的虚拟机。要打开与名为 sles12 的 VM Guest 连接的串行控制台,请运行以下命令:

> virsh console sles12

virsh console 接受两个可选标志:--safe 确保以独占方式访问控制台,--force 在连接之前断开与所有现有会话的连接。这两个功能需受 Guest 操作系统的支持。

Guest 操作系统必须支持串行控制台访问,并且该操作系统也受到适当的支持,才能通过串行控制台连接到 VM Guest。有关详细信息,请参见 Guest 操作系统手册。

提示
提示:为 SUSE Linux Enterprise Guest 和 openSUSE Guest 启用串行控制台访问

SUSE Linux Enterprise 和 openSUSE 中默认会禁用串行控制台访问。要启用它,请执行下列步骤:

SLES 12 和 up/openSUSE

启动 YaST 引导加载器模块并切换到内核参数选项卡。将 console=ttyS0 添加到字段可选内核命令行参数

SLES 11

启动 YaST 引导加载器模块,并选择要为其激活串行控制台访问的引导项。选择编辑,并将 console=ttyS0 添加到字段可选内核命令行参数。此外,请编辑 /etc/inittab 并取消注释包含以下内容的行:

#S0:12345:respawn:/sbin/agetty -L 9600 ttyS0 vt102

11.3 更改 VM Guest 的状态:启动、停止、暂停

可以使用虚拟机管理器或 virsh 来启动、停止或暂停 VM Guest。您还可以将 VM Guest 配置为在引导 VM 主机服务器时自动启动。

关闭 VM Guest 时,可将其正常关机或强制关机。后一种操作的效果等同于拔下物理主机上的电源插头,建议仅在没有其他办法时才这样做。强制关机可能导致 VM Guest 上的文件系统损坏或数据丢失。

提示
提示:正常关机

要能够执行正常关机,必须将 VM Guest 配置为支持 ACPI。如果 Guest 是使用虚拟机管理器创建的,则可在 VM Guest 中使用 ACPI。

根据 Guest 操作系统,能够使用 ACPI 可能还不足以执行正常关机。在生产环境中使用 Guest 之前,强烈建议先对其进行关机和重引导测试。例如,openSUSE 或 SUSE Linux Enterprise Desktop 可能需要获得 PolKit 授权才能关机和重引导。确保已在所有 VM Guest 上关闭此策略。

如果在安装 Windows XP/Windows Server 2003 Guest 期间启用了 ACPI,只在 VM Guest 配置中开启 ACPI 并不足够。有关更多信息,请参见:

无论 VM Guest 的配置如何,始终都可以从 Guest 操作系统内部实现正常关机。

11.3.1 使用虚拟机管理器更改 VM Guest 的状态

可以通过虚拟机管理器的主窗口或 VNC 窗口更改 VM Guest 的状态。

过程 11.1︰ 通过虚拟机管理器窗口更改状态
  1. 右键单击某个 VM Guest 项。

  2. 在弹出菜单中选择运行暂停或其中一个关机选项

过程 11.2︰ 通过 VNC 窗口更改状态
  1. 按照第 11.2.1.1 节 “使用虚拟机管理器打开图形控制台”中所述打开 VNC 窗口。

  2. 在工具栏或虚拟机菜单中,选择运行暂停或其中一个关机选项。

11.3.1.1 自动启动 VM Guest

您可以在引导 VM 主机服务器时自动启动 Guest。此功能默认未启用,需要为每个 VM Guest 单独启用。无法全局激活此功能。

  1. 在虚拟机管理器中双击 VM Guest 项以打开其控制台。

  2. 选择视图 › 细节打开 VM Guest 配置窗口。

  3. 选择引导选项,然后选中在主机引导时启动虚拟机

  4. 单击应用保存新配置。

11.3.2 使用 virsh 更改 VM Guest 的状态

以下示例会更改名为 sles12 的 VM Guest 的状态。

开始
> virsh start sles12
暂停
> virsh suspend sles12
恢复(已暂停的 VM Guest)
> virsh resume sles12
重引导
> virsh reboot sles12
正常关机
> virsh shutdown sles12
强制关机
> virsh destroy sles12
开启自动启动
> virsh autostart sles12
关闭自动启动
> virsh autostart --disable sles12

11.4 保存和恢复 VM Guest 的状态

保存 VM Guest 会保留其内存的确切状态。该操作类似于将计算机休眠。保存的 VM Guest 可以快速恢复到以前保存的运行中状况。

保存时,VM Guest 将会暂停,其当前内存状态将保存到磁盘,然后该 Guest 停止。该操作不会复制 VM Guest 虚拟磁盘的任何一部分。保存虚拟机所需的时长取决于分配的内存量。保存时,VM Guest 的内存将返回到 VM 主机服务器上的可用内存池。

恢复操作将装载先前保存的 VM Guest 内存状态文件并启动该 Guest。该 Guest 不会引导,而是在以前保存它的位置继续运行。该操作类似于退出休眠状态。

VM Guest 将保存到某个状态文件。请确保要保存到的分区有足够的空间。要估计预期的文件大小(以 MB 为单位),请在 Guest 上发出以下命令:

> free -mh | awk '/^Mem:/ {print $3}'
警告
警告:始终恢复保存的 Guest

使用保存操作后,请不要引导或启动保存的 VM Guest。这样做会使计算机的虚拟磁盘和保存的内存状态不同步,有可能导致在恢复 Guest 时发生严重错误。

要能够再次使用保存的 VM Guest,请使用恢复操作。如果您是使用 virsh 保存 VM Guest 的,将无法使用虚拟机管理器将其恢复。在这种情况下,请务必使用 virsh 进行恢复。

重要
重要:恢复 VM Guest 后同步其时间

如果您在保存 VM Guest 后,经过长时间(数小时)的暂停再恢复该 Guest,其时间同步服务(例如 chronyd)可能会拒绝同步其时间。在这种情况下,请手动同步 VM Guest 的时间。例如,对于 KVM 主机,可以使用 QEMU Guest 代理,并使用 guest-set-time 来指示 Guest 设置时间。有关更多详细信息,请参见第 20 章 “QEMU Guest 代理

重要
重要:仅适用于磁盘类型为 rawqcow2 的 VM Guest

仅当 VM Guest 使用的虚拟磁盘为 raw (.img) 或 qcow2 类型时,才可以保存和恢复该 VM Guest。

11.4.1 使用虚拟机管理器保存/恢复

过程 11.3︰ 保存 VM Guest
  1. 打开 VM Guest 的 VNC 连接窗口。确保该 Guest 正在运行。

  2. 选择虚拟机 › 关机 › 保存

过程 11.4︰ 恢复 VM Guest
  1. 打开 VM Guest 的 VNC 连接窗口。确保该 Guest 未运行。

  2. 选择虚拟机 › 恢复

    如果 VM Guest 以前是使用虚拟机管理器保存的,则系统不会为您提供用于运行该 Guest 的选项。但请注意警告:始终恢复保存的 Guest中所述的有关使用 virsh 保存的计算机的注意事项。

11.4.2 使用 virsh 保存和恢复

使用 virsh save 命令保存运行中的 VM Guest,并指定要将其保存到的文件。

保存名为 opensuse13 的 Guest
> virsh save opensuse13 /virtual/saves/opensuse13.vmsav
保存 ID 为 37 的 Guest
> virsh save 37 /virtual/saves/opensuse13.vmsave

要恢复 VM Guest,请使用 virsh restore

> virsh restore /virtual/saves/opensuse13.vmsave

11.5 创建和管理快照

VM Guest 快照是整个虚拟机的快照,包括 CPU、RAM、设备的状态,以及所有可写磁盘的内容。要使用虚拟机快照,所有挂接的硬盘均需使用 qcow2 磁盘映像格式,并且其中至少有一个硬盘需是可写的。

快照可让您将计算机恢复到特定时间点的状态。在撤消有错误的配置或者安装大量软件包时,此功能十分有用。启动一个在 VM Guest 处于关闭状态下创建的快照后,需要引导该 Guest。在该时间点之后写入磁盘的所有更改都将在启动快照时丢失。

注意
注意

快照仅在 KVM VM 主机服务器上受支持。

11.5.1 术语

有多个特定术语用于描述快照的类型:

内部快照

保存到原始 VM Guest 的 qcow2 文件中的快照。该文件包含保存的快照状态,以及自截取快照以来发生的更改。内部快照的主要优势是它们全都储存在一个文件中,因此方便在多个计算机之间复制或移动。

外部快照

创建外部快照时,会保存原始 qcow2 文件并将其设为只读,同时会创建一个新的 qcow2 文件用于存放更改。原始文件有时称为“后备”文件或“基础”文件,包含所有更改的新文件称为“覆盖”文件或“派生”文件。备份 VM Guest 时,外部快照很有用。但外部快照不受虚拟机管理器的支持,且无法直接通过 virsh 删除。有关 QEMU 中外部快照的详细信息,请参见第 34.2.4 节 “有效操作磁盘映像”

实时快照

当原始 VM Guest 正在运行时创建的快照。内部实时快照支持保存设备以及内存和磁盘状态,而使用 virsh 的外部实时快照则支持保存内存状态和/或磁盘状态。

脱机快照

基于已关闭的 VM Guest 创建的快照。由于 Guest 的所有进程已停止且未使用任何内存,因此此类快照可确保数据完整性。

11.5.2 使用虚拟机管理器创建和管理快照

重要
重要:仅限内部快照

虚拟机管理器仅支持实时或脱机的内部快照。

要在虚拟机管理器中打开快照管理视图,请按照第 11.2.1.1 节 “使用虚拟机管理器打开图形控制台”中所述打开 VNC 窗口。现在请选择视图 › 快照,或单击工具栏中的管理 VM 快照

Image

所选 VM Guest 的现有快照列表显示在窗口的左侧。上次启动的快照带有绿色对勾标记。窗口的右侧显示列表中当前标记的快照的细节。这些细节包括快照的标题和时戳、截取快照时 VM Guest 的状态以及说明。运行中 Guest 的快照还包括一个屏幕截图。可以直接在此视图中更改说明。其他快照数据不可更改。

11.5.2.1 创建快照

要截取 VM Guest 的新快照,请执行以下操作:

  1. (可选)如果您要创建脱机快照,请关闭 VM Guest。

  2. 单击 VNC 窗口左下角的添加

    创建快照窗口即会打开。

  3. 提供名称和说明(可选)。截取快照后将无法更改该名称。为方便以后识别该快照,请使用自述性名称

  4. 单击完成确认。

11.5.2.2 删除快照

要删除 VM Guest 的快照,请执行以下操作:

  1. 单击 VNC 窗口左下角的删除

  2. 单击确认删除。

11.5.2.3 启动快照

要启动快照,请执行以下操作:

  1. 单击 VNC 窗口左下角的运行

  2. 单击确认启动。

11.5.3 使用 virsh 创建和管理快照

要列出某个域(以下示例中为 admin_server)的所有现有快照,请运行 snapshot-list 命令:

> virsh snapshot-list --domain sle-ha-node1
 Name                 Creation Time             State
------------------------------------------------------------
 sleha_12_sp2_b2_two_node_cluster 2016-06-06 15:04:31 +0200 shutoff
 sleha_12_sp2_b3_two_node_cluster 2016-07-04 14:01:41 +0200 shutoff
 sleha_12_sp2_b4_two_node_cluster 2016-07-14 10:44:51 +0200 shutoff
 sleha_12_sp2_rc3_two_node_cluster 2016-10-10 09:40:12 +0200 shutoff
 sleha_12_sp2_gmc_two_node_cluster 2016-10-24 17:00:14 +0200 shutoff
 sleha_12_sp3_gm_two_node_cluster 2017-08-02 12:19:37 +0200 shutoff
 sleha_12_sp3_rc1_two_node_cluster 2017-06-13 13:34:19 +0200 shutoff
 sleha_12_sp3_rc2_two_node_cluster 2017-06-30 11:51:24 +0200 shutoff
 sleha_15_b6_two_node_cluster 2018-02-07 15:08:09 +0100 shutoff
 sleha_15_rc1_one-node 2018-03-09 16:32:38 +0100 shutoff

使用 snapshot-current 命令显示上次启动的快照:

> virsh snapshot-current --domain admin_server
Basic installation incl. SMT for CLOUD4

运行 snapshot-info 命令可以获取有关特定快照的细节:

> virsh snapshot-info --domain admin_server \
   -name  "Basic installation incl. SMT for CLOUD4"
Name:           Basic installation incl. SMT for CLOUD4
Domain:         admin_server
Current:        yes
State:          shutoff
Location:       internal
Parent:         Basic installation incl. SMT for CLOUD3-HA
Children:       0
Descendants:    0
Metadata:       yes

11.5.3.1 创建内部快照

要截取 VM Guest 的内部快照(实时或脱机快照),请按如下所示使用 snapshot-create-as 命令:

> virsh snapshot-create-as --domain admin_server1 --name "Snapshot 1"2 \
--description "First snapshot"3

1

域名。必需。

2

快照的名称。建议使用自述性名称,这样可以更轻松地识别该快照。必需。

3

快照的说明。可选。

11.5.3.2 创建外部快照

使用 virsh 可以截取 Guest 内存状态和/或磁盘状态的外部快照。

要同时截取 Guest 磁盘的实时和脱机外部快照,请指定 --disk-only 选项:

> virsh snapshot-create-as --domain admin_server --name \
 "Offline external snapshot" --disk-only

可以指定 --diskspec 选项来控制外部文件的创建方式:

> virsh snapshot-create-as --domain admin_server --name \
 "Offline external snapshot" \
 --disk-only --diskspec vda,snapshot=external,file=/path/to/snapshot_file

要截取 Guest 内存的实时外部快照,请指定 --live--memspec 选项:

> virsh snapshot-create-as --domain admin_server --name \
 "Offline external snapshot" --live \
 --memspec snapshot=external,file=/path/to/snapshot_file

要截取 Guest 磁盘和内存状态的实时外部快照,请将 --live--diskspec--memspec 选项结合使用:

> virsh snapshot-create-as --domain admin_server --name \
 "Offline external snapshot" --live \
 --memspec snapshot=external,file=/path/to/snapshot_file
 --diskspec vda,snapshot=external,file=/path/to/snapshot_file

有关更多细节,请参见 man 1 virsh 中的“快照命令”部分。

11.5.3.3 删除快照

无法使用 virsh 删除外部快照。要删除 VM Guest 的内部快照并恢复其占用的磁盘空间,请使用 snapshot-delete 命令:

> virsh snapshot-delete --domain admin_server --snapshotname "Snapshot 2"

11.5.3.4 启动快照

要启动快照,请使用 snapshot-revert 命令:

> virsh snapshot-revert --domain admin_server --snapshotname "Snapshot 1"

要启动当前快照(用于启动 VM Guest 的快照),使用 --current 便已足够,不需要指定快照名称:

> virsh snapshot-revert --domain admin_server --current

11.6 删除 VM Guest

默认情况下,使用 virsh 删除 VM Guest 只会去除其 XML 配置。由于默认不会删除挂接的储存设备,因此您可以在另一个 VM Guest 上重复使用该储存设备。使用虚拟机管理器还可以删除 Guest 的储存文件 — 这会彻底擦除该 Guest。

11.6.1 使用虚拟机管理器删除 VM Guest

  1. 在虚拟机管理器中,右键单击某个 VM Guest 项。

  2. 从上下文菜单中选择删除

  3. 一个确认窗口即会打开。单击删除会永久擦除该 VM Guest。该删除操作不可恢复。

    您还可以通过激活删除关联的储存文件来永久删除 Guest 的虚拟磁盘。该删除操作也不可恢复。

11.6.2 使用 virsh 删除 VM Guest

要删除 VM Guest,需先将其关闭。无法删除运行中的 Guest。有关关机的信息,请参见第 11.3 节 “更改 VM Guest 的状态:启动、停止、暂停”

要使用 virsh 删除 VM Guest,请运行 virsh undefine VM_NAME

> virsh undefine sles12

没有可自动删除挂接的储存文件的选项。如果这些文件由 libvirt 管理,请按照第 9.2.1.4 节 “从储存池中删除卷”中所述将其删除。

11.7 迁移 VM Guest

虚拟化的主要优势之一是 VM Guest 可移植。当某台 VM 主机服务器出于维护目的而需要关闭时,或者当该主机过载时,可以轻松将 Guest 迁移到另一台 VM 主机服务器。KVM 和 Xen 甚至支持实时迁移,在此期间,VM Guest 仍然可用。

11.7.1 迁移要求

要成功将 VM Guest 迁移到另一台 VM 主机服务器,需符合以下要求:

重要
重要

要使用复制后实时迁移选项,采用内核版本 5.11 或更高版本的 KVM 主机需要将 unprivileged_userfaultfd 系统值设置为 1

> sudo sysctl -w vm.unprivileged_userfaultfd=1

由于 5.11 之前的内核版本无需设置 unprivileged_userfaultfd 即可使用复制后实时迁移选项,因此 libvirt/usr/lib/sysctl.d/60-qemu-postcopy-migration.conf 文件中提供了用于保留旧行为的设置。

  • 源和目标系统必须采用相同的体系结构。

  • 这两台计算机必须均可访问储存设备(例如,通过 NFS 或 iSCSI),并且必须将储存设备配置为这两台计算机上的储存池。有关更多信息,请参见第 13 章 “高级储存主题

    在迁移期间连接的 CD-ROM 或软盘映像也需要符合此要求。不过,您可以按照第 14.11 节 “使用虚拟机管理器弹出和更换软盘或 CD/DVD-ROM 媒体”中所述在迁移之前断开其连接。

  • 这两台 VM 主机服务器上都需要运行 libvirtd,并且您必须能够打开从目标主机到源主机(或反向)的远程 libvirt 连接。有关详细信息,请参考 第 12.3 节 “配置远程连接”

  • 如果目标主机上在运行防火墙,则需要打开端口以允许迁移。如果您在迁移期间不指定端口,libvirt 将从 49152:49215 范围内选择一个端口。确保在目标主机上的防火墙中打开此端口范围(建议)或所选的专用端口。

  • 主机和目标计算机应位于网络上的同一子网中,否则迁移后网络功能无法正常工作。

  • 参与迁移的所有 VM 主机服务器必须具有 qemu 用户的相同 UID,并具有 kvm、qemu 和 libvirt 组的相同 GID。

  • 目标主机上不能存在正在运行或已暂停的同名 VM Guest。如果存在已关闭的同名计算机,其配置将被重写。

  • 迁移 VM Guest 时支持除主机 CPU 型号以外的所有 CPU 型号。

  • SATA 磁盘设备类型不可迁移。

  • 文件系统直通功能不可迁移。

  • 需在 VM 主机服务器和 VM Guest 上安装适当的计时功能。请参见第 18 章 “VM Guest 时钟设置

  • 无法将物理设备从主机迁移到 Guest。目前,在使用具有 PCI 直通或 SR-IOV 功能的设备时,不支持实时迁移。如果需要支持实时迁移,则需使用软件虚拟化(半虚拟化或全虚拟化)。

  • 缓存模式设置是重要的迁移设置。请参见 第 17.6 节 “缓存模式和实时迁移”

  • 不支持向后迁移(例如,从 SLES 15 SP2 迁移到 15 SP1)。

  • SUSE 正致力于支持将 VM Guest 从运行 LTSS 所涵盖的服务包的 VM 主机服务器,迁移到运行同一 SLES 主要版本中更新的服务包的 VM 主机服务器。例如,将 VM Guest 从 SLES 12 SP2 主机迁移到 SLES 12 SP5 主机。对于从 LTSS 迁移到更新的服务包的方案,SUSE 只会执行极简单的测试,建议在尝试迁移关键的 VM Guest 之前执行全面的现场测试。

  • 在两台主机上,映像目录应位于同一路径中。

  • 所有主机的微代码级别(尤其是 spectre 微代码更新)应该相同。在所有主机上安装 SUSE Linux Enterprise Server 的最新更新即可实现此目的。

11.7.2 使用虚拟机管理器进行迁移

使用虚拟机管理器迁移 VM Guest 时,在哪台计算机上启动虚拟机管理器并不重要。您可以在源主机或目标主机上启动虚拟机管理器,甚至可以在这两台之外的主机上启动。对于后一种情况,您需要能够同时与目标主机和源主机建立远程连接。

  1. 启动虚拟机管理器,并与目标主机或源主机建立连接。如果虚拟机管理器不是在目标主机或源主机上启动的,则需要与这两台主机都建立连接。

  2. 右键单击要迁移的 VM Guest,然后选择迁移。确保该 Guest 正在运行或已暂停 — 关闭的 Guest 无法迁移。

    提示
    提示:提高迁移速度

    要将迁移速度提高到一定程度,请暂停 VM Guest。这相当于使用前面所述的虚拟机管理器中的脱机迁移选项。

  3. 为 VM Guest 选择一个新主机。如果所需的目标主机未显示,请确保您已连接到该主机。

    要更改用于连接到远程主机的默认选项,请在连接下设置模式,以及目标主机的地址(IP 地址或主机名)和端口。如果指定了端口,还必须指定地址

    高级选项下,选择迁移是永久性的(默认设置)还是暂时性的(使用暂时移动)。

    此外我们还提供了一个选项允许不安全的迁移,它允许在不禁用 VM 主机服务器缓存的情况下进行迁移。这样可以加速迁移,但仅当当前配置能够在不使用 cache="none"/0_DIRECT 的情况下提供一致的 VM Guest 储存信息时,此选项才起作用。

    注意
    注意:带宽选项

    在最近的虚拟机管理器版本中,去除了用于设置迁移带宽的选项。要设置特定的带宽,请改用 virsh

  4. 要执行迁移,请单击迁移

    迁移完成后,迁移窗口将会关闭,该 VM Guest 随即列在虚拟机管理器窗口中的新主机上。原始 VM Guest 仍可在目标主机上使用(处于关机状态)。

11.7.3 使用 virsh 进行迁移

要使用 virsh migrate 迁移 VM Guest,您需要能够直接访问或者通过外壳远程访问 VM 主机服务器,因为命令需在主机上运行。迁移命令如下所示:

> virsh migrate [OPTIONS] VM_ID_or_NAME CONNECTION_URI [--migrateuri tcp://REMOTE_HOST:PORT]

下面列出了最重要的选项。有关完整列表,请参见 virsh help migrate

--live

执行实时迁移。如果未指定此选项,Guest 将会在迁移期间暂停(脱机迁移)。

--suspend

执行脱机迁移,且不重启动目标主机上的 VM Guest。

--persistent

默认情况下,迁移的 VM Guest 只是暂时性迁移,因此 Guest 关闭后,系统会自动在目标主机上删除其配置。使用此开关可使迁移变为永久性迁移。

--undefinesource

如果指定此选项,成功迁移后,将删除源主机上的 VM Guest 定义(但不会删除挂接到此 Guest 的虚拟磁盘)。

--parallel --parallel-connections NUM_OF_CONNECTIONS

当单个迁移线程无法使源主机与目标主机之间的网络链接饱和时,可以使用并行迁移来提高迁移数据吞吐量。在具备 40 GB 网络接口的主机上,可能需要四个迁移线程才能使链接饱和。使用并行迁移可以大幅缩短迁移大内存 VM 所需的时间。

以下示例使用 mercury.example.com 作为源系统,使用 jupiter.example.com 作为目标系统;VM Guest 的名称为 opensuse131,ID 为 37

使用默认参数进行脱机迁移
> virsh migrate 37 qemu+ssh://tux@jupiter.example.com/system
使用默认参数进行瞬态实时迁移
> virsh migrate --live opensuse131 qemu+ssh://tux@jupiter.example.com/system
永久性实时迁移;删除源上的 VM 定义
> virsh migrate --live --persistent --undefinesource 37 \
qemu+tls://tux@jupiter.example.com/system
使用端口 49152 进行脱机迁移
> virsh migrate opensuse131 qemu+ssh://tux@jupiter.example.com/system \
--migrateuri tcp://@jupiter.example.com:49152
注意
注意:瞬态迁移与永久性迁移的比较

默认情况下,virsh migrate 为目标主机上的 VM Guest 创建暂时性(瞬态)副本。已关机版本的原始 Guest 说明将保留在源主机上。瞬态副本将会在 Guest 关机后从服务器中删除。

要为目标主机上的 Guest 创建永久副本,请使用开关 --persistent。已关机版本的原始 Guest 说明也会保留在源主机上。将选项 --undefinesource--persistent 搭配使用可以实现真正的迁移,在此情况下,将在目标主机上创建永久副本,并删除源主机上的版本。

不建议只使用 --undefinesource 而不使用 --persistent 选项,因为这会导致两个 VM Guest 定义均会在目标主机上的 Guest 关闭后丢失。

11.7.4 分步操作示例

11.7.4.1 导出储存设备

首先需要导出储存区,以便在主机之间共享 Guest 映像。可以通过一台 NFS 服务器完成此操作。在下面的示例中,我们想要共享网络 10.0.1.0/24 中所有计算机的 /volume1/VM 目录。我们将使用一台 SUSE Linux Enterprise NFS 服务器。以 root 用户身份编辑 /etc/exports 文件并添加以下内容:

/volume1/VM 10.0.1.0/24  (rw,sync,no_root_squash)

您需要重启动该 NFS 服务器:

> sudo systemctl restart nfsserver
> sudo exportfs
/volume1/VM      10.0.1.0/24

11.7.4.2 在目标主机上定义池

在您要迁移 VM Guest 的每台主机上,必须定义池才能访问卷(其中包含 Guest 映像)。我们的 NFS 服务器 IP 地址为 10.0.1.99,它的共享是 /volume1/VM 目录,而我们想要将此共享挂载 /var/lib/libvirt/images/VM 目录中。池名称为 VM。要定义此池,请创建包含以下内容的 VM.xml 文件:

<pool type='netfs'>
  <name>VM</name>
  <source>
    <host name='10.0.1.99'/>
    <dir path='/volume1/VM'/>
    <format type='auto'/>
  </source>
  <target>
    <path>/var/lib/libvirt/images/VM</path>
    <permissions>
      <mode>0755</mode>
      <owner>-1</owner>
      <group>-1</group>
    </permissions>
  </target>
  </pool>

然后使用 pool-define 命令将其装载到 libvirt

# virsh pool-define VM.xml

另一种定义此池的方法是使用 virsh 命令:

# virsh pool-define-as VM --type netfs --source-host 10.0.1.99 \
     --source-path /volume1/VM --target /var/lib/libvirt/images/VM
Pool VM created

以下命令假设您在 virsh 的交互式外壳中操作,使用不带任何参数的 virsh 命令也可以访问该外壳。然后,可将池设置为在主机引导时自动启动(autostart 选项):

virsh # pool-autostart VM
Pool VM marked as autostarted

如果您要禁用自动启动,请执行以下命令:

virsh # pool-autostart VM --disable
Pool VM unmarked as autostarted

检查该池是否存在:

virsh # pool-list --all
 Name                 State      Autostart
-------------------------------------------
 default              active     yes
 VM                   active     yes

virsh # pool-info VM
Name:           VM
UUID:           42efe1b3-7eaa-4e24-a06a-ba7c9ee29741
State:          running
Persistent:     yes
Autostart:      yes
Capacity:       2,68 TiB
Allocation:     2,38 TiB
Available:      306,05 GiB
警告
警告:池需要在所有目标主机上存在

请记住:必须在您要迁移其中的 VM Guest 的每台主机上定义此池。

11.7.4.3 创建卷

池已定义好,现在我们需要一个包含磁盘映像的卷。

virsh # vol-create-as VM sled12.qcow2 8G --format qcow2
Vol sled12.qcow2 created

稍后将会通过 virt-install 使用所示的卷名称安装 Guest。

11.7.4.4 创建 VM Guest

我们来使用 virt-install 命令创建一个 SUSE Linux Enterprise Server VM Guest。将使用 --disk 选项指定 VM 池;如果您不希望在执行迁移时使用 --unsafe 选项,建议您设置 cache=none

# virt-install --connect qemu:///system --virt-type kvm --name \
   sled12 --memory 1024 --disk vol=VM/sled12.qcow2,cache=none --cdrom \
   /mnt/install/ISO/SLE-12-Desktop-DVD-x86_64-Build0327-Media1.iso --graphics \
   vnc --os-variant sled12
Starting install...
Creating domain...

11.7.4.5 迁移 VM Guest

一切准备就绪,现在可以执行迁移。在当前托管 VM Guest 的 VM 主机服务器上运行 migrate 命令,并选择目标。

virsh # migrate --live sled12 --verbose qemu+ssh://IP/Hostname/system
Password:
Migration: [ 12 %]

11.8 监视

11.8.1 使用虚拟机管理器进行监视

启动虚拟机管理器并连接到 VM 主机服务器后,所有运行中 Guest 的 CPU 使用率图表将会显示。

您也可以通过此工具获取有关磁盘和网络使用情况的信息,不过必须先在首选项中激活此功能:

  1. 运行 virt-manager

  2. 选择编辑 › 首选项

  3. 常规选项卡切换到轮询

  4. 激活您要查看的活动类型对应的复选框:轮询磁盘 I/O轮询网络 I/O轮询内存统计信息

  5. 如果需要,还可以使用每隔 n 秒更新状态来更改更新间隔。

  6. 关闭首选项对话框。

  7. 视图 › 图表下激活应显示的图表。

此后,磁盘和网络统计信息也会显示在虚拟机管理器的主窗口中。

可以从 VNC 窗口获取更精确的数据。按照第 11.2.1 节 “打开图形控制台”中所述打开 VNC 窗口。在工具栏或视图菜单中选择细节。可以通过左侧树菜单中的性能项显示统计信息。

11.8.2 使用 virt-top 进行监视

virt-top 是一个命令行工具,与众所周知的进程监视工具 top 类似。virt-top 使用 libvirt,因此能够显示不同超级管理程序上运行的 VM Guest 的统计信息。建议使用 virt-top,而不要使用 xentop 等特定于超级管理程序的工具。

virt-top 默认会显示所有运行中 VM Guest 的统计信息。显示的数据包括已用内存百分比 (%MEM)、已用 CPU 百分比 (%CPU),以及 Guest 的运行时长 (TIME)。数据会定期更新(默认为每三秒更新一次)。下面显示了某台 VM 主机服务器上的输出,该服务器包含七个 VM Guest,其中有四个处于非活动状态:

virt-top 13:40:19 - x86_64 8/8CPU 1283MHz 16067MB 7.6% 0.5%
7 domains, 3 active, 3 running, 0 sleeping, 0 paused, 4 inactive D:0 O:0 X:0
CPU: 6.1%  Mem: 3072 MB (3072 MB by guests)

   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM    TIME   NAME
    7 R  123    1  18K  196  5.8  6.0   0:24.35 sled12_sp1
    6 R    1    0  18K    0  0.2  6.0   0:42.51 sles12_sp1
    5 R    0    0  18K    0  0.1  6.0  85:45.67 opensuse_leap
    -                                           (Ubuntu_1410)
    -                                           (debian_780)
    -                                           (fedora_21)
    -                                           (sles11sp3)

输出默认按 ID 排序。使用以下组合键可以更改排序字段:

ShiftP:CPU 使用率
ShiftM:Guest 分配的内存总量
ShiftT: 时间
ShiftI: ID

要使用任何其他字段进行排序,请按 ShiftF 并从列表中选择一个字段。要切换排序顺序,请使用 ShiftR

virt-top 还支持基于 VM Guest 数据生成不同的视图,按以下键可以即时更改视图:

0:默认视图
1:显示物理 CPU
2:显示网络接口
3:显示虚拟磁盘

virt-top 支持使用更多热键来更改数据视图,并支持许多可以影响程序行为的命令行开关。有关详细信息,请参见 man 1 virt-top

11.8.3 使用 kvm_stat 进行监视

kvm_stat 可用于跟踪 KVM 性能事件。它会监视 /sys/kernel/debug/kvm,因此需要挂载 debugfs。SUSE Linux Enterprise Server 上默认应该已挂载 debugfs。如果未挂载,请使用以下命令:

> sudo mount -t debugfs none /sys/kernel/debug

可采用三种不同的模式使用 kvm_stat

kvm_stat                    # update in 1 second intervals
kvm_stat -1                 # 1 second snapshot
kvm_stat -l > kvmstats.log  # update in 1 second intervals in log format
                            # can be imported to a spreadsheet
例 11.1︰ kvm_stat 的典型输出
kvm statistics

 efer_reload                  0       0
 exits                 11378946  218130
 fpu_reload               62144     152
 halt_exits              414866     100
 halt_wakeup             260358      50
 host_state_reload       539650     249
 hypercalls                   0       0
 insn_emulation         6227331  173067
 insn_emulation_fail          0       0
 invlpg                  227281      47
 io_exits                113148      18
 irq_exits               168474     127
 irq_injections          482804     123
 irq_window               51270      18
 largepages                   0       0
 mmio_exits                6925       0
 mmu_cache_miss           71820      19
 mmu_flooded              35420       9
 mmu_pde_zapped           64763      20
 mmu_pte_updated              0       0
 mmu_pte_write           213782      29
 mmu_recycled                 0       0
 mmu_shadow_zapped       128690      17
 mmu_unsync                  46      -1
 nmi_injections               0       0
 nmi_window                   0       0
 pf_fixed               1553821     857
 pf_guest               1018832     562
 remote_tlb_flush        174007      37
 request_irq                  0       0
 signal_exits                 0       0
 tlb_flush               394182     148

有关如何解释这些值的更多信息,请参见 http://clalance.blogspot.com/2009/01/kvm-performance-tools.html