11 基本 VM Guest 管理 #
使用虚拟机管理器图形应用程序或者在命令行上使用 virsh
可以完成大部分管理任务,例如启动或停止 VM Guest。而要通过 VNC 连接到图形控制台,就只能从图形用户界面进行。
如果 VM 主机服务器上启动了虚拟机管理器、virsh
和 virt-viewer
这些 libvirt
工具,则可以使用它们来管理主机上的 VM Guest。不过,您也可以管理远程 VM 主机服务器上的 VM Guest。这需要在主机上为 libvirt
配置远程访问权限。有关说明,请参见第 12 章 “连接和授权”。
要使用虚拟机管理器连接到此类远程主机,需要按照第 12.2.2 节 “使用虚拟机管理器管理连接”中所述设置连接。如果您通过 virsh
或 virt-viewer
连接到远程主机,需要使用参数 -c
指定连接 URI(例如,virsh -c
qemu+tls://saturn.example.com/system
或 virsh -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
list
或 man 1 virsh
。
11.2 通过控制台访问 VM Guest #
可以通过 VNC 连接(图形控制台)或串行控制台(如果受 Guest 操作系统的支持)访问 VM Guest。
11.2.1 打开图形控制台 #
打开与 VM Guest 连接的图形控制台可与该计算机交互,就如同通过 VNC 连接与物理主机交互一样。如果访问 VNC 服务器需要身份验证,系统会提示您输入用户名(如果适用)和口令。
当您单击进入 VNC 控制台时,光标将被“夺取”,不能再在控制台外部使用。要释放光标,请按 Alt–Ctrl。
为防止控制台夺取光标,同时为了启用无缝光标移动,请向 VM Guest 添加绘图板输入设备。有关更多信息,请参见第 14.5 节 “输入设备”。
某些组合键(例如 Ctrl–Alt–Del)由主机解释,不会传递给 VM Guest。要将此类组合键传递给 VM Guest,请在 VNC 窗口中打开 菜单,然后选择所需的组合键项。仅当使用虚拟机管理器和 virt-viewer
时, 菜单才可用。借助虚拟机管理器,可以按照提示:将组合键传递给虚拟机中所述改用“粘滞键”功能。
理论上而言,所有 VNC 查看器都可连接到 VM Guest 的控制台。但如果您是使用 SASL 身份验证和/或 TLS/SSL 连接来访问 Guest 的,那么您的选择就比较有限。tightvnc
或 tigervnc
等常见 VNC 查看器既不支持 SASL 身份验证,也不支持 TLS/SSL。唯一可替代虚拟机管理器和 virt-viewer
的工具是 Remmina(请参见第 14.2 节 “Remmina:远程桌面客户端”)。
11.2.1.1 使用虚拟机管理器打开图形控制台 #
在虚拟机管理器中,右键单击某个 VM Guest 项。
从弹出菜单中选择
。
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 启动时,查看器即会启动。
有关更多信息,请参见man 1 virt-viewer
或virt-viewer
--help
。
使用 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 和 openSUSE 中默认会禁用串行控制台访问。要启用它,请执行下列步骤:
- SLES 12、15 和 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 的状态。
右键单击某个 VM Guest 项。
在弹出菜单中选择
、 或其中一个 。
按照第 11.2.1.1 节 “使用虚拟机管理器打开图形控制台”中所述打开 VNC 窗口。
在工具栏或
菜单中,选择 、 或其中一个 选项。
11.3.1.1 自动启动 VM Guest #
您可以在引导 VM 主机服务器时自动启动 Guest。此功能默认未启用,需要为每个 VM Guest 单独启用。无法全局激活此功能。
在虚拟机管理器中双击 VM Guest 项以打开其控制台。
选择
› 打开 VM Guest 配置窗口。选择
,然后选中 。单击
保存新配置。
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}'
使用保存操作后,请不要引导或启动保存的 VM Guest。这样做会使计算机的虚拟磁盘和保存的内存状态不同步,有可能导致在恢复 Guest 时发生严重错误。
要能够再次使用保存的 VM Guest,请使用恢复操作。如果您是使用 virsh
保存 VM Guest 的,将无法使用虚拟机管理器将其恢复。在这种情况下,请务必使用 virsh
进行恢复。
如果您在保存 VM Guest 后,经过长时间(数小时)的暂停再恢复该 Guest,其时间同步服务(例如 chronyd
)可能会拒绝同步其时间。在这种情况下,请手动同步 VM Guest 的时间。例如,对于 KVM 主机,可以使用 QEMU Guest 代理,并使用 guest-set-time
来指示 Guest 设置时间。有关更多详细信息,请参见第 20 章 “QEMU Guest 代理”。
raw
、qcow2
的 VM Guest
仅当 VM Guest 使用的虚拟磁盘类型为 raw
(.img
) 或 qcow2 时,才可以保存和恢复该 VM Guest。
11.4.1 使用虚拟机管理器保存/恢复 #
打开 VM Guest 的 VNC 连接窗口。确保该 Guest 正在运行。
选择
› › 。
打开 VM Guest 的 VNC 连接窗口。确保该 Guest 未运行。
选择
› 。如果 VM Guest 以前是使用虚拟机管理器保存的,则系统不会为您提供用于警告:始终恢复保存的 Guest中所述的有关使用
该 Guest 的选项。但请注意virsh
保存的计算机的注意事项。
11.4.2 使用 virsh
保存和恢复 #
使用 virsh
save
命令保存运行中的 VM Guest,并指定要用于保存该 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 Guest 的现有快照列表显示在窗口的左侧。上次启动的快照带有绿色对勾标记。窗口的右侧显示列表中当前标记的快照的细节。这些细节包括快照的标题和时戳、截取快照时 VM Guest 的状态以及说明。运行中 Guest 的快照还包括一个屏幕截图。可以直接在此视图中更改
。其他快照数据不可更改。11.5.2.1 创建快照 #
要截取 VM Guest 的新快照,请执行以下操作:
(可选)关闭 VM Guest 以创建脱机快照。
单击 VNC 窗口左下角的
。提供“自述性名称”。
和说明(可选)。截取快照后将无法更改该名称。为方便以后识别该快照,请使用单击
确认。
11.5.2.2 删除快照 #
要删除 VM Guest 的快照,请执行以下操作:
单击 VNC 窗口左下角的
。单击
确认删除。
11.5.2.3 启动快照 #
要启动快照,请执行以下操作:
单击 VNC 窗口左下角的
。单击
确认启动。
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 command:
命令显示上次启动的快照:
>
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
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
中的 SNAPSHOT COMMANDS 部分。
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 的存储文件。
11.6.1 使用虚拟机管理器删除 VM Guest #
在虚拟机管理器中,右键单击某个 VM Guest 项。
从上下文菜单中选择
。一个确认窗口即会打开。单击
会永久擦除该 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 开始,要使用复制后实时迁移(不支持或不建议用于生产环境),需要将 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 时,在哪台计算机上启动虚拟机管理器并不重要。您可以在源主机或目标主机上启动虚拟机管理器,甚至可以在这两台之外的主机上启动。对于后一种情况,您需要能够同时与目标主机和源主机建立远程连接。
启动虚拟机管理器,并与目标主机或源主机建立连接。如果虚拟机管理器不是在目标主机或源主机上启动的,则需要与这两台主机都建立连接。
右键单击要迁移的 VM Guest,然后选择
。确保该 Guest 正在运行或已暂停 — 关闭的 Guest 无法迁移。提示:提高迁移速度要提高迁移速度,请暂停 VM Guest。这相当于使用前面所述的虚拟机管理器中的“脱机迁移”选项。
为 VM Guest 选择一个
。如果所需的目标主机未显示,请确保您已连接到该主机。要更改用于连接到远程主机的默认选项,请在
下设置 ,以及目标主机的 (IP 地址或主机名)和 。如果指定了 ,还必须指定 。在
下,选择迁移是永久性的(默认设置)还是暂时性的(使用 )。此外我们还提供了一个选项
,它允许在不禁用 VM 主机服务器缓存的情况下进行迁移。这样可以加速迁移,但仅当当前配置能够在不使用cache="none"
/0_DIRECT
的情况下提供一致的 VM Guest 存储信息时,此选项才起作用。注意:带宽选项在最近的虚拟机管理器版本中,去除了用于设置迁移带宽的选项。要设置特定的带宽,请改用
virsh
。要执行迁移,请单击
。迁移完成后,
窗口将会关闭,该 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 yesvirsh #
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 使用率图表将会显示。
您也可以通过此工具获取有关磁盘和网络使用情况的信息,不过必须先在
中激活此功能:运行
virt-manager
。选择
› 。从
选项卡切换到 。选中要查看的活动类型对应的复选框:
、 和 。如果需要,还可以使用
来更改更新间隔。关闭
对话框。在
› 下激活应显示的图表。
此后,磁盘和网络统计数据也会显示在虚拟机管理器的主窗口中。
可以从 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 排序。使用以下组合键可以更改排序字段:
Shift–P:CPU 使用率 |
Shift–M:Guest 分配的内存总量 |
Shift–T:时间 |
Shift–I:ID |
要使用任何其他字段进行排序,请按 Shift–F 并从列表中选择一个字段。要切换排序顺序,请使用 Shift–R。
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
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
有关如何解释这些值的更多信息,请参见 https://clalance.blogspot.com/2009/01/kvm-performance-tools.html。