跳转到内容
openSUSE Leap 15.5

虚拟化指南

摘要

本指南概述了虚拟化技术。它介绍了 libvirt——统一的虚拟化接口——并提供了特定虚拟机监控程序的详细信息。

出版日期: 2023年8月2日
前言
可用文档
改进文档
文档约定
I 简介
1 虚拟化技术
1.1 概述
1.2 虚拟化优势
1.3 虚拟化模式
1.4 I/O 虚拟化
2 虚拟化场景
2.1 服务器整合
2.2 隔离
2.3 灾难恢复
2.4 动态负载均衡
3 Xen 虚拟化简介
3.1 基本组件
3.2 Xen 虚拟化架构
4 KVM 虚拟化简介
4.1 基本组件
4.2 KVM 虚拟化架构
5 虚拟化工具
5.1 虚拟化控制台工具
5.2 虚拟化 GUI 工具
6 虚拟化组件的安装
6.1 简介
6.2 安装虚拟化组件
6.3 安装 UEFI 支持
6.4 启用 KVM 中的嵌套虚拟化
II 使用 libvirt 管理虚拟机
7 libvirt 守护进程
7.1 启动和停止单体守护进程
7.2 启动和停止模块化守护进程
7.3 切换到模块化守护进程
8 准备 VM 主机服务器
8.1 配置网络
8.2 配置存储池
9 客户机安装
9.1 基于 GUI 的客户机安装
9.2 使用 virt-install 从命令行安装
9.3 高级客户机安装场景
10 基本的 VM 客户机管理
10.1 列出 VM 客户机
10.2 通过控制台访问 VM 客户机
10.3 更改 VM 客户机的状态:启动、停止、暂停
10.4 保存和恢复 VM 客户机的状态
10.5 创建和管理快照
10.6 删除 VM 客户机
10.7 迁移 VM 客户机
10.8 监控
11 连接和授权
11.1 身份验证
11.2 连接到 VM 主机服务器
11.3 配置远程连接
12 高级存储主题
12.1 使用 virtlockd 锁定磁盘文件和块设备
12.2 在线调整客户机块设备的大小
12.3 共享主机和客户机之间的目录(文件系统直通)
12.4 使用 RADOS 块设备与 libvirt
13 使用虚拟机器管理器配置虚拟机
13.1 机器设置
13.2 存储
13.3 控制器
13.4 网络
13.5 输入设备
13.6 视频
13.7 USB 重定向器
13.8 杂项
13.9 使用虚拟机器管理器添加 CD/DVD-ROM 设备
13.10 使用虚拟机器管理器添加软盘设备
13.11 使用虚拟机器管理器弹出和更改软盘或 CD/DVD-ROM 介质
13.12 将主机 PCI 设备分配给 VM 客户机
13.13 将主机 USB 设备分配给 VM 客户机
14 使用 virsh 配置虚拟机
14.1 编辑 VM 配置
14.2 更改机器类型
14.3 配置超visor功能
14.4 配置 CPU
14.5 更改启动选项
14.6 配置内存分配
14.7 添加 PCI 设备
14.8 添加 USB 设备
14.9 添加 SR-IOV 设备
14.10 列出附加设备
14.11 配置存储设备
14.12 配置控制器设备
14.13 配置视频设备
14.14 配置网络设备
14.15 使用 macvtap 共享 VM 主机服务器网络接口
14.16 禁用内存气球设备
14.17 配置多个监视器(双头)
14.18 将加密适配器直通到 IBM Z 上的 KVM 客户机
15 Xen 到 KVM 迁移指南
15.1 使用 virt-v2v 迁移到 KVM
15.2 Xen 到 KVM 手动迁移
15.3 更多信息
III 与超visor无关的功能
16 磁盘缓存模式
16.1 什么是磁盘缓存?
16.2 磁盘缓存如何工作?
16.3 磁盘缓存的好处
16.4 虚拟磁盘缓存模式
16.5 缓存模式和数据完整性
16.6 缓存模式和实时迁移
17 VM 客户机时钟设置
17.1 KVM:使用 kvm_clock
17.2 Xen 虚拟机时钟设置
18 libguestfs
18.1 VM 客户机操作概述
18.2 软件包安装
18.3 Guestfs 工具
18.4 故障排除
18.5 更多信息
19 QEMU 客户机代理
19.1 运行 QEMU GA 命令
19.2 需要 QEMU GA 的 virsh 命令
19.3 增强 libvirt 命令
19.4 更多信息
20 软件 TPM 模拟器
20.1 简介
20.2 先决条件
20.3 安装
20.4 使用 swtpm 与 QEMU
20.5 使用 swtpm 与 libvirt
20.6 使用 OVMF 固件进行 TPM 测量
20.7 资源
21 创建 VM 客户机的崩溃转储
21.1 简介
21.2 创建完全虚拟化机器的崩溃转储
21.3 创建半虚拟化机器的崩溃转储
21.4 更多信息
IV 使用 Xen 管理虚拟机
22 设置虚拟机主机
22.1 最佳实践和建议
22.2 管理 Dom0 内存
22.3 完全虚拟化客户机中的网卡
22.4 启动虚拟机主机
22.5 PCI 直通
22.6 USB 直通
23 虚拟网络
23.1 客户机系统的网络设备
23.2 Xen 中的基于主机的路由
23.3 创建伪装网络设置
23.4 特殊配置
24 管理虚拟化环境
24.1 XL—Xen 管理工具
24.2 客户机域的自动启动
24.3 事件操作
24.4 时间戳计数器
24.5 保存虚拟机
24.6 恢复虚拟机
24.7 虚拟机状态
25 Xen 中的块设备
25.1 将物理存储映射到虚拟磁盘
25.2 将网络存储映射到虚拟磁盘
25.3 基于文件的虚拟磁盘和环回设备
25.4 调整块设备大小
25.5 用于管理高级存储场景的脚本
26 虚拟化:配置选项和设置
26.1 虚拟 CD 读卡器
26.2 远程访问方法
26.3 VNC 查看器
26.4 虚拟键盘
26.5 分配 CPU 资源
26.6 HVM 特性
26.7 虚拟 CPU 调度
27 管理任务
27.1 引导加载程序
27.2 稀疏镜像文件和磁盘空间
27.3 迁移 Xen VM Guest 系统
27.4 监控 Xen
27.5 为 VM Guest 系统提供主机信息
28 XenStore:域之间共享的配置数据库
28.1 简介
28.2 文件系统接口
29 Xen 作为高可用性虚拟化主机
29.1 使用远程存储的 Xen HA
29.2 使用本地存储的 Xen HA
29.3 Xen HA 和私有桥接
30 Xen:将半虚拟化 (PV) 客户机转换为完全虚拟化 (FV/HVM) 客户机
V 使用 QEMU 管理虚拟机
31 QEMU 概述
32 设置 KVM VM 主机服务器
32.1 虚拟化所需的 CPU 支持
32.2 必需的软件
32.3 KVM 主机特定功能
33 客户机安装
33.1 使用 qemu-system-ARCH 进行基本安装
33.2 使用 qemu-img 管理磁盘镜像
34 使用 qemu-system-ARCH 运行虚拟机
34.1 基本的 qemu-system-ARCH 调用
34.2 通用的 qemu-system-ARCH 选项
34.3 在 QEMU 中使用设备
34.4 QEMU 中的网络
34.5 使用 VNC 查看 VM Guest
35 使用 QEMU 监视器管理虚拟机
35.1 访问监视器控制台
35.2 获取有关 Guest 系统的信息
35.3 更改 VNC 密码
35.4 管理设备
35.5 控制键盘和鼠标
35.6 更改可用内存
35.7 转储虚拟机内存
35.8 管理虚拟机快照
35.9 暂停和恢复虚拟机执行
35.10 实时迁移
35.11 QMP - QEMU 机器协议
VI 故障排除
36 集成帮助和软件包文档
37 收集系统信息和日志
37.1 libvirt 日志控制
词汇表
A 配置 NVIDIA 卡的 GPU 直通
A.1 简介
A.2 先决条件
A.3 配置主机
A.4 配置 Guest
B GNU 许可协议
B.1 GNU 自由文档许可

版权所有 © 2006–2023 SUSE LLC 及贡献者。保留所有权利。

在 GNU 自由文档许可协议第 1.2 版或(可选)第 1.3 版的条款下,允许复制、分发和/或修改本文档,其中本版权声明和许可协议为不变部分。许可协议第 1.2 版的副本包含在题为 GNU 自由文档许可协议 的章节中。

有关 SUSE 商标,请参阅 http://www.suse.com/company/legal/。所有第三方商标均为其各自所有者的财产。商标符号(®、™ 等)表示 SUSE 及其关联公司的商标。星号(*)表示第三方商标。

本书中的所有信息均经过仔细核实。但是,这不能保证完全准确。SUSE LLC、其关联公司、作者和译者对可能出现的错误或由此产生的后果不承担任何责任。

1 可用文档 编辑源文件

在线文档

我们的文档可在 https://doc.opensuse.net.cn 上在线获取。浏览或下载各种格式的文档。

Note
注意:最新更新

最新的更新通常可在本文档的英文版本中获得。

在您的系统中

为了离线使用,发布说明也可用在您的系统上的 /usr/share/doc/release-notes 下。各个软件包的文档可用在 /usr/share/doc/packages 下。

许多命令也在其 手册页 中进行了描述。要查看它们,请运行 man,后跟特定的命令名称。如果您的系统上未安装 man 命令,请使用 sudo zypper install man 进行安装。

2 改进文档 编辑源文件

欢迎您对本文档提出反馈和贡献。以下是提供反馈的渠道:

错误报告

请在 https://bugzilla.opensuse.org/ 上报告文档问题。

为了简化此过程,请单击 HTML 版本本文档中标题旁边的 报告问题 图标。这将预先选择 Bugzilla 中的正确产品和类别,并添加指向当前章节的链接。您可以立即开始编写错误报告。

需要一个 Bugzilla 帐户。

贡献

要贡献本文档,请单击 HTML 版本本文档中标题旁边的 编辑源文档 图标。这将带您到 GitHub 上的源代码,您可以在那里打开一个拉取请求。

需要一个 GitHub 帐户。

Note
注意:编辑源文档 仅适用于英文

编辑源文档”图标仅适用于每份文档的英文版本。对于所有其他语言,请改用“报告问题”图标。

有关用于此文档的文档环境的更多信息,请参阅 https://github.com/SUSE/doc-sle 上的存储库 README。

邮件

您还可以将错误报告和有关文档的反馈发送至 <>。请包含文档标题、产品版本和文档的发布日期。此外,请包含相关的章节编号和标题(或提供 URL),并提供问题的简洁描述。

帮助

如果您在 openSUSE Leap 上需要进一步的帮助,请参阅 https://en.opensuse.net.cn/Portal:Support

3 文档约定 编辑源文件

本文档中使用了以下通知和排版约定:

  • /etc/passwd:目录名和文件名

  • 占位符:将 占位符 替换为实际值

  • PATH:环境变量

  • ls--help:命令、选项和参数

  • user:用户名或组名

  • 软件包名:软件包的名称

  • AltAltF1:要按下的键或键组合。键以键盘上的大写字母显示。

  • 文件文件 › 另存为:菜单项、按钮

  • 第 1 章,《示例章节:对本指南中另一个章节的交叉引用。

  • 必须以 root 权限运行的命令。通常,您也可以在这些命令前加上 sudo 命令,以非特权用户的身份运行它们。

    # command
    > sudo command
  • 可以由非特权用户运行的命令。

    > command
  • 通知

    Warning
    警告:警告通知

    在继续之前您必须了解的重要信息。警告您有关安全问题、潜在的数据丢失、硬件损坏或物理危害。

    Important
    重要:重要通知

    在继续之前您应该了解的重要信息。

    Note
    注意:注意通知

    其他信息,例如关于软件版本差异的信息。

    Tip
    提示:提示通知

    有用的信息,例如指南或实用建议。

  • 紧凑型通知

    Note

    其他信息,例如关于软件版本差异的信息。

    Tip

    有用的信息,例如指南或实用建议。

第一部分 简介 编辑源文件

1 虚拟化技术

虚拟化是一种技术,它允许一台机器(主机)在其主机操作系统之上运行另一个操作系统(客户虚拟机)。

2 虚拟化场景

虚拟化为您的组织提供了几个有用的功能,例如

  • 更高效的硬件使用

  • 对旧版软件的支持

  • 操作系统隔离

  • 实时迁移

  • 灾难恢复

  • 负载均衡

3 Xen 虚拟化简介

本章介绍并解释了设置和管理基于 Xen 的虚拟化环境所需的组件和技术。

4 KVM 虚拟化简介

5 虚拟化工具

libvirt 是一个库,它为管理流行的虚拟化解决方案(包括 KVM 和 Xen)提供了一个通用的 API。该库为这些虚拟化解决方案提供了一个规范化的管理 API,从而为更高级别的管理工具提供了一个稳定、跨虚拟化管理程序的接口。该库还提供用于管理虚拟机主机服务器上虚拟网络和存储的 API。每个虚拟机客户机的配置都存储在一个 XML 文件中。

使用 libvirt,您还可以远程管理虚拟机客户机。它支持 TLS 加密、x509 证书和使用 SASL 进行身份验证。这使得能够从单个工作站集中管理虚拟机主机服务器,从而无需单独访问每个虚拟机主机服务器。

使用基于 libvirt 的工具是管理虚拟机客户机的推荐方法。 libvirt 和基于 libvirt 的应用程序之间的互操作性经过测试,并且是 SUSE 支持的重要组成部分。

6 虚拟化组件的安装

要运行一个虚拟化服务器(VM 主机服务器),它可以托管一个或多个客户系统(VM 客户机),您需要在服务器上安装所需的虚拟化组件。这些组件因您想要使用的虚拟化技术而异。

1 虚拟化技术 编辑源文件

摘要

虚拟化是一种技术,它允许一台机器(主机)在其主机操作系统之上运行另一个操作系统(客户虚拟机)。

1.1 概述 编辑源文件

openSUSE Leap 包含最新的开源虚拟化技术 Xen 和 KVM。借助这些虚拟机监控程序,openSUSE Leap 可用于在单个物理系统上配置、取消配置、安装、监视和管理多个虚拟机(VM 客户机)(有关更多信息,请参阅 虚拟机监控程序)。openSUSE Leap 可以创建运行经过修改、高度优化的半虚拟化操作系统以及完全虚拟化的未修改操作系统的虚拟机。

启用虚拟化的操作系统主要组件是虚拟机监控程序(或虚拟机管理器),它是直接运行在服务器硬件上的软件层。它通过向每个虚拟机客户机呈现虚拟化的硬件接口来控制平台资源,并与多个虚拟机客户机及其操作系统共享这些资源。

openSUSE 是一个 Linux 服务器操作系统,提供两种类型的虚拟机监控程序:Xen 和 KVM。

openSUSE Leap 配合 Xen 或 KVM 可作为虚拟化主机服务器(VHS),它通过自己的客户机操作系统支持虚拟机客户机。SUSE VM 客户机架构由虚拟机监控程序和管理组件组成,这些组件构成了 VHS,运行着许多应用程序托管的虚拟机客户机。

在 Xen 中,管理组件运行在一个特权虚拟机客户机中,通常称为 Dom0。在 KVM 中,Linux 内核充当虚拟机监控程序,管理组件直接运行在 VHS 上。

1.2 虚拟化优势 编辑源文件

虚拟化在提供与硬件服务器相同的服务的同时,带来了许多优势。

首先,它降低了基础设施的成本。服务器主要用于向客户提供服务,而虚拟化操作系统可以提供相同的服务,具有

  • 更少的硬件:您可以在一台主机上运行多个操作系统,因此减少了所有硬件维护。

  • 更少的电力/冷却:更少的硬件意味着您不需要在电力、备用电源和冷却方面进行更多投资,以获得更多服务。

  • 节省空间:您的数据中心空间得以节省,因为您不需要更多的硬件服务器(相比运行的服务,服务器数量更少)。

  • 更少的管理:使用虚拟机客户机简化了您基础设施的管理。

  • 灵活性和生产力:虚拟化提供了 迁移实时迁移快照 功能。这些功能减少了停机时间,并提供了一种在不中断服务的情况下轻松将服务从一个地方移动到另一个地方的方法。

1.3 虚拟化模式 编辑源文件

客户机操作系统以完全虚拟化(FV)模式或半虚拟化(PV)模式托管在虚拟机中。每种虚拟化模式都有其优缺点。

  • 完全虚拟化模式允许虚拟机运行未修改的操作系统,例如 Windows* Server 2003。它可以利用二进制翻译或硬件辅助虚拟化技术,例如 AMD* Virtualization 或 Intel* Virtualization Technology。使用硬件辅助技术可以提高支持它的处理器上的性能。

  • 为了能够在半虚拟化模式下运行,客户机操作系统通常需要针对虚拟化环境进行修改。然而,在半虚拟化模式下运行的操作系统比在完全虚拟化下运行的操作系统性能更好。

    目前已修改为在半虚拟化模式下运行的操作系统称为半虚拟化操作系统,包括 openSUSE Leap

1.4 I/O 虚拟化 编辑源文件

虚拟机客户机不仅共享主机系统的 CPU 和内存资源,还共享 I/O 子系统。由于软件 I/O 虚拟化技术提供的性能不如裸机,最近开发了能够提供接近原生性能的硬件解决方案。openSUSE Leap 支持以下 I/O 虚拟化技术:

完全虚拟化

完全虚拟化(FV)驱动程序模拟广泛支持的真实设备,这些设备可以与虚拟机客户机中的现有驱动程序一起使用。客户机也称为硬件虚拟机(HVM)。由于虚拟机主机服务器上的物理设备可能与模拟设备不同,因此虚拟机监控程序需要在将所有 I/O 操作移交给物理设备之前对其进行处理。因此,所有 I/O 操作都需要经过两个软件层,这个过程不仅显著影响 I/O 性能,还会消耗 CPU 时间。

半虚拟化

半虚拟化(PV)允许虚拟机监控程序与虚拟机客户机之间直接通信。由于开销较小,性能比完全虚拟化要好。然而,半虚拟化要求客户机操作系统要么经过修改以支持半虚拟化 API,要么需要半虚拟化驱动程序。

PVHVM

这种虚拟化类型通过半虚拟化(PV)驱动程序以及 PV 中断和计时器处理来增强 HVM(请参阅 完全虚拟化)。

VFIO

VFIO 代表虚拟函数 I/O,是 Linux 的一种新的用户级别驱动程序框架。它取代了传统的 KVM PCI 直通设备分配。VFIO 驱动程序在安全的内存(IOMMU)保护环境中向用户空间公开直接设备访问。通过 VFIO,虚拟机客户机可以直接访问虚拟机主机服务器上的硬件设备(直通),从而避免了在性能关键路径中由仿真引起的性能问题。此方法不允许共享设备——每个设备只能分配给一个虚拟机客户机。VFIO 需要虚拟机主机服务器 CPU、芯片组和 BIOS/EFI 支持。

与旧的 KVM PCI 设备分配相比,VFIO 具有以下优点:

  • 资源访问与 UEFI 安全启动兼容。

  • 设备隔离且其内存访问受到保护。

  • 提供具有更灵活设备所有权模型的用户空间设备驱动程序。

  • 独立于 KVM 技术,不限于 x86 架构。

openSUSE Leap 中,USB 和 PCI 直通设备分配方法已弃用,并被 VFIO 模型取代。

SR-IOV

最新的 I/O 虚拟化技术,单根 I/O 虚拟化 SR-IOV 结合了上述技术的优点——性能以及与多个虚拟机客户机共享设备的能力。SR-IOV 需要特殊的 I/O 设备,这些设备能够复制资源,使其显示为多个独立设备。每个这样的设备都可以由单个客户机直接使用。然而,例如对于网卡,并发队列的数量是有限的,与半虚拟化驱动程序相比,可能会降低虚拟机客户机的性能。在虚拟机主机服务器上,SR-IOV 必须得到 I/O 设备、CPU 和芯片组、BIOS/EFI 和虚拟机监控程序的支持——有关设置说明,请参阅 第 13.12 节,“将主机 PCI 设备分配给虚拟机客户机”

Important
重要:VFIO 和 SR-IOV 的要求

要能够使用 VFIO 和 SR-IOV 功能,虚拟机主机服务器需要满足以下要求:

2 虚拟化场景 编辑源文件

摘要

虚拟化为您的组织提供了几个有用的功能,例如

  • 更高效的硬件使用

  • 对旧版软件的支持

  • 操作系统隔离

  • 实时迁移

  • 灾难恢复

  • 负载均衡

2.1 服务器整合 编辑源文件

许多服务器可以被一台大型物理服务器替换,从而整合了硬件,并将客户机操作系统转换为虚拟机。这也支持在新硬件上运行旧版软件。

  • 更好地利用未满 100% 使用率的资源

  • 需要更少的服务器位置

  • 更有效地利用计算机资源:同一台服务器上的多个工作负载

  • 简化数据中心基础设施

  • 简化将工作负载迁移到其他主机,避免服务中断

  • 更快、更灵活的虚拟机配置

  • 多个客户机操作系统可以在一台主机上运行

Important
重要提示

服务器整合需要特别注意以下几点:

  • 应仔细规划维护窗口

  • 存储是关键:它必须能够支持迁移和不断增长的磁盘使用

  • 您必须验证您的服务器能否支持额外的负载

2.2 隔离 编辑源文件

客户机操作系统与运行它们的宿主机完全隔离。因此,如果虚拟机内部出现问题,宿主机不会受到损害。同样,一个虚拟机内部的问题也不会影响其他虚拟机。虚拟机之间不共享任何数据。

  • UEFI 安全启动可用于虚拟机。

  • 应避免使用 KSM。有关 KSM 的更多详细信息,请参阅 KSM

  • 可以为虚拟机分配单个 CPU 核心。

  • 应禁用超线程 (HT) 以避免潜在的安全问题。

  • 虚拟机不应共享网络、存储或网络硬件。

  • 使用高级虚拟机监控程序功能(如 PCI 直通或 NUMA)会对虚拟机迁移能力产生不利影响。

  • 使用半虚拟化和virtio驱动程序可以提高虚拟机性能和效率。

AMD 提供了关于虚拟化安全的特定功能。

2.3 灾难恢复 编辑源文件

虚拟机监控程序可以创建虚拟机快照,从而可以恢复到已知良好状态,或任何期望的早期状态。由于虚拟化操作系统比直接运行在裸机上的操作系统对硬件配置的依赖性较低,因此这些快照可以恢复到不同的服务器硬件上,只要它运行的是相同的虚拟机监控程序。

2.4 动态负载均衡 编辑源文件

实时迁移提供了一种简单的方式来平衡您的基础设施中的服务负载,方法是根据需要将虚拟机从繁忙的主机移动到有空闲容量的主机。

3 Xen 虚拟化简介 编辑源文件

本章介绍并解释了设置和管理基于 Xen 的虚拟化环境所需的组件和技术。

3.1 基本组件 编辑源文件

基于 Xen 的虚拟化环境的基本组件是:

  • Xen 虚拟机监控程序

  • Dom0

  • 任何数量的其他虚拟机客户机

  • 用于管理虚拟化的工具、命令和配置文件

集体而言,运行所有这些组件的物理计算机称为虚拟机主机服务器,因为这些组件共同构成了一个托管虚拟机的平台。

Xen 虚拟机监控程序

Xen 虚拟机监控程序,有时简称为虚拟机监视器,是一个开源软件程序,它协调虚拟机和物理硬件之间的低级交互。

Dom0

虚拟机主机环境,也称为Dom0或控制域,由几个组件组成,例如:

  • openSUSE Leap 提供图形和命令行环境来管理虚拟机主机组件及其虚拟机。

    Note
    注意

    术语Dom0指的是一个提供管理环境的特殊域。它可以以图形模式或命令行模式运行。

  • 基于 xenlight 库(libxl)的 xl 工具堆栈。使用它来管理 Xen 客户机域。

  • QEMU——一个开源软件,它模拟完整的计算机系统,包括处理器和多个外围设备。它提供了以完全虚拟化或半虚拟化模式托管操作系统的能力。

基于 Xen 的虚拟机

基于 Xen 的虚拟机,也称为VM 客户机DomU,由以下组件组成:

  • 至少一个包含可引导操作系统的虚拟磁盘。虚拟磁盘可以基于文件、分区、卷或其他类型的块设备。

  • 每个客户机域的配置文件。它是一个遵循手册页 man 5 xl.conf 中描述的语法的文本文件。

  • 几个网络设备,连接到控制域提供的虚拟网络。

管理工具、命令和配置文件

有一系列 GUI 工具、命令和配置文件可以帮助您管理和自定义您的虚拟化环境。

3.2 Xen 虚拟化架构 编辑源文件

下图描绘了一个带有四个虚拟机的虚拟机主机。Xen 虚拟机监控程序直接运行在物理硬件平台上。请注意,控制域也是一个虚拟机,尽管与其他所有虚拟机相比,它具有一些额外的管理任务。

Xen virtualization architecture
图 3.1: Xen 虚拟化架构

左侧显示了虚拟机主机的 Dom0 运行着 openSUSE Leap 操作系统。中间显示的两个虚拟机正在运行半虚拟化操作系统。右侧的虚拟机显示了一个运行未修改操作系统(例如最新版本的 Microsoft Windows/Server)的完全虚拟化虚拟机。

4 KVM 虚拟化简介 编辑源文件

4.1 基本组件 编辑源文件

KVM 是一个完全虚拟化解决方案,适用于支持硬件虚拟化的硬件架构。

虚拟机客户机(虚拟机)、虚拟存储和虚拟网络可以通过 QEMU 工具直接管理,或者通过基于 libvirt 的堆栈进行管理。QEMU 工具包括 qemu-system-ARCH、QEMU monitor、qemu-imgqemu-ndb。基于 libvirt 的堆栈包括 libvirt 本身,以及 libvirt 应用程序,如 virshvirt-managervirt-installvirt-viewer

4.2 KVM 虚拟化架构 编辑源文件

这个完全虚拟化解决方案包含两个主要组件:

  • 一组内核模块(kvm.kokvm-intel.kokvm-amd.ko),它们提供了核心虚拟化基础设施和特定于处理器的驱动程序。

  • 一个用户空间程序(qemu-system-ARCH),它提供虚拟设备的仿真和用于管理虚拟机客户机(虚拟机)的控制机制。

KVM 一词更准确地指代内核级别的虚拟化功能,但在实践中更常用于指代用户空间组件。

KVM virtualization architecture
图 4.1: KVM 虚拟化架构

5 虚拟化工具 编辑源文件

摘要

libvirt 是一个库,它为管理流行的虚拟化解决方案(包括 KVM 和 Xen)提供了一个通用的 API。该库为这些虚拟化解决方案提供了一个规范化的管理 API,从而为更高级别的管理工具提供了一个稳定、跨虚拟化管理程序的接口。该库还提供用于管理虚拟机主机服务器上虚拟网络和存储的 API。每个虚拟机客户机的配置都存储在一个 XML 文件中。

使用 libvirt,您还可以远程管理虚拟机客户机。它支持 TLS 加密、x509 证书和使用 SASL 进行身份验证。这使得能够从单个工作站集中管理虚拟机主机服务器,从而无需单独访问每个虚拟机主机服务器。

使用基于 libvirt 的工具是管理虚拟机客户机的推荐方法。 libvirt 和基于 libvirt 的应用程序之间的互操作性经过测试,并且是 SUSE 支持的重要组成部分。

5.1 虚拟化控制台工具 编辑源文件

libvirt 包含多个用于管理虚拟机的命令行实用程序。其中最重要的有:

virsh (软件包:libvirt-client)

一个命令行工具,用于管理虚拟机客户机,功能与虚拟机管理器类似。virsh 允许您更改虚拟机客户机的状态,设置新客户机和设备,或编辑现有配置。virsh 对于脚本化虚拟机客户机管理操作也很有用。

virsh 将第一个参数作为命令,后续参数作为该命令的选项。

virsh [-c URI] COMMAND DOMAIN-ID [OPTIONS]

zypper 类似,virsh 也可以在没有命令的情况下调用。在这种情况下,它会启动一个等待您输入命令的 shell。当需要运行后续命令时,此模式很有用。

~> virsh -c qemu+ssh://wilber@mercury.example.com/system
Enter passphrase for key '/home/wilber/.ssh/id_rsa':
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # hostname
mercury.example.com
virt-install (软件包:virt-install)

一个命令行工具,用于使用 libvirt 库创建新的虚拟机客户机。它支持通过 VNC 或SPICE 协议进行图形化安装。给定合适的命令行参数,virt-install 可以无人值守运行。这使得安装客户机可以轻松自动化。virt-install 是虚拟机管理器使用的默认安装工具。

remote-viewer (软件包:virt-viewer)

一个简单的远程桌面查看器。它支持 SPICE 和 VNC 协议。

virt-clone (软件包:virt-install)

一个用于使用 libvirt 虚拟机监控程序管理库克隆现有虚拟机映像的工具。

virt-host-validate (软件包:libvirt-client)

一个工具,用于验证主机是否已配置为适合运行 libvirt 虚拟机监控程序驱动程序。

5.2 虚拟化 GUI 工具 编辑源文件

以下基于 libvirt 的图形工具在 openSUSE Leap 上可用。所有工具都由带有工具名称的软件包提供。

虚拟机管理器 (软件包:virt-manager)

虚拟机管理器是一个用于管理虚拟机客户机的桌面工具。它提供了控制现有机器的生命周期(启动/关闭、暂停/恢复、保存/恢复)以及创建新虚拟机客户机的能力。它允许管理多种类型的存储和虚拟网络。它通过内置的 VNC 查看器提供对虚拟机客户机图形控制台的访问,并可用于查看性能统计信息。virt-manager 支持连接到本地 libvirtd,管理本地虚拟机主机服务器,或远程 libvirtd 管理远程虚拟机主机服务器。

要启动虚拟机管理器,请在命令提示符下输入 virt-manager

Note
注意

要禁用通过 spice 使用的虚拟机客户机的自动 USB 设备重定向,请使用 --spice-disable-auto-usbredir 参数启动 virt-manager,或运行以下命令以永久更改默认行为:

> dconf write /org/virt-manager/virt-manager/console/auto-redirect false
virt-viewer (软件包:virt-viewer)

虚拟机客户机图形控制台的查看器。它使用 SPICE(默认在虚拟机客户机上配置)或 VNC 协议,并支持 TLS 和 x509 证书。可以通过名称、ID 或 UUID 访问虚拟机客户机。如果客户机尚未运行,可以在尝试连接控制台之前让查看器等待客户机启动。virt-viewer 默认未安装,在安装 virt-viewer 软件包后可用。

Note
注意

要禁用通过 spice 使用的虚拟机客户机的自动 USB 设备重定向,请使用 --spice-usbredir-auto-redirect-filter='' 参数添加一个空过滤器。

yast2 vm (软件包:yast2-vm)

一个 YaST 模块,用于简化虚拟化工具的安装并可以设置网络桥接。

6 虚拟化组件安装 编辑源文件

6.1 简介 编辑源文件

要运行一个虚拟化服务器(VM 主机服务器),它可以托管一个或多个客户系统(VM 客户机),您需要在服务器上安装所需的虚拟化组件。这些组件因您想要使用的虚拟化技术而异。

6.2 安装虚拟化组件 编辑源文件

您可以通过以下任一方式安装运行虚拟机主机服务器所需的虚拟化工具:

  • 在虚拟机主机服务器上安装 openSUSE Leap 时选择特定的系统角色

  • 在已安装并运行的 openSUSE Leap 上运行YaST 虚拟化模块。

  • 在已安装并运行的 openSUSE Leap 上安装特定的安装模式。

6.2.1 指定系统角色 编辑源文件

您可以在安装 openSUSE Leap 到虚拟机主机服务器的过程中安装所有必需的虚拟化工具。在安装过程中,您会看到系统角色屏幕。

System Role screen
图 6.1: 系统角色屏幕

在这里,您可以选择KVM 虚拟化主机Xen 虚拟化主机角色。相应的软件选择和设置会在 openSUSE Leap 安装期间自动执行。

Tip
提示

两种虚拟化系统角色都会创建一个专用的 /var/lib/libvirt 分区,并启用 firewalld 和 Kdump 服务。

6.2.2 运行YaST 虚拟化模块 编辑源文件

根据虚拟机主机服务器上 openSUSE Leap 的安装范围,您的系统上可能未安装任何虚拟化工具。当使用YaST 虚拟化模块配置虚拟机监控程序时,它们会自动安装。

Tip
提示

YaST 虚拟化模块包含在 yast2-vm 软件包中。在安装虚拟化组件之前,请验证它是否已在虚拟机主机服务器上安装。

过程 6.1: 安装 KVM 环境

要安装 KVM 虚拟化环境及相关工具,请按以下步骤操作:

  1. 启动 YaST 并选择虚拟化 › 安装虚拟机监控程序和工具

  2. 选择KVM 服务器以最小化安装 QEMU 和 KVM 环境。如果您想使用基于libvirt的管理堆栈,请选择KVM 工具。然后按接受确认。

  3. YaST 会询问是否自动在虚拟机主机服务器上配置网络桥接。它确保虚拟机客户机具有正确的网络功能。选择以同意,否则选择

  4. 设置完成后,您可以开始创建和配置虚拟机客户机。无需重启虚拟机主机服务器。

过程 6.2: 安装 Xen 环境

要安装 Xen 虚拟化环境,请按以下步骤操作:

  1. 启动 YaST 并选择虚拟化 › 安装虚拟机监控程序和工具

  2. 选择Xen 服务器以最小化安装 Xen 环境。如果您想使用基于libvirt的管理堆栈,请选择Xen 工具。然后按接受确认。

  3. YaST 会询问是否自动在虚拟机主机服务器上配置网络桥接。它确保虚拟机客户机具有正确的网络功能。选择以同意,否则选择

  4. 设置完成后,您需要重启机器以使用Xen 内核

    Tip
    提示:默认启动内核

    如果一切按预期工作,请使用 YaST 更改默认启动内核,并将 Xen 内核设置为默认。有关更改默认内核的更多信息,请参阅参考一书,第 12 章,“引导加载程序 GRUB 2”,第 12.3 节,“使用 YaST 配置引导加载程序”

6.2.3 安装特定安装模式 编辑源文件

来自 openSUSE Leap 软件存储库的相关软件包被组织成安装模式。您可以使用这些模式在已运行的 openSUSE Leap 上安装特定的虚拟化组件。使用 zypper 安装它们:

zypper install -t pattern PATTERN_NAME

要安装 KVM 环境,请考虑以下模式:

kvm_server

安装带有 KVM 和 QEMU 环境的基本虚拟机主机服务器。

kvm_tools

安装用于在 KVM 环境中管理和监视虚拟机客户机的 libvirt 工具。

要安装 Xen 环境,请考虑以下模式:

xen_server

安装基本 Xen 虚拟机主机服务器。

xen_tools

安装用于在 Xen 环境中管理和监视虚拟机客户机的 libvirt 工具。

6.3 安装 UEFI 支持 编辑源文件

Note
注意

我们仅在 AMD64/Intel 64 客户机上支持 UEFI 安全启动。KVM 客户机通过使用 OVMF 固件支持 UEFI 安全启动。Xen HVM 客户机也支持从 OVMF 固件启动,但它们不支持 UEFI 安全启动。

UEFI 支持由OVMFOpen Virtual Machine Firmware)提供。要启用 UEFI 启动,请首先安装qemu-ovmf-x86_64qemu-uefi-aarch64软件包,具体取决于客户机的架构。

虚拟机使用的固件是自动选择的。自动选择基于上述固件包中的 JSON 文件。libvirt QEMU 驱动程序在加载时会解析这些文件,以了解多种固件类型的能力。然后,当用户选择固件类型和任何所需功能(例如,UEFI 安全启动支持)时,libvirt 可以找到满足用户要求的固件文件。

例如,要指定带有 UEFI 安全启动的 EFI,请使用以下配置:

<os firmware='efi'>
 <loader secure='yes'/>
</os>

qemu-ovmf-x86_64软件包包含以下重要的 UEFI 固件映像。它们为虚拟机客户机提供 UEFI 安全启动功能:

# rpm -ql qemu-ovmf-x86_64
[...]
/usr/share/qemu/ovmf-x86_64-smm-ms-code.bin
/usr/share/qemu/ovmf-x86_64-smm-ms-vars.bin
/usr/share/qemu/ovmf-x86_64-smm-opensuse-code.bin
/usr/share/qemu/ovmf-x86_64-smm-opensuse-vars.bin
/usr/share/qemu/ovmf-x86_64-smm-suse-code.bin
/usr/share/qemu/ovmf-x86_64-smm-suse-vars.bin
[...]
  • 要为 SUSE Linux Enterprise 客户机使用 UEFI 安全启动,请使用 ovmf-x86_64-smm-suse-code.bin 固件。

  • 要为 openSUSE 客户机使用 UEFI 安全启动,请使用 ovmf-x86_64-smm-opensuse-code.bin 固件。

  • 要为 Microsoft Windows 客户机使用 UEFI 安全启动,请使用 ovmf-x86_64-smm-ms-code.bin 固件。

对于 AArch64 架构,软件包名为 qemu-uefi-aarch32

# rpm -ql qemu-uefi-aarch32
[...]
/usr/share/qemu/aavmf-aarch32-code.bin
/usr/share/qemu/aavmf-aarch32-vars.bin
/usr/share/qemu/firmware
/usr/share/qemu/firmware/60-aavmf-aarch32.json
/usr/share/qemu/qemu-uefi-aarch32.bin

文件名 *-code.bin 是 UEFI 固件文件。文件名 *-vars.bin 是相应的变量存储映像,可用作每个 VM 非易失性存储的模板。libvirt 在首次创建 VM 时,会将指定的 vars 模板复制到 /var/lib/libvirt/qemu/nvram/ 下的每个 VM 路径。文件名中不包含 codevars 的文件可用作单个 UEFI 映像。它们不太有用,因为 VM 每次重启后 UEFI 变量都不会持久化。

文件名 *-ms*.bin 文件包含真实硬件上的 UEFI CA 密钥。因此,它们在 libvirt 中被配置为默认值。同样,文件名 *-suse*.bin 文件包含预装的 SUSE 密钥。还有一组不包含预装密钥的文件。

有关详细信息,请参阅 使用 UEFI 安全启动http://www.linux-kvm.org/downloads/lersek/ovmf-whitepaper-c770f8c.txt

6.4 在 KVM 中启用嵌套虚拟化 编辑源文件

Important
重要:技术预览

KVM 的嵌套虚拟化仍处于技术预览阶段。它仅用于测试目的,不提供支持。

嵌套客户机是在 KVM 客户机中运行的 KVM 客户机。在描述嵌套客户机时,我们使用以下虚拟化层:

L0

运行 KVM 的裸金属主机。

L1

运行在 L0 上的虚拟机。因为它还可以运行另一个 KVM,所以它被称为客户机虚拟机监控程序

L2

运行在 L1 上的虚拟机。它被称为嵌套客户机

嵌套虚拟化有许多优点。您可以在以下场景中受益:

  • 在云环境中直接使用您选择的虚拟机监控程序管理自己的虚拟机。

  • 将虚拟机监控程序及其客户机虚拟机作为一个整体进行实时迁移。

    Note
    注意

    不支持嵌套虚拟机客户机的实时迁移。

  • 用于软件开发和测试。

要临时启用嵌套,请删除模块并使用 KVM 模块参数nested重新加载它:

  • 对于 Intel CPU,运行:

    > sudo modprobe -r kvm_intel && modprobe kvm_intel nested=1
  • 对于 AMD CPU,运行:

    > sudo modprobe -r kvm_amd && modprobe kvm_amd nested=1

要永久启用嵌套,请根据您的 CPU 在 /etc/modprobe.d/kvm_*.conf 文件中启用 KVM 模块参数nested

  • 对于 Intel CPU,编辑 /etc/modprobe.d/kvm_intel.conf 并添加以下行:

    options kvm_intel nested=1
  • 对于 AMD CPU,编辑 /etc/modprobe.d/kvm_amd.conf 并添加以下行:

    options kvm_amd nested=1

当您的 L0 主机具备嵌套能力后,您可以通过以下任一方式启动 L1 客户机:

  • 使用 QEMU 命令行选项 -cpu host

  • vmx(Intel CPU)或 svm(AMD CPU)CPU 功能添加到 QEMU 命令行选项 -cpu 中,该选项为虚拟 CPU 启用虚拟化。

6.4.1 VMware ESX 作为客户机虚拟机监控程序 编辑源文件

如果您使用 VMware ESX 作为 KVM 裸金属虚拟机监控程序之上的客户机虚拟机监控程序,您可能会遇到不稳定的网络通信。此问题尤其发生在嵌套 KVM 客户机与 KVM 裸金属虚拟机监控程序或外部网络之间。嵌套 KVM 客户机的以下默认 CPU 配置导致了此问题:

<cpu mode='host-model' check='partial'/>

要修复它,请按照以下方式修改 CPU 配置:

[...]
<cpu mode='host-passthrough' check='none'>
 <cache mode='passthrough'/>
</cpu>
[...]

第二部分 使用 libvirt 管理虚拟机 编辑源文件

7 libvirt 守护进程

用于访问 KVM 或 Xen 的 libvirt 部署需要在一个或多个守护进程在主机上安装并激活。libvirt 提供了两种守护进程部署选项:整体式或模块化守护进程。libvirt 一直提供单一的整体式守护进程 libvirtd。它包括主要的虚拟机监控程序驱动…

8 准备 VM 主机服务器

在安装访客虚拟机之前,您需要准备 VM 主机服务器,以便为访客提供它们运行所需资源。具体来说,您需要配置

9 客户机安装

VM 访客由包含操作系统和数据文件的镜像以及描述 VM 访客虚拟硬件资源的配置文件组成。VM 访客托管在 VM 主机服务器上并由其控制。本节提供有关安装 VM 访客的通用说明。

10 基本的 VM 客户机管理

大多数管理任务,例如启动或停止 VM 客户机,都可以使用图形应用程序 Virtual Machine Manager 或在命令行中使用 virsh 来完成。 只能从图形用户界面通过 VNC 连接到图形控制台。

11 连接和授权

管理多个 VM 主机服务器,每个服务器托管多个 VM 访客,很快就会变得困难。 libvirt 的一个好处是能够同时连接到多个 VM 主机服务器,从而提供一个用于管理所有 VM 访客并连接到其图形控制台的单一界面。

12 高级存储主题

本章介绍有关从 VM 主机服务器的角度操作存储的高级主题。

13 使用虚拟机器管理器配置虚拟机

Virtual Machine Manager 的 详细信息 视图提供有关 VM 访客完整配置和硬件设备的深入信息。使用此视图,您还可以更改访客配置或添加和修改虚拟硬件。要访问此视图,请在 Virtual Machine Manager 中打开访客的控制台,然后选择 视图 › 详细信息 从菜单中,或单击工具栏中的 显示虚拟硬件详细信息

14 使用 virsh 配置虚拟机

您可以使用 virsh 在命令行上配置虚拟机 (VM),作为使用 Virtual Machine Manager 的替代方法。使用 virsh,您可以控制 VM 的状态、编辑 VM 的配置,甚至将 VM 迁移到另一个主机。以下部分介绍如何使用 virsh 管理 VM。

15 Xen 到 KVM 迁移指南

随着 KVM 虚拟化解决方案在服务器管理员中越来越受欢迎,许多管理员需要一种路径将现有的基于 Xen 的环境迁移到 KVM。目前,还没有成熟的工具可以自动转换 Xen VM 到 KVM。然而,存在一个技术解决方案 th…

7 libvirt 守护进程 编辑源文件

用于访问 KVM 或 Xen 的 libvirt 部署需要在主机上安装并激活一个或多个守护进程。libvirt 提供了两种守护进程部署选项:整体式或模块化守护进程。libvirt 一直提供单一的整体式守护进程 libvirtd。它包括主要的虚拟机监控程序驱动程序以及所有所需的二级驱动程序,如存储、网络、节点设备和管理。libvirtd 整体式守护进程还为外部客户端提供安全的远程访问。使用模块化守护进程时,每个驱动程序运行在自己的守护进程中,允许用户自定义其 libvirt 部署。默认情况下,整体式守护进程是启用的,但可以通过管理相应的 systemd 服务文件将部署切换到模块化守护进程。

模块化守护进程部署在只需要最少 libvirt 支持的场景中很有用。例如,如果虚拟机存储和网络不由 libvirt 提供,则不需要 libvirt-daemon-driver-storagelibvirt-daemon-driver-network 这类软件包。Kubernetes 是一个极端示例,它处理所有网络、存储、cgroups 和命名空间集成等。只需要安装提供 virtqemudlibvirt-daemon-driver-QEMU 软件包。模块化守护进程允许配置一个自定义的 libvirt 部署,其中仅包含用例所需的组件。

7.1 启动和停止整体式守护进程 编辑源文件

整体式守护进程称为 libvirtd,并通过 /etc/libvirt/libvirtd.conf 进行配置。libvirtd 使用多个 systemd 单元文件进行管理:

  • libvirtd.service - 用于启动 libvirtd 的主 systemd 单元文件。如果虚拟机也配置为在主机启动时启动,我们建议配置 libvirtd.service 在启动时自动启动。

  • libvirtd.socket - 与主读写 UNIX 套接字 /var/run/libvirt/libvirt-sock 对应的单元文件。我们建议在启动时启用此单元。

  • libvirtd-ro.socket - 与主只读 UNIX 套接字 /var/run/libvirt/libvirt-sock-ro 对应的单元文件。我们建议在启动时启用此单元。

  • libvirtd-admin.socket - 与管理 UNIX 套接字 /var/run/libvirt/libvirt-admin-sock 对应的单元文件。我们建议在启动时启用此单元。

  • libvirtd-tcp.socket - 用于非 TLS 远程访问的 TCP 16509 端口的单元文件。在管理员配置了适当的身份验证机制之前,不应在启动时配置此单元。

  • libvirtd-tls.socket - 用于 TLS 远程访问的 TCP 16509 端口的单元文件。在管理员部署了 x509 证书并可选地配置了适当的身份验证机制之前,不应在启动时配置此单元。

当使用 systemd 套接字激活时,libvirtd.conf 中的某些配置设置不再生效。相反,这些设置必须通过系统单元文件进行控制:

  • listen_tcp - 通过启动 libvirtd-tcp.socket 单元文件来启用 TCP 套接字使用。

  • listen_tls - 通过启动 libvirtd-tls.socket 单元文件来启用 TLS 套接字使用。

  • tcp_port - 非 TLS TCP 套接字端口,通过 libvirtd-tcp.socket 单元文件中的 ListenStream 参数控制。

  • tls_port - TLS TCP 套接字端口,通过 libvirtd-tls.socket 单元文件中的 ListenStream 参数控制。

  • listen_addr - 要监听的 IP 地址,通过 libvirtd-tcp.socketlibvirtd-tls.socket 单元文件中的 ListenStream 参数独立控制。

  • unix_sock_group - UNIX 套接字组所有者,通过 libvirtd.socketlibvirtd-ro.socket 单元文件中的 SocketGroup 参数控制。

  • unix_sock_ro_perms - 只读 UNIX 套接字权限,通过 libvirtd-ro.socket 单元文件中的 SocketMode 参数控制。

  • unix_sock_rw_perms - 读写 UNIX 套接字权限,通过 libvirtd.socket 单元文件中的 SocketMode 参数控制。

  • unix_sock_admin_perms - 管理 UNIX 套接字权限,通过 libvirtd-admin.socket 单元文件中的 SocketMode 参数控制。

  • unix_sock_dir - 创建所有 UNIX 套接字的目录,通过 libvirtd.socketlibvirtd-ro.socketlibvirtd-admin.socket 单元文件中的 ListenStream 参数独立控制。

Important
重要:冲突服务:libvirtdxendomains

如果 libvirtd 启动失败,请检查服务 xendomains 是否已加载。

> systemctl is-active xendomains active

如果命令返回active,则在启动 libvirtd 守护进程之前,您需要停止 xendomains。如果您希望 libvirtd 在重启后也自动启动,请另外阻止 xendomains 自动启动。禁用该服务:

> sudo systemctl stop xendomains
> sudo systemctl disable xendomains
> sudo systemctl start libvirtd

xendomainslibvirtd 提供相同服务,并且并行使用时可能会相互干扰。例如,xendomains 可能会尝试启动 libvirtd 已经启动的 domU。

7.2 启动和停止模块化守护进程 编辑源文件

模块化守护进程以其运行的驱动程序的名称命名,模式为virtDRIVERd。它们通过文件 /etc/libvirt/virtDRIVERd.conf 进行配置。SUSE 支持 virtqemud 和 virtxend 虚拟机监控程序守护进程,以及所有支持的二级守护进程:

  • virtnetworkd - 提供 libvirt 虚拟网络管理 API 的虚拟网络管理守护进程。例如,virtnetworkd 可用于在主机上创建 NAT 虚拟网络供虚拟机使用。

  • virtnodedevd - 提供 libvirt 节点设备管理 API 的主机物理设备管理守护进程。例如,virtnodedevd 可用于将 PCI 设备从主机分离出来供虚拟机使用。

  • virtnwfilterd - 提供 libvirt 防火墙管理 API 的主机防火墙管理守护进程。例如,virtnwfilterd 可用于配置虚拟机的网络流量过滤规则。

  • virtsecretd - 提供 libvirt 密钥管理 API 的主机密钥管理守护进程。例如,virtsecretd 可用于存储与 LUKs 卷关联的密钥。

  • virtstoraged - 提供 libvirt 存储管理 API 的主机存储管理守护进程。virtstoraged 可用于创建存储池并从这些池中创建卷。

  • virtinterfaced - 提供 libvirt 主机网络接口管理 API 的主机 NIC 管理守护进程。例如,virtinterfaced 可用于在主机上创建绑定网络设备。SUSE 不推荐使用 libvirt 的接口管理 API,而是推荐使用 wicked 或 NetworkManager 等默认网络工具。建议禁用 virtinterfaced。

  • virtproxyd - 一个用于在传统 libvirtd 套接字和模块化守护进程套接字之间代理连接的守护进程。使用模块化 libvirt 部署时,virtproxyd 允许远程客户端访问 libvirt API,类似于整体式 libvirtd。它也可以供连接到整体式 libvirtd 套接字进行本地访问的本地客户端使用。

  • virtlogd - 一个用于管理虚拟机控制台日志的守护进程。整体式 libvirtd 也使用 virtlogd。整体式守护进程和 virtqemud systemd 单元文件需要 virtlogd,因此无需显式启动 virtlogd。

  • virtlockd - 一个用于管理虚拟机资源(如磁盘)锁定的守护进程。整体式 libvirtd 也使用 virtlockd。整体式守护进程、virtqemud 和 virtxend systemd 单元文件需要 virtlockd,因此无需显式启动 virtlockd。

libvirt 包含两个模块化守护进程,它们也被整体式 libvirtd 使用:virtlockd 和 virtlogd。

默认情况下,模块化守护进程在 /var/run/libvirt/virtDRIVERd-sock/var/run/libvirt/virtDRIVERd-sock-ro Unix 域套接字上监听连接。客户端库优先使用这些套接字,而不是传统的 /var/run/libvirt/libvirtd-sock。virtproxyd 守护进程可用于远程客户端或期望传统 libvirtd 套接字的本地客户端。

与整体式守护进程类似,模块化守护进程使用多个 systemd 单元文件进行管理:

  • virtDRIVERd.service - 用于启动 virtDRIVERd 守护进程的主单元文件。如果虚拟机也配置为在主机启动时启动,我们建议将该服务配置为在启动时自动启动。

  • virtDRIVERd.socket - 与主读写 UNIX 套接字 /var/run/libvirt/virtDRIVERd-sock 对应的单元文件。我们建议默认在启动时启动此套接字。

  • virtDRIVERd-ro.socket - 与主只读 UNIX 套接字 /var/run/libvirt/virtDRIVERd-sock-ro 对应的单元文件。我们建议默认在启动时启动此套接字。

  • virtDRIVERd-admin.socket - 与管理 UNIX 套接字 /var/run/libvirt/virtDRIVERd-admin-sock 对应的单元文件。我们建议默认在启动时启动此套接字。

当使用 systemd 套接字激活时,virtDRIVERd.conf 中的几个配置设置不再生效。相反,这些设置必须通过系统单元文件进行控制:

  • unix_sock_group - UNIX 套接字组所有者,通过 virtDRIVERd.socketvirtDRIVERd-ro.socket 单元文件中的 SocketGroup 参数控制。

  • unix_sock_ro_perms - 只读 UNIX 套接字权限,通过 virtDRIVERd-ro.socket 单元文件中的 SocketMode 参数控制。

  • unix_sock_rw_perms - 读写 UNIX 套接字权限,通过 virtDRIVERd.socket 单元文件中的 SocketMode 参数控制。

  • unix_sock_admin_perms - 管理 UNIX 套接字权限,通过 virtDRIVERd-admin.socket 单元文件中的 SocketMode 参数控制。

  • unix_sock_dir - 创建所有 UNIX 套接字的目录,通过 virtDRIVERd.socketvirtDRIVERd-ro.socketvirtDRIVERd-admin.socket 单元文件中的 ListenStream 参数独立控制。

7.3 切换到模块化守护进程 编辑源文件

在整体式和模块化守护进程之间切换时,需要更改多个服务。建议在切换守护进程选项之前停止或驱逐任何正在运行的虚拟机。

  1. 停止整体式守护进程及其套接字:

    > sudo systemctl stop libvirtd.service
    > sudo systemctl stop libvirtd{,-ro,-admin}.socket
  2. 禁用整体式守护进程的未来启动:

    > sudo systemctl disable libvirtd.service
    > sudo systemctl disable libvirtd{,-ro,-admin}.socket
  3. 启用 KVM 或 Xen 的新守护进程,包括所需的二级驱动程序。以下示例启用了 KVM 的 QEMU 驱动程序以及所有必需的二级驱动程序:

    for drv in qemu network nodedev nwfilter secret storage
    do
     > sudo systemctl enable virt${drv}d.service
     > sudo systemctl enable virt${drv}d{,-ro,-admin}.socket
    done
  4. 启动同一组守护进程的套接字

    for drv in qemu network nodedev nwfilter secret storage
    do
     > sudo systemctl start virt${drv}d{,-ro,-admin}.socket
    done
  5. 如果需要支持来自远程主机的连接,则必须启用并启动 virtproxyd 守护进程

    > sudo systemctl enable virtproxyd.service
    > sudo systemctl enable virtproxyd{,-ro,-admin}.socket
    > sudo systemctl start virtproxyd{,-ro,-admin}.socket

8 准备虚拟机主机服务器 编辑源文件

在安装访客虚拟机之前,您需要准备 VM 主机服务器,以便为访客提供它们运行所需资源。具体来说,您需要配置

  • 网络,以便虚拟机可以使用主机提供的网络连接。

  • 主机可访问的 存储池,以便虚拟机可以存储其磁盘映像。

8.1 配置网络 编辑源文件

提供虚拟机连接到网络的两种常见配置

  • 网络桥接。这是为虚拟机提供网络连接的默认且推荐的方式。

  • 启用转发的虚拟网络

8.1.1 网络桥接 编辑源文件

网络桥接配置为主机提供了一个二层交换机,用于虚拟机,该交换机根据与桥接端口关联的 MAC 地址在桥接端口之间切换二层以太网数据包。这使得虚拟机能够访问主机服务器的网络。此配置类似于将虚拟机虚拟以太网电缆连接到与主机和其他在主机上运行的虚拟机共享的集线器。此配置通常被称为共享物理设备

网络桥接配置是openSUSE Leap在配置为 KVM 或 Xen hypervisor 时的默认配置。当您只想将虚拟机连接到主机服务器的 LAN 时,这是首选配置。

使用哪种工具创建网络桥接取决于您用于管理虚拟机主机服务器上网络连接的服务

  • 如果网络连接由 wicked 管理,请使用 YaST 或命令行来创建网络桥接。wicked 是服务器主机上的默认设置。

  • 如果网络连接由 NetworkManager 管理,请使用 NetworkManager 命令行工具 nmcli 创建网络桥接。NetworkManager 是桌面和笔记本电脑上的默认设置。

8.1.1.1 使用 YaST 管理网络桥接 编辑源文件

本节包括使用 YaST 添加或删除网络桥接的过程。

8.1.1.1.1 添加网络桥接 编辑源文件

要在虚拟机主机服务器上添加网络桥接,请按照以下步骤操作

  1. 启动 YaST › 系统 › 网络设置

  2. 激活 概览选项卡,然后单击 添加

  3. 设备类型列表中选择 桥接,并在 配置名称条目中输入桥接设备接口名称。单击 下一步按钮继续。

  4. 地址选项卡中,指定网络详细信息,例如 DHCP/静态 IP 地址、子网掩码或主机名。

    仅当还为连接到 DHCP 服务器的桥接分配设备时,使用 动态地址才有用。

    如果您打算创建一个与真实网络设备无关的虚拟桥接,请使用 静态分配的 IP 地址。在这种情况下,最好使用私有 IP 地址范围内的地址,例如,192.168.0.0/16172.16.0.0/1210.0.0.0/8

    要创建仅用作不同虚拟机之间连接而与主机系统无关的桥接,请将 IP 地址设置为 0.0.0.0,并将子网掩码设置为 255.255.255.255。网络脚本将此特殊地址处理为未设置的 IP 地址。

  5. 激活 桥接设备选项卡,并激活您要包含在网络桥接中的网络设备。

  6. 单击 下一步返回 概览选项卡,然后单击 确定进行确认。新的网络桥接现在应在虚拟机主机服务器上处于活动状态。

8.1.1.1.2 删除网络桥接 编辑源文件

要删除现有的网络桥接,请按照以下步骤操作

  1. 启动 YaST › 系统 › 网络设置

  2. 概览选项卡中的列表中选择您要删除的桥接设备。

  3. 使用 删除删除桥接,然后单击 确定进行确认。

8.1.1.2 从命令行管理网络桥接 编辑源文件

本节包括使用命令行添加或删除网络桥接的过程。

8.1.1.2.1 添加网络桥接 编辑源文件

要在虚拟机主机服务器上添加新的网络桥接设备,请按照以下步骤操作

  1. root 用户身份登录到您要创建新网络桥接的虚拟机主机服务器。

  2. 为新桥接选择一个名称—在我们的示例中是virbr_test—然后运行

    # ip link add name VIRBR_TEST type bridge
  3. 检查桥接是否已在虚拟机主机服务器上创建

    # bridge vlan
    [...]
    virbr_test  1 PVID Egress Untagged

    virbr_test 存在,但未与任何物理网络接口关联。

  4. 启动网络桥接并将网络接口添加到桥接

    # ip link set virbr_test up
    # ip link set eth1 master virbr_test
    Important
    重要提示:网络接口必须未使用

    您只能分配一个尚未被其他网络桥接使用的网络接口。

  5. 可选地,启用 STP(参见 生成树协议

    # bridge link set dev virbr_test cost 4
8.1.1.2.2 删除网络桥接 编辑源文件

要从命令行删除虚拟机主机服务器上现有的网络桥接设备,请按照以下步骤操作

  1. root 用户身份登录到您要删除现有网络桥接的虚拟机主机服务器。

  2. 列出现有网络桥接以识别要删除的桥接名称

    # bridge vlan
    [...]
    virbr_test  1 PVID Egress Untagged
  3. 删除桥接

    # ip link delete dev virbr_test

8.1.1.3 使用 nmcli 添加网络桥接 编辑源文件

本节包括使用 NetworkManager 的命令行工具 nmcli 添加网络桥接的过程。

  1. 列出活动的网络连接

    > sudo nmcli connection show --active
    NAME                   UUID                                  TYPE      DEVICE
    Ethernet connection 1  84ba4c22-0cfe-46b6-87bb-909be6cb1214  ethernet  eth0
  2. 添加一个名为 br0 的新桥接设备并验证其创建

    > sudo nmcli connection add type bridge ifname br0
    Connection 'bridge-br0' (36e11b95-8d5d-4a8f-9ca3-ff4180eb89f7) \
    successfully added.
    > sudo nmcli connection show --active
    NAME                   UUID                                  TYPE      DEVICE
    bridge-br0             36e11b95-8d5d-4a8f-9ca3-ff4180eb89f7  bridge    br0
    Ethernet connection 1  84ba4c22-0cfe-46b6-87bb-909be6cb1214  ethernet  eth0
  3. 可选地,您可以查看桥接设置

    > sudo nmcli -f bridge connection show bridge-br0
    bridge.mac-address:                     --
    bridge.stp:                             yes
    bridge.priority:                        32768
    bridge.forward-delay:                   15
    bridge.hello-time:                      2
    bridge.max-age:                         20
    bridge.ageing-time:                     300
    bridge.group-forward-mask:              0
    bridge.multicast-snooping:              yes
    bridge.vlan-filtering:                  no
    bridge.vlan-default-pvid:               1
    bridge.vlans:                           --
  4. 将桥接设备链接到物理以太网设备 eth0

    > sudo nmcli connection add type bridge-slave ifname eth0 master br0
  5. 禁用 eth0 接口并启用新桥接

    > sudo nmcli connection down "Ethernet connection 1"
    > sudo nmcli connection up bridge-br0
    Connection successfully activated (master waiting for slaves) \
    (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/9)

8.1.1.4 使用 VLAN 接口 编辑源文件

有时需要创建私有连接,无论是连接两个虚拟机主机服务器之间,还是虚拟机系统之间。例如,将虚拟机迁移到不同网络段中的主机。或者创建一个虚拟机系统(即使它们运行在不同的虚拟机主机服务器系统上)才能连接的私有桥接。构建此类连接的简单方法是设置 VLAN 网络。

VLAN 接口通常在虚拟机主机服务器上设置。它们要么互连不同的虚拟机主机服务器系统,要么可以设置为物理接口,连接到一个完全虚拟化的桥接。甚至可以创建一个以 VLAN 作为物理接口的桥接,该桥接在虚拟机主机服务器上没有 IP 地址。这样,虚拟机系统就无法通过此网络访问主机。

运行 YaST 模块 系统 › 网络设置。按照此过程设置 VLAN 设备

过程 8.1: 使用 YaST 设置 VLAN 接口
  1. 单击 添加以创建新的网络接口。

  2. 硬件对话框中,选择 设备类型 VLAN

  3. 更改 配置名称的值为您的 VLAN ID。请注意,VLAN ID 1 通常用于管理目的。

  4. 单击 下一步

  5. VLAN 真实接口下选择 VLAN 设备应连接到的接口。如果所需的接口未出现在列表中,请先设置该接口而不分配 IP 地址。

  6. 选择要为 VLAN 设备分配 IP 地址的首选方法。

  7. 单击 下一步以完成配置。

还可以将 VLAN 接口用作桥接的物理接口。这使得连接多个仅限虚拟机主机服务器的网络成为可能,并允许对连接到此类网络的虚拟机系统进行实时迁移。

YaST 并不总是允许设置无 IP 地址。但是,这可能是一个期望的功能,尤其是在应该连接仅限虚拟机主机服务器的网络时。在这种情况下,使用特殊地址 0.0.0.0 和 netmask 255.255.255.255。系统脚本将此地址处理为未设置 IP 地址。

8.1.2 虚拟网络 编辑源文件

libvirt 管理的虚拟网络类似于桥接网络,但通常与虚拟机主机服务器没有二层连接。通过三层转发实现与虚拟机主机服务器物理网络的连接,与二层桥接网络相比,这在虚拟机主机服务器上引入了额外的报文处理。虚拟网络还为虚拟机提供 DHCP 和 DNS 服务。有关 libvirt 虚拟网络的更多信息,请参阅 https://libvirt.org/formatnetwork.html 上的网络 XML 格式文档。

openSUSE Leap 上的标准 libvirt 安装已预定义了一个名为 default 的虚拟网络。它为网络提供 DHCP 和 DNS 服务,并使用网络地址转换 (NAT) 转发模式连接到虚拟机主机服务器的物理网络。尽管它是预定义的,但 default 虚拟网络需要由管理员显式启用。有关 libvirt 支持的转发模式的更多信息,请参阅 https://libvirt.org/formatnetwork.html#elementsConnect 上的 网络 XML 格式文档的连接部分。

libvirt 管理的虚拟网络可用于满足广泛的用例,但通常用于具有无线连接或动态/零星网络连接(如笔记本电脑)的虚拟机主机服务器。当虚拟机主机服务器的网络 IP 地址有限时,虚拟网络也很有用,它允许在虚拟网络和虚拟机主机服务器的网络之间转发数据包。然而,大多数服务器用例更适合网络桥接配置,其中虚拟机连接到虚拟机主机服务器的 LAN。

Warning
警告:启用转发模式

libvirt 虚拟网络中启用转发模式会通过将 /proc/sys/net/ipv4/ip_forward/proc/sys/net/ipv6/conf/all/forwarding 设置为 1 来在虚拟机主机服务器中启用转发,这会将虚拟机主机服务器变成路由器。重新启动虚拟机主机服务器的网络可能会重置值并禁用转发。为避免此行为,请通过编辑 /etc/sysctl.conf 文件并添加以下内容来显式启用虚拟机主机服务器中的转发

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

8.1.2.1 使用虚拟机管理器管理虚拟网络 编辑源文件

您可以使用虚拟机管理器定义、配置和操作虚拟网络。

8.1.2.1.1 定义虚拟网络 编辑源文件
  1. 启动虚拟机管理器。在可用连接列表中,右键单击需要配置虚拟网络连接的名称,然后选择 详细信息

  2. 连接详细信息窗口中,单击 虚拟网络选项卡。您可以看到当前连接的所有可用虚拟网络的列表。右侧显示所选虚拟网络的详细信息。

    Connection details
    图 8.1: 连接详细信息
  3. 要添加新的虚拟网络,请单击 添加

  4. 为新虚拟网络指定一个名称。

    Create virtual network
    图 8.2: 创建虚拟网络
  5. 指定网络模式。对于 NAT路由类型,您可以指定将网络通信转发到哪个设备。NAT(网络地址转换)重新映射虚拟网络地址空间并允许共享单个 IP 地址,而 路由则将数据包从虚拟网络转发到虚拟机主机服务器的物理网络,不进行转换。

  6. 如果您需要 IPv4 网络,请激活 启用 IPv4 并指定 IPv4 网络地址。如果您需要 DHCP 服务器,请激活 启用 DHCPv4 并指定可分配的 IP 地址范围。

  7. 如果您需要 IPv6 网络,请激活 启用 IPv6 并指定 IPv6 网络地址。如果您需要 DHCP 服务器,请激活 启用 DHCPv6 并指定可分配的 IP 地址范围。

  8. 要指定与虚拟网络名称不同的域名,请选择 自定义DNS 域名下,并在此处输入。

  9. 单击 完成以创建新的虚拟网络。在虚拟机主机服务器上,将有一个新的虚拟网络桥接 virbrX,它对应于新创建的虚拟网络。您可以使用 bridge link 进行检查。libvirt 会自动添加 iptables 规则,以允许与新virbrX设备连接的虚拟机之间以及它们之间的流量。

8.1.2.1.2 启动虚拟网络 编辑源文件

要启动临时停止的虚拟网络,请按照以下步骤操作

  1. 启动虚拟机管理器。在可用连接列表中,右键单击需要配置虚拟网络连接的名称,然后选择 详细信息

  2. 连接详细信息窗口中,单击 虚拟网络选项卡。您可以看到当前连接的所有可用虚拟网络的列表。

  3. 要启动虚拟网络,请单击 启动

8.1.2.1.3 停止虚拟网络 编辑源文件

要停止活动的虚拟网络,请按照以下步骤操作

  1. 启动虚拟机管理器。在可用连接列表中,右键单击需要配置虚拟网络连接的名称,然后选择 详细信息

  2. 连接详细信息窗口中,单击 虚拟网络选项卡。您可以看到当前连接的所有可用虚拟网络的列表。

  3. 选择要停止的虚拟网络,然后单击 停止

8.1.2.1.4 删除虚拟网络 编辑源文件

要从虚拟机主机服务器删除虚拟网络,请按照以下步骤操作

  1. 启动虚拟机管理器。在可用连接列表中,右键单击需要配置虚拟网络连接的名称,然后选择 详细信息

  2. 连接详细信息窗口中,单击 虚拟网络选项卡。您可以看到当前连接的所有可用虚拟网络的列表。

  3. 选择要删除的虚拟网络,然后单击 删除

8.1.2.1.5 使用 nsswitch 获取 NAT 网络 (KVM) 的 IP 地址 编辑源文件
  • 在虚拟机主机服务器上,安装 libvirt-nss,它提供 libvirt 的 NSS 支持

    > sudo zypper in libvirt-nss
  • libvirt 添加到 /etc/nsswitch.conf

    ...
    hosts:  files libvirt mdns_minimal [NOTFOUND=return] dns
    ...
  • 如果 NSCD 正在运行,请重新启动它

    > sudo systemctl restart nscd

现在您可以从主机通过名称访问虚拟机系统。

NSS 模块功能有限。它读取 /var/lib/libvirt/dnsmasq/*.status 文件以查找 JSON 记录中的主机名和相应 IP 地址,该记录描述了 dnsmasq 提供的每个租约。主机名转换只能在那些使用由 dnsmasq 支持的 libvirt 管理的桥接网络的虚拟机主机服务器上完成。

8.1.2.2 使用 virsh 管理虚拟网络 编辑源文件

您可以使用 virsh 命令行工具管理 libvirt 提供的虚拟网络。要查看所有与网络相关的 virsh 命令,请运行

> sudo virsh help network
Networking (help keyword 'network'):
 net-autostart                  autostart a network
        net-create                     create a network from an XML file
        net-define                     define (but don't start) a network from an XML file
        net-destroy                    destroy (stop) a network
        net-dumpxml                    network information in XML
        net-edit                       edit XML configuration for a network
        net-event                      Network Events
        net-info                       network information
        net-list                       list networks
        net-name                       convert a network UUID to network name
        net-start                      start a (previously defined) inactive network
        net-undefine                   undefine an inactive network
        net-update                     update parts of an existing network's configuration
 net-uuid                       convert a network name to network UUID

要查看特定 virsh 命令的简要帮助信息,请运行 virsh help VIRSH_COMMAND

> sudo virsh help net-create
  NAME
    net-create - create a network from an XML file

  SYNOPSIS
    net-create <file>

  DESCRIPTION
    Create a network.

  OPTIONS
    [--file] <string>  file containing an XML network description
8.1.2.2.1 创建网络 编辑源文件

要创建新的正在运行的虚拟网络,请运行

> sudo virsh net-create VNET_DEFINITION.xml

VNET_DEFINITION.xml XML 文件包含 libvirt 接受的虚拟网络的定义。

要定义新虚拟网络而不激活它,请运行

> sudo virsh net-define VNET_DEFINITION.xml

以下示例说明了不同类型的虚拟网络的定义。

示例 8.1: 基于 NAT 的网络

以下配置允许虚拟机在虚拟机主机服务器上有可用连接的情况下进行出站连接。如果没有虚拟机主机服务器网络,它允许虚拟机直接相互通信。

<network>
<name>vnet_nated</name>1
<bridge name="virbr1"/>2
 <forward mode="nat"/>3
 <ip address="192.168.122.1" netmask="255.255.255.0">4
  <dhcp>
   <range start="192.168.122.2" end="192.168.122.254"/>5
   <host mac="52:54:00:c7:92:da" name="host1.testing.com" \
    ip="192.168.1.101"/>6
   <host mac="52:54:00:c7:92:db" name="host2.testing.com" \
    ip="192.168.1.102"/>
   <host mac="52:54:00:c7:92:dc" name="host3.testing.com" \
    ip="192.168.1.103"/>
  </dhcp>
 </ip>
</network>

1

新虚拟网络的名称。

2

用于构建虚拟网络的桥接设备的名称。当使用 "nat""route"<forward> 模式(或没有 <forward> 元素的隔离网络)定义新网络时,libvirt 会自动生成桥接设备的唯一名称(如果未提供)。

3

包含 <forward> 元素表示虚拟网络已连接到物理 LAN。mode 属性指定转发方法。最常见的模式是 "nat"(网络地址转换,默认)、"route"(直接转发到物理网络,无地址转换)和 "bridge"(在 libvirt 外部配置的网络桥接)。如果未指定 <forward> 元素,则虚拟网络与其他网络隔离。有关转发模式的完整列表,请参阅 https://libvirt.org/formatnetwork.html#elementsConnect

4

网络桥接的 IP 地址和子网掩码。

5

为虚拟网络启用 DHCP 服务器,提供指定 startend 属性范围内的 IP 地址。

6

<host> 可选元素指定了由内置 DHCP 服务器赋予名称和预定义 IP 地址的主机。任何 IPv4 主机元素都必须指定以下内容:要分配给定名称的主机的 MAC 地址、要分配给该主机、以及 DHCP 服务器要为该主机分配的名称。IPv6 主机元素与 IPv4 的略有不同:没有 mac 属性,因为 MAC 地址在 IPv6 中没有定义的含义。相反,name 属性用于标识要分配 IPv6 地址的主机。对于 DHCPv6,name 是客户端发送给服务器的客户端主机的普通名称。此分配特定 IP 地址的方法也可用于 IPv4 而非 mac 属性。

示例 8.2: 路由网络

以下配置将流量从虚拟网络路由到 LAN,而无需应用任何 NAT。IP 地址范围必须预先配置在虚拟机主机服务器网络上的路由器的路由表中。

<network>
 <name>vnet_routed</name>
 <bridge name="virbr1"/>
 <forward mode="route" dev="eth1"/>1
 <ip address="192.168.122.1" netmask="255.255.255.0">
  <dhcp>
   <range start="192.168.122.2" end="192.168.122.254"/>
  </dhcp>
 </ip>
</network>

1

虚拟机流量只能通过虚拟机主机服务器上的 eth1 网络设备外出。

示例 8.3: 隔离网络

此配置提供了一个隔离的私有网络。虚拟机可以相互通信,也可以与虚拟机主机服务器通信,但无法到达 LAN 上的任何其他计算机,因为 XML 描述中缺少 <forward> 元素。

<network>
 <name>vnet_isolated</name>
 <bridge name="virbr3"/>
 <ip address="192.168.152.1" netmask="255.255.255.0">
  <dhcp>
   <range start="192.168.152.2" end="192.168.152.254"/>
  </dhcp>
 </ip>
 </network>
示例 8.4: 使用虚拟机主机服务器上的现有桥接

此配置显示了如何使用虚拟机主机服务器上的现有网络桥接 br0。虚拟机直接连接到物理网络。它们的 IP 地址都在物理网络的子网上,并且对传入或传出连接没有限制。

<network>
        <name>host-bridge</name>
        <forward mode="bridge"/>
        <bridge name="br0"/>
</network>
8.1.2.2.2 列出网络 编辑源文件

要列出 libvirt 可用的所有虚拟网络,请运行

> sudo virsh net-list --all

 Name                 State      Autostart     Persistent
----------------------------------------------------------
 crowbar              active     yes           yes
 vnet_nated           active     yes           yes
 vnet_routed          active     yes           yes
 vnet_isolated        inactive   yes           yes

要列出可用的域,请运行

> sudo virsh list
 Id    Name                           State
----------------------------------------------------
 1     nated_sles12sp3                running
 ...

要获取正在运行的域的接口列表,请运行 domifaddr DOMAIN,或选择性地指定接口以限制输出到该接口。默认情况下,它还会输出其 IP 和 MAC 地址

> sudo virsh domifaddr nated_sles12sp3 --interface vnet0 --source lease
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:9e:0d:2b    ipv6         fd00:dead:beef:55::140/64
 -          -                    ipv4         192.168.100.168/24

要打印与指定域关联的所有虚拟接口的简要信息,请运行

> sudo virsh domiflist nated_sles12sp3
Interface  Type       Source       Model       MAC
---------------------------------------------------------
vnet0      network    vnet_nated   virtio      52:54:00:9e:0d:2b
8.1.2.2.3 获取网络详细信息 编辑源文件

要获取有关网络的详细信息,请运行

> sudo virsh net-info vnet_routed
Name:           vnet_routed
UUID:           756b48ff-d0c6-4c0a-804c-86c4c832a498
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr5
8.1.2.2.4 启动网络 编辑源文件

要启动一个已定义的非活动网络,请使用以下命令查找其名称(或唯一标识符,UUID)

> sudo virsh net-list --inactive
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 vnet_isolated        inactive   yes           yes

然后运行

> sudo virsh net-start vnet_isolated
Network vnet_isolated started
8.1.2.2.5 停止网络 编辑源文件

要停止一个活动的网络,请使用以下命令查找其名称(或唯一标识符,UUID)

> sudo virsh net-list --inactive
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 vnet_isolated        active     yes           yes

然后运行

> sudo virsh net-destroy vnet_isolated
Network vnet_isolated destroyed
8.1.2.2.6 删除网络 编辑源文件

要将非活动网络的定义永久从虚拟机主机服务器中删除,请运行

> sudo virsh net-undefine vnet_isolated
Network vnet_isolated has been undefined

8.2 配置存储池 编辑源文件

在虚拟机主机服务器本身上管理虚拟机时,您可以访问虚拟机主机服务器的完整文件系统,以附加或创建虚拟硬盘,或将现有映像附加到虚拟机。但是,从远程主机管理虚拟机时无法做到这一点。因此,libvirt 支持所谓的存储池,这些存储池可以从远程机器访问。

Tip
提示:CD/DVD ISO 映像

要能够从远程客户端访问虚拟机主机服务器上的 CD/DVD ISO 映像,它们也需要放置在存储池中。

libvirt 知道两种不同的存储类型:卷和池。

存储卷

存储卷是可分配给虚拟机的存储设备—虚拟磁盘或 CD/DVD/软盘映像。物理上,它可以是块设备—例如,分区或逻辑卷—或虚拟机主机服务器上的文件。

存储池

存储池是虚拟机主机服务器上的存储资源,可用于存储卷,类似于桌面机器的网络存储。物理上,它可以是以下类型之一

文件系统目录 (dir)

用于托管映像文件的目录。文件可以是支持的磁盘格式(raw 或 qcow2)之一,也可以是 ISO 映像。

物理磁盘设备 (disk)

使用完整的物理磁盘作为存储。为添加到池中的每个卷创建一个分区。

预格式化的块设备 (fs)

指定一个分区,该分区以与文件系统目录池相同的方式使用(用于托管映像文件的目录)。与使用文件系统目录的区别在于 libvirt 负责挂载设备。

iSCSI 目标 (iscsi)

在 iSCSI 目标上设置池。您需要先登录卷一次才能将其与 libvirt 一起使用。使用 YaST iSCSI Initiator 检测和登录卷。不支持在 iSCSI 池上创建卷;相反,每个现有的逻辑单元号 (LUN) 都代表一个卷。每个卷/LUN 在使用之前也需要一个有效的(空)分区表或磁盘标签。如果缺失,请使用 fdisk 添加它

> sudo fdisk -cu /dev/disk/by-path/ip-192.168.2.100:3260-iscsi-iqn.2010-10.com.example:[...]-lun-2
Device contains neither a valid DOS partition table, nor Sun, SGI
or OSF disklabel
Building a new DOS disklabel with disk identifier 0xc15cdc4e.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
LVM 卷组 (logical)

使用 LVM 卷组作为池。您可以使用预定义的卷组,或者通过指定要使用的设备来创建卷组。存储卷作为卷上的分区创建。

Warning
警告:删除基于 LVM 的池

在存储管理器中删除基于 LVM 的池时,卷组也会被删除。这将导致存储在池中的所有数据丢失,并且无法恢复。

多路径设备 (mpath)

目前,多路径支持仅限于将现有设备分配给虚拟机。不支持在 libvirt 中创建卷或配置多路径。

网络导出的目录 (netfs)

指定一个网络目录,该目录以与文件系统目录池相同的方式使用(用于托管映像文件的目录)。与使用文件系统目录的区别在于 libvirt 负责挂载目录。支持的协议是 NFS。

SCSI 主机适配器 (scsi)

使用 SCSI 主机适配器,其方式与 iSCSI 目标几乎相同。我们建议使用来自 /dev/disk/by-* 的设备名称,而不是 /dev/sdX。后者可能会更改(例如,在添加或删除硬盘时)。不支持在 iSCSI 池上创建卷。相反,每个现有的 LUN(逻辑单元号)代表一个卷。

Warning
警告:安全注意事项

为避免数据丢失或数据损坏,请勿尝试使用虚拟机主机服务器上用于构建存储池的 LVM 卷组、iSCSI 目标等资源。没有必要从虚拟机主机服务器连接到这些资源或在虚拟机主机服务器上挂载它们—libvirt 会处理这些。

不要按标签挂载虚拟机主机服务器上的分区。在某些情况下,有可能从虚拟机内部使用与虚拟机主机服务器上名称相同的名称来标记分区。

8.2.1 使用 virsh 管理存储 编辑源文件

也可以通过使用 virsh 从命令行管理存储。但是,SUSE 目前不支持创建存储池。因此,本节仅限于记录启动、停止和删除池以及卷管理等功能。

通过运行 virsh help poolvirsh help volume 分别可以获得用于管理池和卷的所有 virsh 子命令的列表。

8.2.1.1 列出池和卷 编辑源文件

通过执行以下命令列出当前活动的所有池。要也列出非活动池,请添加选项 --all

> virsh pool-list --details

有关特定池的详细信息可以通过 pool-info 子命令获得

> virsh pool-info POOL

默认情况下,卷只能按池列出。要列出池中的所有卷,请输入以下命令。

> virsh vol-list --details POOL

目前 virsh 不提供显示卷是否被虚拟机使用的工具。以下过程描述了一种列出当前被虚拟机使用的所有池中的卷的方法。

过程 8.2: 列出虚拟机主机服务器上当前使用的所有存储卷
  1. 创建一个 XSLT 样式表,将以下内容保存到一个文件中,例如,~/libvirt/guest_storage_list.xsl

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="text"/>
      <xsl:template match="text()"/>
      <xsl:strip-space elements="*"/>
      <xsl:template match="disk">
        <xsl:text>  </xsl:text>
        <xsl:value-of select="(source/@file|source/@dev|source/@dir)[1]"/>
        <xsl:text>&#10;</xsl:text>
      </xsl:template>
    </xsl:stylesheet>
  2. 在 shell 中运行以下命令。假设虚拟机的 XML 定义都存储在默认位置(/etc/libvirt/qemu)。xsltproclibxslt 包提供。

    SSHEET="$HOME/libvirt/guest_storage_list.xsl"
    cd /etc/libvirt/qemu
    for FILE in *.xml; do
      basename $FILE .xml
      xsltproc $SSHEET $FILE
    done

8.2.1.2 启动、停止和删除池 编辑源文件

使用 virsh 池子命令启动、停止或删除池。在以下示例中,用池的名称或其 UUID 替换 POOL

停止池
> virsh pool-destroy POOL
Note
注意:池的状态不影响已附加的卷

池中的卷,即使已附加到虚拟机,也始终可用,无论池的状态如何(活动(已停止)或不活动(已启动))。池的状态仅影响通过远程管理将卷附加到虚拟机的能力。

删除池
> virsh pool-delete POOL
Warning
警告:删除存储池

参见 警告:删除存储池

启动池
> virsh pool-start POOL
启用池自动启动
> virsh pool-autostart POOL

只有标记为自动启动的池才会在虚拟机主机服务器重启时自动启动。

禁用池自动启动
> virsh pool-autostart POOL --disable

8.2.1.3 向存储池添加卷 编辑源文件

virsh 提供两种添加卷到存储池的方法:一种是使用 XML 定义,通过 vol-createvol-create-from;另一种是通过命令行参数,使用 vol-create-as。前两种方法目前不被 SUSE 支持,因此本节将重点介绍 vol-create-as 子命令。

要将卷添加到现有池,请输入以下命令

> virsh vol-create-as POOL1NAME2 12G --format3raw|qcow24 --allocation 4G5

1

要添加卷的池的名称

2

卷的名称

3

映像的大小,本例中为 12 GB。使用后缀 k、M、G、T 分别表示千字节、兆字节、千兆字节和太字节。

4

卷的格式。SUSE 目前支持 rawqcow2

5

可选参数。默认情况下,virsh 创建一个稀疏映像文件,该文件按需增长。使用此参数指定应分配的空间量(本例中为 4 GB)。使用后缀 k、M、G、T 分别表示千字节、兆字节、千兆字节和太字节。

如果不指定此参数,则生成一个没有分配的稀疏映像文件。要创建非稀疏卷,请使用此参数指定整个映像大小(在本例中为 12G)。

8.2.1.3.1 克隆现有卷 编辑源文件

向池添加卷的另一种方法是克隆现有卷。新实例始终创建在与原始卷相同的池中。

> virsh vol-clone NAME_EXISTING_VOLUME1NAME_NEW_VOLUME2 --pool POOL3

1

要克隆的现有卷的名称

2

新卷的名称

3

可选参数。libvirt 会尝试自动定位现有卷。如果失败,请指定此参数。

8.2.1.4 从存储池中删除卷 编辑源文件

要将卷永久从池中删除,请使用子命令 vol-delete

> virsh vol-delete NAME --pool POOL

--pool 是可选的。libvirt 会尝试自动定位卷。如果失败,请指定此参数。

Warning
警告:删除卷时无检查

无论卷是否被活动或非活动虚拟机使用,都会删除卷。无法恢复已删除的卷。

是否使用虚拟机使用卷只能通过过程 8.2, “列出虚拟机主机服务器上当前使用的所有存储卷”中所述的方法来检测。

8.2.1.5 将卷附加到虚拟机 编辑源文件

在创建卷(如第 8.2.1.3 节,“向存储池添加卷”中所述)后,您可以将其附加到虚拟机并用作硬盘

> virsh attach-disk DOMAIN SOURCE_IMAGE_FILE TARGET_DISK_DEVICE

例如

> virsh attach-disk sles12sp3 /virt/images/example_disk.qcow2 sda2

要检查新磁盘是否已附加,请检查 virsh dumpxml 命令的结果

# virsh dumpxml sles12sp3
[...]
<disk type='file' device='disk'>
 <driver name='qemu' type='raw'/>
 <source file='/virt/images/example_disk.qcow2'/>
 <backingStore/>
 <target dev='sda2' bus='scsi'/>
 <alias name='scsi0-0-0'/>
 <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
[...]
8.2.1.5.1 热插拔或永久更改 编辑源文件

您可以将磁盘附加到活动和非活动域。附件由 --live--config 选项控制

--live

将磁盘热插拔到活动域。附件未保存在域配置中。在非活动域上使用 --live 是错误的。

--config

永久更改域配置。附加的磁盘将在域下次启动后可用。

--live--config

将磁盘热插拔并将其添加到持久域配置中。

Tip
提示:virsh attach-device

virsh attach-devicevirsh attach-disk 的更通用形式。您可以使用它将其他类型的设备附加到域。

8.2.1.6 从虚拟机中分离卷 编辑源文件

要从域中分离磁盘,请使用 virsh detach-disk

# virsh detach-disk DOMAIN TARGET_DISK_DEVICE

例如

# virsh detach-disk sles12sp3 sda2

您可以根据第 8.2.1.5 节,“将卷附加到虚拟机”中所述,使用 --live--config 选项控制附件。

8.2.2 使用虚拟机管理器管理存储 编辑源文件

虚拟机管理器提供了一个图形界面—存储管理器—用于管理存储卷和池。要访问它,请右键单击连接并选择 详细信息,或者突出显示一个连接并选择 编辑 › 连接详细信息。选择 存储选项卡。

8.2.2.1 添加存储池 编辑源文件

要添加存储池,请按以下步骤操作

  1. 单击左下角的 添加。将出现 添加新存储池对话框。

  2. 为池提供一个名称(仅包含字母数字字符和 _-.),然后选择一个类型

  3. 在下方指定所需的详细信息。它们取决于您创建的池类型。

    Important
    重要提示

    不支持 ZFS 池。

    类型 dir
    • 目标路径:指定现有目录。

    类型 disk
    • 格式:设备分区表的格式。通常使用 auto。如果不行,请通过在虚拟机主机服务器上运行命令 parted -l 来获取所需的格式。

    • 源路径:设备路径。建议使用来自 /dev/disk/by-* 的设备名称,而不是简单的 /dev/sdX,因为后者可能会更改(例如,在添加或删除硬盘时)。您需要指定类似于整个磁盘的路径,而不是磁盘上的分区(如果存在)。

    类型 fs
    • 目标路径:虚拟机主机服务器文件系统上的挂载点。

    • 格式: 设备的文件系统格式。默认值 auto 应该有效。

    • 源路径:设备文件的路径。建议使用来自 /dev/disk/by-* 的设备名称,而不是 /dev/sdX,因为后者可能会更改(例如,在添加或删除硬盘时)。

    类型 iscsi

    在虚拟机主机服务器上运行以下命令以获取所需数据

    > sudo iscsiadm --mode node

    它返回 iSCSI 卷列表,格式如下。粗体文本中的元素是必需的

    IP_ADDRESS:PORT,TPGT TARGET_NAME_(IQN)
    • 目标路径:包含设备文件的目录。使用 /dev/disk/by-path(默认)或 /dev/disk/by-id

    • 主机名:iSCSI 服务器的主机名或 IP 地址。

    • 源 IQN:iSCSI 目标名称(iSCSI 限定名称)。

    • 发起方 IQN:iSCSI 发起方名称。

    类型 logical
    • 卷组名称:指定现有卷组的设备路径。

    类型 mpath
    • 目标路径:目前对多路径的支持仅限于使所有多路径设备可用。因此,在此处指定任意字符串。路径是必需的,否则 XML 解析器会失败。

    类型 netfs
    • 目标路径:虚拟机主机服务器文件系统上的挂载点。

    • 主机名:导出网络文件系统的服务器的 IP 地址或主机名。

    • 源路径:服务器上被导出的目录。

    类型 rbd
    • 主机名:导出 RADOS 块设备的服务器的主机名。

    • 源名称:服务器上 RADOS 块设备的名称。

    类型 scsi
    • 目标路径:包含设备文件的目录。使用 /dev/disk/by-path(默认)或 /dev/disk/by-id

    • 源路径:SCSI 适配器的名称。

    Note
    注意:文件浏览

    远程操作时,使用文件浏览器通过单击 浏览是不可能的。

  4. 单击 完成以添加存储池。

8.2.2.2 管理存储池 编辑源文件

虚拟机管理器的存储管理器允许您在池中创建或删除卷。您还可以暂时停用或永久删除现有的存储池。SUSE 目前不支持更改池的基本配置。

8.2.2.2.1 启动、停止和删除池 编辑源文件

存储池的目的是在虚拟机主机服务器上提供可以添加到虚拟机中的块设备,当从远程管理它时。要使池暂时无法从远程访问,请单击存储管理器左下角的 停止。停止的池会标记为状态:不活动,并在列表窗格中显示为灰色。默认情况下,新创建的池会在虚拟机主机服务器启动时自动启动。

要启动不活动的池并使其再次可从远程访问,请单击存储管理器左下角的 启动

Note
注意:池的状态不影响已附加的卷

池中的卷,即使已附加到虚拟机,也始终可用,无论池的状态如何(活动(已停止)或不活动(已启动))。池的状态仅影响通过远程管理将卷附加到虚拟机的能力。

要永久使池无法访问,请单击存储管理器左下角的 删除。您只能删除不活动的池。删除池不会物理擦除其在虚拟机主机服务器上的内容—它只删除池配置。但是,删除池时需要格外小心,尤其是在删除基于 LVM 卷组的工具时

Warning
警告:删除存储池

删除基于本地文件系统目录、本地分区或磁盘的存储池对当前附加到虚拟机的这些池中的卷的可用性没有影响。

位于 iSCSI、SCSI、LVM 组或网络导出目录类型的池中的卷,如果池被删除,将变得无法从虚拟机访问。尽管卷本身不会被删除,但虚拟机主机服务器将无法访问这些资源。

iSCSI/SCSI 目标或网络导出目录上的卷在创建新的相应池或直接从主机系统挂载/访问这些资源时将再次可用。

删除基于 LVM 组的存储池时,LVM 组定义将被擦除,并且 LVM 组将不再存在于主机系统中。该配置是不可恢复的,该池中的所有卷都将丢失。

8.2.2.2.2 向存储池添加卷 编辑源文件

虚拟机管理器允许您在所有存储池中创建卷,除了多路径、iSCSI 或 SCSI 类型的池。这些池中的卷等同于 LUN,无法在 libvirt 中更改。

  1. 可以通过存储管理器或在向虚拟机添加新存储设备时创建新卷。在这两种情况下,请从左侧面板选择一个存储池,然后单击 创建新卷

  2. 为映像指定名称并选择映像格式。

    SUSE 目前仅支持 rawqcow2 映像。后一种选项在基于 LVM 组的池上不可用。

    最大容量旁边,指定磁盘映像允许达到的最大大小。除非您正在使用 qcow2 映像,否则您还可以设置分配量,该量应在初始时分配。如果两个值不同,则会创建一个稀疏映像文件,该文件按需增长。

    对于 qcow2 映像,您可以使用后备存储(也称为后备文件),它构成一个基本映像。新创建的 qcow2 映像随后仅记录对基本映像所做的更改。

  3. 通过单击 完成开始卷创建。

8.2.2.2.3 从存储池中删除卷 编辑源文件

只能从存储管理器中删除卷,方法是选择一个卷并单击 删除卷。通过 进行确认。

Warning
警告:即使在使用中,卷也可以被删除

即使卷当前正在被活动或非活动的虚拟机使用,也可以删除它们。无法恢复已删除的卷。

卷是否被虚拟机使用在存储管理器中的使用中列中指示。

9 虚拟机安装 编辑源文件

VM 访客由包含操作系统和数据文件的镜像以及描述 VM 访客虚拟硬件资源的配置文件组成。VM 访客托管在 VM 主机服务器上并由其控制。本节提供有关安装 VM 访客的通用说明。

虚拟机对运行操作系统的要求几乎没有额外要求。如果操作系统未针对虚拟机主机环境进行优化,则它只能在硬件辅助虚拟化计算机硬件上运行,处于完全虚拟化模式,并且需要加载特定的设备驱动程序。呈现给虚拟机的硬件取决于主机的配置。

您应该注意与在多个虚拟机上运行单个许可的操作系统的任何许可问题。有关更多信息,请查阅操作系统许可协议。

9.1 基于 GUI 的虚拟机安装 编辑源文件

Tip
提示:更改新虚拟机的默认选项

您可以更改创建新虚拟机时应用的默认值。例如,要将 UEFI 设置为新虚拟机的主目录固件类型,请从虚拟机管理器的菜单中选择 编辑 › 首选项,单击 新虚拟机,然后将 UEFI 设置为默认固件。

Specifying default options for new VMs
图 9.1: 为新虚拟机指定默认选项

新建虚拟机向导将引导您完成创建虚拟机和安装其操作系统的步骤。要启动它,请打开虚拟机管理器并选择 文件 › 新建虚拟机。或者,启动 YaST 并选择 虚拟化 › 创建虚拟机

  1. 从 YaST 或虚拟机管理器启动新建虚拟机向导。

  2. 选择一个安装源—可以是本地可用媒体,也可以是网络安装源。要从现有映像设置您的虚拟机,请选择导入现有磁盘映像

    在运行 Xen hypervisor 的虚拟机主机服务器上,您可以选择安装半虚拟化还是完全虚拟化的虚拟机。相应的选项在架构选项下可用。根据此选择,并非所有安装选项都可用。

  3. 根据您在上一步中的选择,您需要提供以下数据

    本地安装介质(ISO 映像或 CDROM)

    指定虚拟机主机服务器上包含安装数据的 ISO 映像的路径。如果它在 libvirt 存储池中可用,您也可以使用浏览进行选择。有关更多信息,请参阅 第 12 章, 高级存储主题

    或者,选择插入虚拟机主机服务器光驱中的物理 CD-ROM 或 DVD。

    网络安装(HTTP、HTTPS 或 FTP)

    提供指向安装源的URL。有效的 URL 前缀例如为 ftp://http://https://

    URL 选项下,提供自动安装文件(例如 AutoYaST 或 Kickstart)的路径和内核参数。提供 URL 后,操作系统应能正确自动检测。如果不是这种情况,请取消选中根据安装介质自动检测操作系统,然后手动选择操作系统类型版本

    导入现有磁盘映像

    要从现有映像设置虚拟机,您需要指定虚拟机主机服务器上映像的路径。如果它在 libvirt 存储池中可用,您也可以使用浏览进行选择。有关更多信息,请参阅 第 12 章, 高级存储主题

    手动安装

    此安装方法适用于创建虚拟机,手动配置其组件,然后稍后安装其操作系统。要将虚拟机调整为特定产品版本,请开始键入其名称—例如,sles—当匹配出现时选择所需版本。

  4. 选择新虚拟机的内存大小和 CPU 数量。

  5. 如果第一步选择了导入现有映像,则此步骤将被省略。

    为虚拟机设置虚拟硬盘。可以创建新的磁盘映像,或从存储池中选择一个现有映像(有关更多信息,请参阅 第 12 章, 高级存储主题)。如果您选择创建磁盘,则默认情况下将在 /var/lib/libvirt/images 下创建一个 qcow2 映像并存储。

    设置磁盘是可选的。例如,如果您直接从 CD 或 DVD 运行实时系统,则可以通过禁用为此虚拟机启用存储来省略此步骤。

  6. 在向导的最后一个屏幕上,为虚拟机指定名称。要获得查看和修改虚拟硬件选择的可能性,请激活安装前自定义配置。在网络选择下指定网络设备。使用桥接设备时,主机上找到的第一个桥接设备将预填充。要使用不同的桥接,请手动更新文本框中的名称。

    单击 完成

  7. (可选) 如果您保留了上一步中的默认设置,则安装将开始。如果您选择了安装前自定义配置,将打开一个虚拟机配置对话框。有关配置虚拟机的更多信息,请参阅 第 13 章, 使用虚拟机管理器配置虚拟机

    完成配置后,单击开始安装

Tip
提示:将按键组合传递给虚拟机

安装在虚拟机管理器控制台窗口中开始。某些按键组合,如CtrlAltF1,被虚拟机主机服务器识别但未传递给虚拟机。要绕过虚拟机主机服务器,虚拟机管理器提供了粘滞键功能。连续按三次CtrlAltShift 键,键就会变成粘滞键,然后您可以按下剩余的键将组合键传递给虚拟机。

例如,要将CtrlAltF2 传递给 Linux 虚拟机,请按三次Ctrl 键,然后按AltF2。您也可以按三次Alt 键,然后按CtrlF2

虚拟机管理器在虚拟机安装期间和之后都提供了粘滞键功能。

9.1.1 为 PXE 启动配置虚拟机 编辑源文件

PXE 启动使您的虚拟机能够通过网络从安装介质启动,而不是从物理介质或安装磁盘映像启动。

要让您的虚拟机从 PXE 服务器启动,请按照以下步骤操作

  1. 按照第 9.1 节,“基于 GUI 的虚拟机安装”中所述启动安装向导。

  2. 选择手动安装方法。

  3. 继续进行向导的最后一步,并激活安装前自定义配置。通过完成进行确认。

  4. 自定义屏幕上,选择引导选项

  5. 检查引导设备顺序并激活启用引导菜单旁边的框。

  6. 启用引导菜单下,激活网络 PXE,然后通过应用进行确认。

  7. 通过单击开始安装启动安装。如果 PXE 服务器已正确配置,则会显示 PXE 菜单屏幕。

9.2 使用 virt-install 从命令行安装 编辑源文件

virt-install 是一个命令行工具,可帮助您使用 libvirt 库创建新的虚拟机。如果您无法使用图形用户界面,或者需要自动化创建虚拟机的过程,它会很有用。

virt-install 是一个复杂的脚本,包含大量命令行开关。以下是必需的。有关更多信息,请参阅 virt-install (1) 的手册页。

通用选项
  • --name VM_GUEST_NAME:指定新虚拟机的名称。该名称在同一连接的所有虚拟机管理器已知的所有虚拟机之间必须是唯一的。它用于创建和命名虚拟机的配置文件,您可以通过此名称从 virsh 访问该虚拟机。允许使用字母数字字符以及 _-.:+ 字符。

  • --memory REQUIRED_MEMORY:以兆字节为单位指定要为新虚拟机分配的内存量。

  • --vcpus NUMBER_OF_CPUS:指定虚拟 CPU 的数量。为获得最佳性能,虚拟处理器数量应小于或等于物理处理器数量。

虚拟化类型
  • --paravirt:设置半虚拟化虚拟机。如果虚拟机主机服务器支持半虚拟化和完全虚拟化,则这是默认设置。

  • --hvm:设置完全虚拟化虚拟机。

  • --virt-type HYPERVISOR:指定虚拟机管理器。支持的值为 kvmxen

虚拟机存储

为新虚拟机指定 --disk--filesystem--nodisks 中的一种存储类型。例如,--disk size=10 在虚拟机管理器的默认映像位置创建 10 GB 的磁盘并将其用于虚拟机。 --filesystem /export/path/on/vmhost 指定虚拟机主机服务器上要导出到虚拟机的目录。 --nodisks 设置一个没有本地存储的虚拟机(适用于 Live CD)。

安装方法

使用 --location--cdrom--pxe--import--boot 中的一种指定安装方法。

访问安装

使用 --graphics VALUE 选项指定如何访问安装。 openSUSE Leap 支持 vncnone 值。

如果使用 VNC,virt-install 会尝试启动 virt-viewer。如果未安装或无法运行,请手动连接到虚拟机以使用您喜欢的查看器。要明确阻止 virt-install 启动查看器,请使用 --noautoconsole。要为访问 VNC 会话定义密码,请使用以下语法:--graphics vnc,password=PASSWORD

如果您使用 --graphics none,则可以通过操作系统支持的服务(如 SSH 或 VNC)访问虚拟机。有关如何设置这些服务的信息,请参阅操作系统安装手册。

传递内核和 initrd 文件

可以直接指定安装程序的 Kernel 和 Initrd,例如,从网络源。

要传递其他引导参数,请使用 --extra-args 选项。这可用于指定网络配置。有关详细信息,请参阅 https://en.opensuse.net.cn/SDB:Linuxrc

示例 9.1:从 HTTP 服务器加载内核和 initrd
# virt-install --location \
"http://download.opensuse.org/pub/opensuse/distribution/leap/15.0/repo/oss" \
--extra-args="textmode=1" --name "Leap15" --memory 2048 --virt-type kvm \
--connect qemu:///system --disk size=10 --graphics vnc --network \
network=vnet_nated
启用控制台

默认情况下,使用 virt-install 安装的新虚拟机未启用控制台。要启用它,请使用 --extra-args="console=ttyS0 textmode=1",如以下示例所示

> virt-install --virt-type kvm --name sles12 --memory 1024 \
 --disk /var/lib/libvirt/images/disk1.qcow2 --os-variant sles12
 --extra-args="console=ttyS0 textmode=1" --graphics none

安装完成后,虚拟机映像中的 /etc/default/grub 文件会在 GRUB_CMDLINE_LINUX_DEFAULT 行上更新 console=ttyS0 选项。

使用 UEFI 安全启动

按照 第 6.3 节,“安装 UEFI 支持” 中的说明安装 OVMF。然后将 --boot uefi 选项添加到 virt-install 命令。

在设置新虚拟机与 OVMF 时,UEFI 安全启动会自动使用。要使用特定固件,请使用 --boot loader=PATH_TO_FIRMWARE

例如,对于 AArch64 架构

--boot loader=/usr/share/qemu/qemu-uefi-aarch32.bin

对于 AMD64/Intel 64; 架构

--boot loader=/usr/share/qemu/ovmf-x86_64-opensuse.bin
示例 9.2: virt-install 命令行的示例

以下命令行示例创建了一个新的 SUSE Linux Enterprise 15 SP2 虚拟机,具有 virtio 加速的磁盘和网卡。它创建了一个新的 10 GB qcow2 磁盘映像作为存储,源安装介质是主机 CD-ROM 驱动器。它使用 VNC 图形,并自动启动图形客户端。

KVM
> virt-install --connect qemu:///system --virt-type kvm \
--name sle15sp2 --memory 1024 --disk size=10 --cdrom /dev/cdrom --graphics vnc \
--os-variant sle15sp2
Xen
> virt-install --connect xen:// --virt-type xen --hvm \
--name sle15sp2 --memory 1024 --disk size=10 --cdrom /dev/cdrom --graphics vnc \
--os-variant sle15sp2

9.3 高级虚拟机安装场景 编辑源

本节提供有关超出正常安装范围的操作的说明,例如内存气球和安装附加产品。

9.3.1 在安装中包含附加产品 编辑源

某些操作系统,例如 openSUSE Leap,提供在安装过程中包含附加产品的选项。如果附加产品安装源通过 SUSE Customer Center 提供,则无需特殊的虚拟机配置。如果通过 CD/DVD 或 ISO 映像提供,则必须同时为虚拟机安装系统提供标准安装介质映像和附加产品映像。

如果您使用基于 GUI 的安装,请在向导的最后一步选择 在安装前自定义配置,并通过 添加硬件 › 存储 添加附加产品 ISO 映像。指定映像路径并将 设备类型 设置为 CD-ROM

如果您从命令行安装,您需要使用 --disk 参数而不是 --cdrom 来设置虚拟 CD/DVD 驱动器。首先指定的设备用于引导。以下示例安装 SUSE Linux Enterprise Server 15 以及 SUSE Enterprise Storage 扩展

> virt-install \
 --name sles15+storage \
 --memory 2048 --disk size=10 \
 --disk /path/to/SLE-15-SP5-Full-ARCH-GM-media1.iso-x86_64-GM-DVD1.iso,device=cdrom \
 --disk /path/to/SUSE-Enterprise-Storage-VERSION-DVD-ARCH-Media1.iso,device=cdrom \
 --graphics vnc --os-variant sle15

10 基本虚拟机管理 编辑源

大多数管理任务,例如启动或停止 VM 客户机,都可以使用图形应用程序 Virtual Machine Manager 或在命令行中使用 virsh 来完成。 只能从图形用户界面通过 VNC 连接到图形控制台。

Note
注意:在远程虚拟机主机服务器上管理虚拟机

如果在虚拟机主机服务器上启动,则 libvirt 工具 Virtual Machine Manager、virshvirt-viewer 可用于管理主机上的虚拟机。但是,也可以管理远程虚拟机主机服务器上的虚拟机。这需要配置主机上的 libvirt 远程访问。有关说明,请参阅 第 11 章,“连接和授权”

要使用 Virtual Machine Manager 连接到此类远程主机,您需要设置一个连接,如 第 11.2.2 节,“使用 Virtual Machine Manager 管理连接” 中所述。如果使用 virshvirt-viewer 连接到远程主机,您需要使用参数 -c 指定连接 URI(例如,virsh -c qemu+tls://saturn.example.com/systemvirsh -c xen+ssh://)。连接 URI 的形式取决于连接类型和虚拟机管理器——有关详细信息,请参阅 第 11.2 节,“连接到虚拟机主机服务器”

本章中的示例均未包含连接 URI。

10.1 列出虚拟机 编辑源

虚拟机列表显示虚拟机管理器在虚拟机主机服务器上管理的所有虚拟机。

10.1.1 使用 Virtual Machine Manager 列出虚拟机 编辑源

Virtual Machine Manager 的主窗口列出了它连接到的每个虚拟机主机服务器的所有虚拟机。每个虚拟机条目包含机器名称、其状态(运行中暂停已关闭),显示为图标和文字,以及 CPU 使用率条。

10.1.2 使用 virsh 列出虚拟机 编辑源

使用命令 virsh list 获取虚拟机列表

列出所有正在运行的虚拟机
> virsh list
列出所有正在运行和不活动的虚拟机
> virsh list --all

有关更多信息和进一步的选项,请参阅 virsh help listman 1 virsh

10.2 通过控制台访问虚拟机 编辑源

虚拟机可以通过 VNC 连接(图形控制台)访问,或者,如果虚拟机操作系统支持,可以通过串行控制台访问。

10.2.1 打开图形控制台 编辑源

打开虚拟机的图形控制台可让您通过 VNC 连接与物理主机进行交互。如果访问 VNC 服务器需要身份验证,您将被要求输入用户名(如果适用)和密码。

当您单击 VNC 控制台时,光标会被 捕获,并且无法在控制台外部使用。要释放它,请按 AltCtrl

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

要阻止控制台捕获光标并启用无缝光标移动,请向虚拟机添加一个平板输入设备。有关更多信息,请参阅 第 13.5 节,“输入设备”

某些组合键,如 CtrlAltDel,会被主机系统解释,并且不会传递给虚拟机。要将此类组合键传递给虚拟机,请从 VNC 窗口打开 发送键 菜单并选择所需的组合键条目。 发送键 菜单仅在使用 Virtual Machine Manager 和 virt-viewer 时可用。使用 Virtual Machine Manager,您还可以选择 粘滞键 功能,如 提示:将组合键传递给虚拟机 中所述。

Note
注意:支持的 VNC 查看器

原则上,所有 VNC 查看器都可以连接到虚拟机的控制台。但是,如果您使用 SASL 身份验证和/或 TLS/SSL 连接来访问虚拟机,则选项将受到限制。常见的 VNC 查看器,如 tightvnctigervnc,既不支持 SASL 身份验证,也不支持 TLS/SSL。 Virtual Machine Manager 和 virt-viewer 之外唯一支持的替代方案是 Remmina(请参阅 参考》手册,第 4 章 “使用 VNC 进行远程图形会话”,第 4.2 节 “Remmina:远程桌面客户端”)。

10.2.1.1 使用 Virtual Machine Manager 打开图形控制台 编辑源

  1. 在 Virtual Machine Manager 中,右键单击虚拟机条目。

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

10.2.1.2 使用 virt-viewer 打开图形控制台 编辑源

virt-viewer 是一个简单的 VNC 查看器,具有显示虚拟机控制台的附加功能。例如,它可以以 等待 模式启动,在该模式下,它会在虚拟机启动后再连接。它还支持自动重新连接到已重启的虚拟机。

virt-viewer 通过名称、ID 或 UUID 来寻址虚拟机。使用 virsh list --all 获取此数据。

要连接到正在运行或已暂停的虚拟机,请使用 ID、UUID 或名称。已关闭的虚拟机没有 ID—您只能通过 UUID 或名称连接到它们。

连接到 ID 为 8 的虚拟机
> virt-viewer 8
连接到名为 sles12 的非活动虚拟机;一旦虚拟机启动,连接窗口就会打开
> virt-viewer --wait sles12

使用 --wait 选项,即使虚拟机当前未运行,连接也会保持。当虚拟机启动时,会启动查看器。

有关更多信息,请参阅 virt-viewer --helpman 1 virt-viewer

Note
注意:通过 SSH 进行远程连接时的密码输入

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

10.2.2 打开串行控制台 编辑源

访问虚拟机的图形控制台需要访问虚拟机的客户端上存在图形环境。作为替代方案,可以通过串行控制台和 virsh 从 shell 访问由 libvirt 管理的虚拟机。要打开名为 sles12 的虚拟机的串行控制台,请运行以下命令

> virsh console sles12

virsh console 接受两个可选标志:--safe 确保对控制台的独占访问,--force 在连接前断开任何现有会话。这两个功能都需要虚拟机操作系统支持。

能够通过串行控制台连接到虚拟机需要虚拟机操作系统支持串行控制台访问并得到正确支持。有关更多信息,请参阅虚拟机操作系统手册。

Tip
提示:为 SUSE Linux Enterprise 和 openSUSE 虚拟机启用串行控制台访问

SUSE Linux Enterprise 和 openSUSE 中的串行控制台访问默认是禁用的。要启用它,请按以下步骤操作

SLES 12、15 和 openSUSE

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

SLES 11

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

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

10.3 更改虚拟机状态:启动、停止、暂停 编辑源

启动、停止或暂停虚拟机可以使用 Virtual Machine Manager 或 virsh 完成。您还可以配置虚拟机以便在虚拟机主机服务器启动时自动启动。

关闭虚拟机时,您可以选择正常关闭,也可以强制关闭。后者等同于拔掉物理主机的电源插头,仅在别无选择时推荐。强制关闭可能会导致虚拟机上的文件系统损坏和数据丢失。

Tip
提示:正常关机

要能够执行正常关机,虚拟机必须配置为支持 ACPI。如果您使用 Virtual Machine Manager 创建了虚拟机,则 ACPI 应该在虚拟机中可用。

根据虚拟机操作系统,ACPI 的可用性可能不足以执行正常关机。强烈建议在生产环境中使用虚拟机之前先测试关机和重启。例如,openSUSE 或 SUSE Linux Enterprise Desktop 可能需要 Polkit 授权才能关机和重启。请确保在所有虚拟机上关闭此策略。

如果在 Windows XP/Windows Server 2003 虚拟机安装过程中启用了 ACPI,则仅在虚拟机配置中启用 ACPI 并不足够。有关更多信息,请参阅

无论虚拟机如何配置,始终可以从虚拟机操作系统内部执行正常关机。

10.3.1 使用 Virtual Machine Manager 更改虚拟机状态 编辑源

更改虚拟机状态可以从 Virtual Machine Manager 的主窗口或从 VNC 窗口完成。

过程 10.1:从 Virtual Machine Manager 窗口更改状态
  1. 右键单击虚拟机条目。

  2. 从弹出菜单中选择 运行暂停关机选项 中的一项。

过程 10.2:从 VNC 窗口更改状态
  1. 按照 第 10.2.1.1 节,“使用 Virtual Machine Manager 打开图形控制台” 中的说明打开 VNC 窗口。

  2. 从工具栏或 虚拟机 菜单中选择 运行暂停关机 选项之一。

10.3.1.1 自动启动虚拟机 编辑源

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

  1. 在 Virtual Machine Manager 中双击虚拟机条目以打开其控制台。

  2. 选择 查看 › 详细信息 以打开虚拟机配置窗口。

  3. 选择 引导选项 并勾选 主机启动时启动虚拟机

  4. 使用 应用 保存新配置。

10.3.2 使用 virsh 更改虚拟机状态 编辑源

在以下示例中,更改了名为 sles12 的虚拟机的状态。

启动
> virsh start sles12
暂停
> virsh suspend sles12
恢复(暂停的虚拟机)
> virsh resume sles12
重新启动
> virsh reboot sles12
正常关机
> virsh shutdown sles12
强制关机
> virsh destroy sles12
打开自动启动
> virsh autostart sles12
关闭自动启动
> virsh autostart --disable sles12

10.4 保存和恢复虚拟机状态 编辑源

保存虚拟机可保留虚拟机内存的精确状态。此操作类似于计算机的 休眠。已保存的虚拟机可以快速恢复到先前保存的运行状态。

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

恢复操作会加载虚拟机先前保存的内存状态文件并启动它。虚拟机不会启动,而是恢复到先前保存的点。此操作类似于从休眠中唤醒。

虚拟机将被保存到状态文件。确保您要保存的分区上有足够的空间。要估算预期的文件大小(以兆字节为单位),请在虚拟机上运行以下命令

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

使用保存操作后,请勿启动或运行已保存的虚拟机。这样做会导致机器的虚拟磁盘和已保存的内存状态不同步。这可能导致恢复虚拟机时出现严重错误。

要再次处理已保存的虚拟机,请使用恢复操作。如果您使用 virsh 保存了虚拟机,则无法使用 Virtual Machine Manager 恢复它。在这种情况下,请确保使用 virsh 进行恢复。

Important
重要:恢复虚拟机后同步其时间

如果您在保存虚拟机后长时间(数小时)暂停后恢复它,其时间同步服务—例如 chronyd—可能会拒绝同步其时间。在这种情况下,请手动同步虚拟机的时间。例如,对于 KVM 主机,您可以使用 QEMU 虚拟机代理并使用 guest-set-time 指示虚拟机。有关更多详细信息,请参阅 第 19 章,“QEMU 虚拟机代理”

Important
重要:仅适用于磁盘类型为 rawqcow2 的虚拟机

只有当虚拟机使用 raw.img)或 qcow2 类型的虚拟磁盘时,才能保存和恢复虚拟机。

10.4.1 使用 Virtual Machine Manager 保存/恢复 编辑源

过程 10.3:保存虚拟机
  1. 打开到虚拟机的 VNC 连接窗口。确保虚拟机正在运行。

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

过程 10.4:恢复虚拟机
  1. 打开到虚拟机的 VNC 连接窗口。确保虚拟机未运行。

  2. 选择 虚拟机 › 恢复

    如果虚拟机先前是使用 Virtual Machine Manager 保存的,则不会提供 运行 该虚拟机的选项。但是,请注意 警告:始终恢复已保存的虚拟机 中概述的 virsh 保存的机器的注意事项。

10.4.2 使用 virsh 保存和恢复 编辑源

使用命令 virsh save 保存正在运行的虚拟机,并指定保存到的文件。

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

要恢复虚拟机,请使用 virsh restore

> virsh restore /virtual/saves/opensuse13.vmsave

10.5 创建和管理快照 编辑源

虚拟机快照是完整虚拟机的快照,包括 CPU、RAM、设备状态以及所有可写磁盘的内容。要使用虚拟机快照,所有附加的硬盘都必须使用 qcow2 磁盘映像格式,并且至少有一个必须是可写的。

快照允许您在特定时间点恢复机器的状态。当撤销错误的配置或大量软件包的安装时,这很有用。启动创建于虚拟机关闭时拍摄的快照后,您需要启动它。之后写入磁盘的任何更改在启动快照时都会丢失。

Note
注意

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

10.5.1 术语 编辑源

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

内部快照

保存在原始虚拟机 qcow2 文件中的快照。该文件同时保存了快照的已保存状态以及自快照拍摄以来所做的更改。内部快照的主要优点是它们都存储在一个文件中,因此很容易在多台机器之间复制或移动。

外部快照

创建外部快照时,原始 qcow2 文件将被保存并设为只读,同时创建一个新的 qcow2 文件来保存更改。原始文件有时称为 backingbase 文件,而包含所有更改的新文件称为 overlayderived 文件。外部快照对于备份虚拟机很有用。但是,Virtual Machine Manager 不支持外部快照,并且 virsh 不能直接删除它们。有关 QEMU 中外部快照的更多信息,请参阅 第 33.2.4 节,“有效地操作磁盘映像”

实时快照

在原始虚拟机运行时创建的快照。内部实时快照支持保存设备、内存和磁盘状态,而外部实时快照与 virsh 支持保存内存状态、磁盘状态或两者。

离线快照

从已关闭的虚拟机创建的快照。这确保了数据完整性,因为所有虚拟机进程都已停止,没有内存在使用。

10.5.2 使用 Virtual Machine Manager 创建和管理快照 编辑源

Important
重要:仅内部快照

Virtual Machine Manager 仅支持内部快照,包括实时或离线快照。

要打开 Virtual Machine Manager 中的快照管理视图,请按照 第 10.2.1.1 节,“使用 Virtual Machine Manager 打开图形控制台” 中的说明打开 VNC 窗口。现在,选择 查看 › 快照 或单击工具栏中的 管理虚拟机快照

窗口左侧显示所选虚拟机的现有快照列表。最后一个启动的快照用绿色勾号标记。窗口右侧显示当前列表中标记的快照的详细信息。这些详细信息包括快照的标题和时间戳、拍摄快照时虚拟机的状态以及描述。正在运行的虚拟机的快照还包括屏幕截图。 描述 可以直接从该视图更改。其他快照数据无法更改。

10.5.2.1 创建快照 编辑源

要拍摄虚拟机的新快照,请按以下步骤操作

  1. 可选地,关闭虚拟机以创建离线快照。

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

    将打开 创建快照 窗口。

  3. 提供一个 名称,可选地提供描述。拍摄快照后,无法更改名称。为了以后能够轻松识别快照,请使用一个 易于理解的名称

  4. 单击 完成 进行确认。

10.5.2.2 删除快照 编辑源

要删除虚拟机的快照,请按以下步骤操作

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

  2. 单击 确认删除。

10.5.2.3 启动快照 编辑源

要启动快照,请按以下步骤操作

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

  2. 单击 确认启动。

10.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

10.5.3.1 创建内部快照 编辑源

要拍摄虚拟机的内部快照(实时或离线),请使用 snapshot-create-as 命令,如下所示

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

1

域名称。必填。

2

快照名称。建议使用一个 易于理解的名称,因为它更容易识别快照。必填。

3

快照的描述。可选。

10.5.3.2 创建外部快照 编辑源

使用 virsh,您可以拍摄虚拟机内存状态、磁盘状态或两者的外部快照。

要拍摄虚拟机磁盘的实时和离线外部快照,请指定 --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

要拍摄虚拟机内存的实时外部快照,请指定 --live--memspec 选项

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

要拍摄虚拟机磁盘和内存状态的实时外部快照,请组合使用 --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 部分。

10.5.3.3 删除快照 编辑源

外部快照不能用 virsh 删除。要删除虚拟机的内部快照并释放其占用的磁盘空间,请使用 snapshot-delete 命令

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

10.5.3.4 启动快照 编辑源

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

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

要启动当前快照(虚拟机启动时的快照),仅使用 --current 而不是指定快照名称就足够了

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

10.6 删除虚拟机 编辑源

默认情况下,使用 virsh 删除虚拟机仅删除其 XML 配置。由于附加存储默认不会被删除,您可以将其与其他虚拟机重用。使用 Virtual Machine Manager,您还可以删除虚拟机的存储文件。

10.6.1 使用 Virtual Machine Manager 删除虚拟机 编辑源

  1. 在 Virtual Machine Manager 中,右键单击虚拟机条目。

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

  3. 将打开一个确认窗口。单击 删除 将永久擦除虚拟机。删除不可恢复。

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

10.6.2 使用 virsh 删除虚拟机 编辑源

要删除虚拟机,需要先将其关闭。无法删除正在运行的虚拟机。有关关机的信息,请参阅 第 10.3 节,“更改虚拟机状态:启动、停止、暂停”

要使用 virsh 删除虚拟机,请运行 virsh undefine VM_NAME

> virsh undefine sles12

没有自动删除附加存储文件的选项。如果它们由 libvirt 管理,请按 第 8.2.1.4 节,“从存储池删除卷” 中的说明删除它们。

10.7 迁移虚拟机 编辑源

虚拟化的主要优点之一是虚拟机是可移植的。当虚拟机主机服务器需要进行维护或主机过载时,虚拟机可以轻松地移动到另一台虚拟机主机服务器。KVM 和 Xen 甚至支持 实时 迁移,在此期间虚拟机一直可用。

10.7.1 迁移要求 编辑源

要成功将虚拟机迁移到另一台虚拟机主机服务器,需要满足以下要求

Important
重要提示

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

> sudo sysctl -w vm.unprivileged_userfaultfd=1

由于 5.11 之前的内核版本不需要设置 unprivileged_userfaultfd 来使用 post-copy 选项,libvirt/usr/lib/sysctl.d/60-qemu-postcopy-migration.conf 文件中提供了该设置以保留旧行为。

  • 源系统和目标系统必须具有相同的架构。

  • 存储设备必须可以从两台机器访问(例如,通过 NFS 或 iSCSI),并且必须在两台机器上配置为存储池。有关更多信息,请参阅 第 12 章,“高级存储主题”

    CD-ROM 或软盘映像在移动过程中连接时也是如此。但是,您可以在移动前断开它们,如 第 13.11 节,“使用 Virtual Machine Manager 弹出和更改软盘或 CD/DVD-ROM 介质” 中所述。

  • libvirtd 必须在两台虚拟机主机服务器上运行,并且您必须能够打开目标主机和源主机(或反之)之间的远程 libvirt 连接。有关详细信息,请参阅 第 11.3 节,“配置远程连接”

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

  • 主机和目标机器应位于网络上的同一子网中,否则迁移后网络将失败。

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

  • 目标主机上不得存在同名运行或暂停的虚拟机。如果存在同名的已关闭虚拟机,其配置将被覆盖。

  • 迁移虚拟机时支持所有 CPU 模型,除了 host cpu 模型。

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

  • 文件系统直通功能与迁移不兼容。

  • 虚拟机主机服务器和虚拟机需要安装正确的时间设置。请参阅 第 17 章,“虚拟机时钟设置”

  • 不能将物理设备从主机传递给虚拟机。实时迁移目前不支持使用具有 PCI 直通或 SR-IOV 的设备。如果需要支持实时迁移,您需要使用软件虚拟化(半虚拟化或完全虚拟化)。

  • 缓存模式设置是迁移的重要设置。请参阅:第 16.6 节,“缓存模式和实时迁移”

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

  • 所有主机应处于同一级别的微码(特别是 spectre 微码更新)。这可以通过在所有主机上安装 openSUSE Leap 的最新更新来实现。

10.7.2 使用 Virtual Machine Manager 迁移 编辑源

使用 Virtual Machine Manager 迁移虚拟机时,在哪台机器上启动它并不重要。您可以在源主机、目标主机或甚至第三方主机上启动 Virtual Machine Manager。在后一种情况下,您需要能够打开到目标主机和源主机的远程连接。

  1. 启动 Virtual Machine Manager 并建立到目标主机或源主机的连接。如果 Virtual Machine Manager 未在目标主机或源主机上启动,则需要打开到两台主机的连接。

  2. 右键单击要迁移的虚拟机并选择 迁移。确保虚拟机正在运行或已暂停—无法迁移已关闭的虚拟机。

    Tip
    提示:提高迁移速度

    要提高迁移速度,请暂停虚拟机。这相当于 Virtual Machine Manager 以前所谓的 离线迁移 选项。

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

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

    高级选项 下,选择移动是永久性的(默认)还是临时的,使用 临时移动

    此外,还有一个 允许不安全 选项,它允许在不禁用虚拟机主机服务器缓存的情况下进行迁移。这可以加快迁移速度,但仅在当前配置允许在不使用 cache="none"/0_DIRECT 的情况下获得虚拟机存储的一致视图时才有效。

    Note
    注意:带宽选项

    在 Virtual Machine Manager 的最新版本中,设置迁移带宽的选项已被移除。要设置特定带宽,请改用 virsh

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

    迁移完成后,迁移 窗口关闭,虚拟机现在会列在新主机上的 Virtual Machine Manager 窗口中。原始虚拟机仍然可以在目标主机上(处于关闭状态)使用。

10.7.3 使用 virsh 迁移 编辑源

要使用 virsh migrate 迁移虚拟机,您需要直接或远程 shell 访问虚拟机主机服务器,因为该命令需要在主机上运行。迁移命令如下所示

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

最重要的选项列在下面。请参阅 virsh help migrate 获取完整列表。

--live

执行实时迁移。如果未指定,则在迁移期间暂停虚拟机(离线迁移)。

--suspend

执行离线迁移,并且不将虚拟机重新启动到目标主机。

--persistent

默认情况下,迁移的虚拟机是临时迁移的,因此如果将其关闭,其配置将自动从目标主机删除。使用此开关可使迁移持久化。

--undefinesource

指定时,在成功迁移后,源主机上的虚拟机定义将被删除(但是,附加到此虚拟机的虚拟磁盘不会被删除)。

--parallel --parallel-connections NUM_OF_CONNECTIONS

并行迁移可用于提高迁移数据吞吐量,在单个迁移线程无法使源和目标主机之间的网络链路饱和的情况下。在具有 40 GB 网络接口的主机上,可能需要四个迁移线程才能使链路饱和。通过并行迁移,迁移大型内存虚拟机所需的时间可以显着减少。

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

离线迁移,使用默认参数
> virsh migrate 37 qemu+ssh://tux@jupiter.example.com/system
瞬时实时迁移,使用默认参数
> virsh migrate --live opensuse131 qemu+ssh://tux@jupiter.example.com/system
持久实时迁移;删除源上的虚拟机定义
> 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
Note
注意:瞬时与持久迁移

默认情况下,virsh migrate 在目标主机上创建虚拟机的临时(瞬时)副本。原始虚拟机描述的已关闭版本保留在源主机上。瞬时副本在关闭后将从服务器中删除。

要创建虚拟机在目标主机上的永久副本,请使用开关 --persistent。原始虚拟机描述的已关闭版本也会保留在源主机上。将 --undefinesource--persistent 选项一起使用,以实现 真实 移动,即在目标主机上创建永久副本,并删除源主机上的副本。

不建议在不使用 --persistent 选项的情况下使用 --undefinesource,因为这会导致虚拟机在目标主机上关闭时丢失两个虚拟机定义。

10.7.4 分步示例 编辑源

10.7.4.1 导出存储 编辑源

首先需要导出存储,以便在主机之间共享虚拟机映像。这可以通过 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

10.7.4.2 在目标主机上定义池 编辑源

在您要迁移虚拟机的每个主机上,都必须定义池以能够访问(包含虚拟机映像的)卷。我们的 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 的交互式 shell 中,该 shell 也可以通过不带参数的命令 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
Warning
警告:池必须存在于所有目标主机上

记住:此池必须定义在您希望能够迁移虚拟机的所有主机上。

10.7.4.3 创建卷 编辑源

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

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

显示的卷名称稍后将用于使用 virt-install 安装虚拟机。

10.7.4.4 创建虚拟机 编辑源

让我们使用 virt-install 命令创建一个 openSUSE Leap 虚拟机。--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...

10.7.4.5 迁移虚拟机 编辑源

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

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

10.8 监控 编辑源

10.8.1 使用 Virtual Machine Manager 监控 编辑源

启动 Virtual Machine Manager 并连接到虚拟机主机服务器后,将显示所有正在运行的虚拟机的 CPU 使用率图。

使用此工具还可以获取磁盘和网络使用情况的信息,但您必须首先在 首选项 中激活它

  1. 运行 virt-manager

  2. 选择 编辑 › 首选项

  3. 将选项卡从 常规 更改为 轮询

  4. 激活您想看到的活动类型的复选框:轮询磁盘 I/O轮询网络 I/O轮询内存状态

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

  6. 关闭 首选项 对话框。

  7. 查看 › 图形 下激活应显示的图形。

之后,磁盘和网络统计信息也将显示在 Virtual Machine Manager 的主窗口中。

VNC 窗口提供了更精确的数据。按照 第 10.2.1 节,“打开图形控制台” 中的说明打开 VNC 窗口。从工具栏或 查看 菜单中选择 详细信息。统计信息显示在左侧树状菜单的 性能 条目中。

10.8.2 使用 virt-top 监控 编辑源

virt-top 是一个命令行工具,类似于广为人知的进程监控工具 topvirt-top 使用 libvirt,因此能够显示不同虚拟机管理器上运行的虚拟机的统计信息。建议使用 virt-top 而不是特定于虚拟机管理器的工具,如 xentop

默认情况下,virt-top 显示所有正在运行的虚拟机的统计信息。显示的其中一项数据是内存使用百分比(%MEM)和 CPU 使用百分比(%CPU)以及虚拟机运行时间(TIME)。数据会定期更新(默认每三秒)。以下显示了在具有七个虚拟机的虚拟机主机服务器上的输出,其中四个不活动

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:虚拟机分配的总内存
ShiftT:时间
ShiftI:ID

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

virt-top 还支持虚拟机数据的不同视图,这些视图可以即时更改,方法是按以下键

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

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

10.8.3 使用 kvm_stat 监控 编辑源

kvm_stat 可用于跟踪 KVM 性能事件。它监控 /sys/kernel/debug/kvm,因此需要挂载 debugfs。在 openSUSE Leap 上,它应该默认挂载。如果未挂载,请使用以下命令

> 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
示例 10.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

11 连接和授权 编辑源

管理多个 VM 主机服务器,每个服务器托管多个 VM 访客,很快就会变得困难。 libvirt 的一个好处是能够同时连接到多个 VM 主机服务器,从而提供一个用于管理所有 VM 访客并连接到其图形控制台的单一界面。

为确保只有授权用户才能连接,libvirt 提供了多种连接类型(通过 TLS、SSH、Unix 套接字和 TCP),这些类型可以与不同的授权机制(套接字、Polkit、SASL 和 Kerberos)结合使用。

11.1 身份验证 编辑源

管理虚拟机和访问其图形控制台的权限应该是限制在特定人群中的。为实现此目标,您可以在虚拟机主机服务器上使用以下身份验证技术

  • 通过权限和组所有权控制对 Unix 套接字的访问。此方法仅适用于 libvirtd 连接。

  • 通过 Polkit 控制对 Unix 套接字的访问。此方法仅适用于本地 libvirtd 连接。

  • 使用 SASL(简单身份验证和安全层)的用户名和密码身份验证。此方法适用于 libvirtd 和 VNC 连接。使用 SASL 不需要服务器上的实际用户帐户,因为它使用自己的数据库来存储用户名和密码。使用 SASL 身份验证的连接是加密的。

  • Kerberos 身份验证。此方法仅适用于 libvirtd 连接,本手册不涵盖。有关详细信息,请参阅 https://libvirt.org/auth.html#ACL_server_kerberos

  • 单密码身份验证。此方法仅适用于 VNC 连接。

Important
重要:libvirtd 和 VNC 的身份验证需要单独配置

对虚拟机管理功能(通过 libvirtd)及其图形控制台的访问始终需要单独配置。在限制对管理工具的访问时,这些限制不会自动应用于 VNC 连接!

通过 TLS/SSL 连接从远程访问虚拟机时,可以通过限制对证书密钥文件的读取权限给特定组来间接控制每个客户端的访问。有关详细信息,请参阅 第 11.3.2.5 节,“限制访问(安全注意事项)”

11.1.1 libvirtd 身份验证 编辑源

libvirtd 身份验证在 /etc/libvirt/libvirtd.conf 中配置。在此处进行的配置适用于所有 libvirt 工具,例如 Virtual Machine Manager 或 virsh

libvirt 提供两个套接字:一个用于监视目的的只读套接字,以及一个用于管理操作的读写套接字。两个套接字的访问都可以独立配置。默认情况下,两个套接字都属于 root.root。读写套接字的默认访问权限仅限于用户 root0700),而只读套接字的权限完全开放(0777)。

以下说明描述了如何配置读写套接字的访问权限。相同的说明也适用于只读套接字。所有配置步骤都必须在虚拟机主机服务器上执行。

Note
注意:openSUSE Leap 上的默认身份验证设置

openSUSE Leap 上的默认身份验证方法是 Unix 套接字的访问控制。只有用户 root 可以进行身份验证。当直接在虚拟机主机服务器上以非 root 用户身份访问 libvirt 工具时,您需要通过 Polkit 提供一次 root 密码。然后,您将获得当前会话和未来会话的访问权限。

或者,您可以配置 libvirt 以允许非特权用户访问“system”。有关详细信息,请参阅第 11.2.1 节,“非特权用户的“system”访问”

11.1.1.1 使用权限和组所有权进行 Unix 套接字访问控制 编辑源文件

要授予非 root 帐户访问权限,请将套接字配置为由特定组 (libvirt,如下例所示) 拥有并可访问。此身份验证方法可用于本地和远程 SSH 连接。

  1. 如果组不存在,请创建应拥有套接字的组

    > sudo groupadd libvirt
    Important
    重要:组必须存在

    在重启 libvirtd 之前,组必须存在。否则,重启将失败。

  2. 将所需用户添加到组

    > sudo usermod --append --groups libvirt tux
  3. 按如下方式修改 /etc/libvirt/libvirtd.conf 中的配置

    unix_sock_group = "libvirt"1
    unix_sock_rw_perms = "0770"2
    auth_unix_rw = "none"3

    1

    组所有权设置为 libvirt 组。

    2

    设置套接字的访问权限 (srwxrwx---)。

    3

    禁用其他身份验证方法 (Polkit 或 SASL)。访问完全由套接字权限控制。

  4. 重启 libvirtd

    > sudo systemctl start libvirtd

11.1.1.2 使用 Polkit 进行 Unix 套接字的本地访问控制 编辑源文件

使用 Polkit 的 Unix 套接字访问控制是 openSUSE Leap 上非远程连接的默认身份验证方法。因此,无需进行任何 libvirt 配置更改。启用 Polkit 授权后,两个套接字的权限默认为 0777,每个尝试访问套接字的应用程序都需要通过 Polkit 进行身份验证。

Important
重要:仅限本地连接的 Polkit 身份验证

Polkit 身份验证只能用于虚拟机主机服务器本身的本地连接,因为 Polkit 不处理远程身份验证。

存在两个用于访问 libvirt 套接字的策略

  • org.libvirt.unix.monitor:访问只读套接字

  • org.libvirt.unix.manage:访问读写套接字

默认情况下,访问读写套接字的策略是使用 root 密码进行一次身份验证,并授予当前和未来会话的权限。

要授予用户访问套接字的权限而不必提供 root 密码,您需要创建一个位于 /etc/polkit-1/rules.d 中的规则。创建 /etc/polkit-1/rules.d/10-grant-libvirt 文件,其中包含以下内容,以授予 libvirt 组所有成员对读写套接字的访问权限。

polkit.addRule(function(action, subject) {
  if (action.id == "org.libvirt.unix.manage" && subject.isInGroup("libvirt")) {
    return polkit.Result.YES;
  }
});

11.1.1.3 使用 SASL 进行用户名和密码身份验证 编辑源文件

SASL 提供用户名和密码身份验证以及数据加密 (默认使用 digest-md5)。由于 SASL 维护自己的用户数据库,因此用户不需要存在于虚拟机主机服务器上。TCP 连接以及 TLS/SSL 连接之上都需要 SASL。

Important
重要:纯 TCP 和带 digest-md5 加密的 SASL

在未加密的 TCP 连接上使用 digest-md5 加密,对于生产环境来说安全性不足。建议仅在测试环境中使用。

Tip
提示:TLS/SSL 之上的 SASL 身份验证

可以在客户端侧通过限制对证书密钥文件的访问来间接控制来自远程 TLS/SSL 连接的访问。但是,在处理许多客户端时,这可能会容易出错。将 SASL 与 TLS 结合使用,可以通过在服务器侧额外控制访问来增加安全性。

要配置 SASL 身份验证,请执行以下操作

  1. 按如下方式修改 /etc/libvirt/libvirtd.conf 中的配置

    1. 为 TCP 连接启用 SASL

      auth_tcp = "sasl"
    2. 为 TLS/SSL 连接启用 SASL

      auth_tls = "sasl"
  2. 重启 libvirtd

    > sudo systemctl restart libvirtd
  3. libvirt SASL 配置文件位于 /etc/sasl2/libvirtd.conf。通常无需更改默认设置。但是,如果在 TLS 之上使用 SASL,则可以通过注释掉设置 mech_list 参数的行来关闭会话加密,以避免额外的开销 (TLS 连接已加密)。仅对 TLS/SASL 执行此操作。对于 TCP 连接,此参数必须设置为 digest-md5。

    #mech_list: digest-md5
  4. 默认情况下,未配置 SASL 用户,因此无法登录。使用以下命令管理用户

    添加用户 tux
    saslpasswd2 -a libvirt tux
    删除用户 tux
    saslpasswd2 -a libvirt -d tux
    列出现有用户
    sasldblistusers2 -f /etc/libvirt/passwd.db
Tip
提示:virsh 和 SASL 身份验证

使用 SASL 身份验证时,每次发出 virsh 命令时都会提示您输入用户名和密码。通过在 shell 模式下使用 virsh 来避免此情况。

11.1.2 VNC 身份验证 编辑源文件

由于对虚拟机客户机的图形控制台的访问不由 libvirt 控制,而是由特定虚拟机监控程序控制,因此始终需要另外配置 VNC 身份验证。主配置文件是 /etc/libvirt/<hypervisor>.conf。本节介绍 QEMU/KVM 虚拟机监控程序,因此目标配置文件是 /etc/libvirt/qemu.conf

Note
注意:Xen 的 VNC 身份验证

与 KVM 不同,Xen 尚未提供比按虚拟机设置密码更复杂的 VNC 身份验证。请参阅下面的 <graphics type='vnc'... libvirt 配置选项。

有两种身份验证类型可用:SASL 和单密码身份验证。如果您正在将 SASL 用于 libvirt 身份验证,强烈建议您也将其用于 VNC 身份验证 — 可以共享同一数据库。

限制对虚拟机客户机的访问的第三种方法是启用 VNC 服务器上的 TLS 加密。这要求 VNC 客户端拥有 x509 客户端证书的访问权限。通过限制对这些证书的访问,可以间接控制客户端侧的访问。有关详细信息,请参阅第 11.3.2.4.2 节,“VNC over TLS/SSL:客户端配置”

11.1.2.1 使用 SASL 进行用户名和密码身份验证 编辑源文件

SASL 提供用户名和密码身份验证以及数据加密。由于 SASL 维护自己的用户数据库,因此用户不需要存在于虚拟机主机服务器上。与 libvirt 的 SASL 身份验证一样,您可以在 TLS/SSL 连接之上使用 SASL。有关配置这些连接的详细信息,请参阅第 11.3.2.4.2 节,“VNC over TLS/SSL:客户端配置”

要为 VNC 配置 SASL 身份验证,请执行以下操作

  1. 创建 SASL 配置文件。建议使用现有的 libvirt 文件。如果您已经为 libvirt 配置了 SASL,并且计划使用相同的设置,包括相同的用户名和密码数据库,则一个简单的链接就足够了。

    > sudo ln -s /etc/sasl2/libvirt.conf /etc/sasl2/qemu.conf

    如果您只设置 VNC 的 SASL,或者您计划使用与 libvirt 不同的配置,请复制现有文件作为模板

    > sudo cp /etc/sasl2/libvirt.conf /etc/sasl2/qemu.conf

    然后根据您的需求进行编辑。

  2. 按如下方式修改 /etc/libvirt/qemu.conf 中的配置

    vnc_listen = "0.0.0.0"
    vnc_sasl = 1
    sasldb_path: /etc/libvirt/qemu_passwd.db

    第一个参数使 VNC 能够监听所有公共接口 (而不是仅监听本地主机),第二个参数启用 SASL 身份验证。

  3. 默认情况下,未配置 SASL 用户,因此无法登录。使用以下命令管理用户

    添加用户 tux
    > saslpasswd2 -f /etc/libvirt/qemu_passwd.db -a qemu tux
    删除用户 tux
    > saslpasswd2 -f /etc/libvirt/qemu_passwd.db -a qemu -d tux
    列出现有用户
    > sasldblistusers2 -f /etc/libvirt/qemu_passwd.db
  4. 重启 libvirtd

    > sudo systemctl restart libvirtd
  5. 重启在更改配置前运行的所有虚拟机。尚未重启的虚拟机无法使用 VNC 连接的 SASL 身份验证。

Note
注意:支持的 VNC 查看器

SASL 身份验证当前受虚拟机管理器和 virt-viewer 支持。这两个查看器也支持 TLS/SSL 连接。

11.1.2.2 单密码身份验证 编辑源文件

对 VNC 服务器的访问也可以通过设置 VNC 密码来控制。您可以为所有虚拟机设置全局密码,也可以为每个虚拟机设置单独的密码。后者需要编辑虚拟机配置。文件。

Note
注意:始终设置全局密码

如果您使用单密码身份验证,即使设置了每个虚拟机的密码,最好也设置一个全局密码。如果您忘记设置每个机器的密码,这将用“fallback”密码保护您的虚拟机。全局密码仅在未为该计算机设置其他密码时使用。

过程 11.1: 设置全局 VNC 密码
  1. 按如下方式修改 /etc/libvirt/qemu.conf 中的配置

    vnc_listen = "0.0.0.0"
    vnc_password = "PASSWORD"

    第一个参数使 VNC 能够监听所有公共接口 (而不是仅监听本地主机),第二个参数设置密码。密码的最大长度为八个字符。

  2. 重启 libvirtd

    > sudo systemctl restart libvirtd
  3. 重启在更改配置前运行的所有虚拟机。尚未重启的虚拟机无法使用 VNC 连接的密码身份验证。

过程 11.2: 设置虚拟机特定的 VNC 密码
  1. 按如下方式修改 /etc/libvirt/qemu.conf 中的配置,以使 VNC 能够监听所有公共接口 (而不是仅监听本地主机)。

    vnc_listen = "0.0.0.0"
  2. 在编辑器中打开虚拟机客户机的 XML 配置文件。在以下示例中,将 VM_NAME 替换为虚拟机客户机的名称。使用的编辑器默认为 $EDITOR。如果未设置该变量,则使用 vi

    > virsh edit VM_NAME
  3. 搜索属性为 type='vnc'<graphics> 元素,例如

    <graphics type='vnc' port='-1' autoport='yes'/>
  4. 添加 passwd=PASSWORD 属性,保存文件并退出编辑器。密码的最大长度为八个字符。

    <graphics type='vnc' port='-1' autoport='yes' passwd='PASSWORD'/>
  5. 重启 libvirtd

    > sudo systemctl restart libvirtd
  6. 重启在更改配置前运行的所有虚拟机。尚未重启的虚拟机无法使用 VNC 连接的密码身份验证。

Warning
警告:VNC 协议的安全性

VNC 协议不被认为是安全的。虽然密码以加密方式发送,但在攻击者可以嗅探加密密码和加密密钥的情况下,它可能存在漏洞。因此,建议将 VNC 与 TLS/SSL 或通过 SSH 隧道一起使用。virt-viewer、虚拟机管理器和 Remmina (请参阅参考》一书,第 4 章“使用 VNC 进行远程图形会话”,第 4.2 节“Remmina:远程桌面客户端”) 支持这两种方法。

11.2 连接到虚拟机主机服务器 编辑源文件

要使用 libvirt 连接到虚拟机监控程序,您需要指定一个统一资源标识符 (URI)。virshvirt-viewer (在作为 root 在虚拟机主机服务器上工作时除外) 都需要此 URI,而虚拟机管理器是可选的。尽管后者可以与连接参数一起调用 (例如,virt-manager -c qemu:///system),但它也提供了一个图形界面来创建连接 URI。有关详细信息,请参阅第 11.2.2 节,“使用虚拟机管理器管理连接”

HYPERVISOR1+PROTOCOL2://USER@REMOTE3/CONNECTION_TYPE4

1

指定虚拟机监控程序。 openSUSE Leap 当前支持以下虚拟机监控程序:test (用于测试的虚拟驱动程序)、qemu (KVM) 和 xen (Xen)。此参数是必需的。

2

连接到远程主机时,在此处指定协议。它可以是以下之一:ssh (通过 SSH 隧道连接)、tcp (具有 SASL/Kerberos 身份验证的 TCP 连接)、tls (使用 x509 证书进行身份验证的 TLS/SSL 加密连接)。

3

连接到远程主机时,请在此处指定用户名和远程主机名。如果未指定用户名,则使用调用命令的用户 ($USER)。有关更多信息,请参见下文。对于 TLS 连接,主机名需要与 x509 证书中的名称完全相同。

4

连接到 QEMU/KVM 虚拟机监控程序时,接受两种连接类型:system (用于完全访问权限) 或 session (用于受限访问)。由于 openSUSE Leap 不支持 session 访问,因此本文档侧重于 system 访问。

示例虚拟机监控程序连接 URI
test:///default

连接到本地虚拟驱动程序。用于测试。

qemu:///systemxen:///system

连接到本地主机的 QEMU/Xen 虚拟机监控程序,并具有完全访问权限 (system 类型)。

qemu+ssh://tux@mercury.example.com/systemxen+ssh://tux@mercury.example.com/system

连接到远程主机 mercury.example.com 上的 QEMU/Xen 虚拟机监控程序。连接通过 SSH 隧道建立。

qemu+tls://saturn.example.com/systemxen+tls://saturn.example.com/system

连接到远程主机 mercury.example.com 上的 QEMU/Xen 虚拟机监控程序。连接使用 TLS/SSL 建立。

有关更多详细信息和示例,请参阅 libvirt 文档,网址为 https://libvirt.org/uri.html

Note
注意:URI 中的用户名

使用 Unix 套接字身份验证时 (无论使用用户名/密码身份验证方案还是 Polkit),都需要指定用户名。这适用于所有 SSH 和本地连接。

使用 SASL 身份验证 (TCP 或 TLS 连接) 或对 TLS 连接不进行额外服务器端身份验证时,无需指定用户名。使用 SASL 时,不评估用户名 — 无论如何都会提示您输入 SASL 用户/密码组合。

11.2.1 非特权用户的“system”访问 编辑源文件

如上所述,可以通过两种不同的协议建立与 QEMU 虚拟机监控程序的连接:sessionsystem。“session”连接以与客户端程序相同的权限启动。此类连接适用于桌面虚拟化,因为它受到限制 (例如,无 USB/PCI 设备分配、无虚拟网络设置、对 libvirtd 的远程访问受限)。

用于服务器虚拟化的“system”连接没有功能限制,但默认情况下只能由 root 访问。但是,通过向 libvirt 添加 DAC (Discretionary Access Control) 驱动程序,现在可以授予非特权用户“system”访问权限。要授予用户 tuxsystem”访问权限,请执行以下操作

过程 11.3: 授予普通用户“system”访问权限
  1. 启用通过 Unix 套接字的访问,如第 11.1.1.1 节,“使用权限和组所有权进行 Unix 套接字访问控制”中所述。在该示例中,将 libvirt 的访问授予了 libvirt 组的所有成员,并将 tux 添加为该组成员。这确保了 tux 可以使用 virsh 或虚拟机管理器进行连接。

  2. 编辑 /etc/libvirt/qemu.conf 并按如下方式修改配置

    user = "tux"
    group = "libvirt"
    dynamic_ownership = 1

    这可确保虚拟机由 tux 启动,并且 tux 可以访问和修改绑定到客户机的资源 (例如虚拟磁盘)。

  3. tux 添加到 kvm

    > sudo usermod --append --groups kvm tux

    需要此步骤才能授予对 /dev/kvm 的访问权限,这是启动虚拟机所必需的。

  4. 重启 libvirtd

    > sudo systemctl restart libvirtd

11.2.2 使用虚拟机管理器管理连接 编辑源文件

虚拟机管理器为它管理的每个虚拟机主机服务器使用一个 Connection。每个连接都包含各自主机上的所有虚拟机。默认情况下,已配置并连接到本地主机的连接。

所有已配置的连接都显示在虚拟机管理器主窗口中。活动连接用小三角形标记,您可以单击该三角形来折叠或展开该连接的虚拟机列表。

非活动连接显示为灰色,并标记为“Not Connected”。您可以双击或右键单击它,然后从上下文菜单中选择Connect。您也可以从此菜单中Delete现有连接。

Note
注意:编辑现有连接

无法编辑现有连接。要更改连接,请创建一个具有所需参数的新连接,然后删除“old”连接。

要添加虚拟机管理器中的新连接,请执行以下操作

  1. 选择File › Add Connection

  2. 选择主机的Hypervisor (XenQEMU/KVM)

  3. (可选) 要设置远程连接,请选择Connect to remote host。有关更多信息,请参阅第 11.3 节,“配置远程连接”

    对于远程连接,请在 USERNAME@REMOTE _HOST 格式中指定远程计算机的Hostname

    Important
    重要:指定用户名

    TCP 和 TLS 连接无需指定用户名:在这些情况下,不进行评估。但是,对于 SSH 连接,当您要以非 root 用户身份连接时,必须指定用户名。

  4. 如果您不希望在启动虚拟机管理器时自动启动连接,请停用Autoconnect

  5. 通过单击Connect完成配置。

11.3 配置远程连接 编辑源文件

libvirt 的一个主要好处是能够从中心位置管理不同远程主机上的虚拟机。本节提供了有关如何配置服务器和客户端以允许远程连接的详细说明。

11.3.1 通过 SSH 进行远程隧道 (qemu+sshxen+ssh) 编辑源文件

在虚拟机主机服务器上启用通过 SSH 隧道的远程连接,只需要能够接受 SSH 连接即可。请确保 SSH 守护进程已启动 (systemctl status sshd),并且防火墙中已打开服务 SSH 的端口。

SSH 连接的用户身份验证可以使用传统的基于文件所有权和权限的方法,如第 11.1.1.1 节,“使用权限和组所有权进行 Unix 套接字访问控制”中所述。以用户 tux (qemu+ssh://tuxsIVname;/systemxen+ssh://tuxsIVname;/system) 的身份连接开箱即用,无需在 libvirt 端进行额外配置。

通过 SSH qemu+ssh://USER@SYSTEMxen+ssh://USER@SYSTEM 连接时,您需要提供 USER 的密码。这可以通过将您的公钥复制到虚拟机主机服务器上的 ~USER/.ssh/authorized_keys 来避免,如安全和加固指南》一书,第 22 章“使用 OpenSSH 保护网络操作”,第 22.6 节“公钥身份验证”中所述。在连接的机器上使用 gnome-keyring 可以提供更多便利。有关更多信息,请参阅安全和加固指南》一书,第 22 章“使用 OpenSSH 保护网络操作”,第 22.9 节“使用 gnome-keyring 进行自动化公钥登录”

11.3.2 使用 x509 证书进行远程 TLS/SSL 连接 (qemu+tlsxen+tls) 编辑源文件

使用带有 TLS/SSL 加密和 x509 证书身份验证的 TCP 连接比 SSH 设置要复杂得多,但可扩展性更好。如果您需要管理具有不同管理员数量的多个虚拟机主机服务器,请使用此方法。

11.3.2.1 基本概念 编辑源文件

TLS (Transport Layer Security) 通过使用证书加密两个计算机之间的通信。发起连接的计算机始终被视为client,使用client certificate,而接收计算机始终被视为server,使用server certificate。例如,如果您从中央桌面管理虚拟机主机服务器,则适用此场景。

如果从两台计算机发起连接,则每台计算机都需要客户端 服务器证书。例如,如果您将虚拟机客户机从一个主机迁移到另一个主机,就是这种情况。

每个 x509 证书都有一个匹配的私钥文件。只有证书和私钥文件的组合才能正确标识自身。为了确保证书是由假定的所有者颁发的,它由一个称为证书颁发机构 (CA) 的中心证书签名并颁发。客户端和服务器证书都必须由同一 CA 颁发。

Important
重要:用户身份验证

使用远程 TLS/SSL 连接仅确保两台计算机被允许在特定方向上进行通信。可以通过在客户端限制对证书的访问来间接实现对特定用户的访问限制。有关更多信息,请参阅第 11.3.2.5 节,“限制访问 (安全注意事项)”

libvirt 还支持在服务器上使用 SASL 进行用户身份验证。有关更多信息,请参阅第 11.3.2.6 节,“使用 SASL 为 TLS 套接字进行集中用户身份验证”

11.3.2.2 配置虚拟机主机服务器 编辑源文件

虚拟机主机服务器是接收连接的机器。因此,需要安装服务器证书。CA 证书也需要安装。证书到位后,即可为 libvirt 启用 TLS 支持。

  1. 创建服务器证书并将其与相应的 CA 证书一起导出。

  2. 在虚拟机主机服务器上创建以下目录

    > sudo mkdir -p /etc/pki/CA/ /etc/pki/libvirt/private/

    如下安装证书

    > sudo /etc/pki/CA/cacert.pem
    > sudo /etc/pki/libvirt/servercert.pem
    > sudo /etc/pki/libvirt/private/serverkey.pem
    Important
    重要:限制对证书的访问

    确保限制对证书的访问,如第 11.3.2.5 节,“限制访问 (安全注意事项)”中所述。

  3. 通过启用相关套接字并重启 libvirtd 来启用 TLS 支持

    > sudo systemctl stop libvirtd.service
    > sudo systemctl enable --now libvirtd-tls.socket
    > sudo systemctl start libvirtd.service
  4. 默认情况下,libvirt 使用 TCP 端口 16514 来接受安全的 TLS 连接。在防火墙中打开此端口。

Important
重要:启用 TLS 后重启 libvirtd

如果您为 libvirt 启用了 TLS,则必须已安装服务器证书,否则重启 libvirtd 将失败。如果您更改证书,还需要重启 libvirtd

11.3.2.3 配置客户端并测试设置 编辑源文件

客户端是发起连接的机器。因此,需要安装客户端证书。CA 证书也需要安装。

  1. 创建客户端证书并将其与相应的 CA 证书一起导出。

  2. 在客户端上创建以下目录

    > sudo mkdir -p /etc/pki/CA/ /etc/pki/libvirt/private/

    如下安装证书

    > sudo /etc/pki/CA/cacert.pem
    > sudo /etc/pki/libvirt/clientcert.pem
    > sudo /etc/pki/libvirt/private/clientkey.pem
    Important
    重要:限制对证书的访问

    确保限制对证书的访问,如第 11.3.2.5 节,“限制访问 (安全注意事项)”中所述。

  3. 通过发出以下命令测试客户端/服务器设置。将 mercury.example.com 替换为您的虚拟机主机服务器的名称。指定与创建服务器证书时使用的完全限定主机名相同。

    #QEMU/KVM
    virsh -c qemu+tls://mercury.example.com/system list --all
    
    #Xen
    virsh -c xen+tls://mercury.example.com/system list --all

    如果您的设置正确,您将看到虚拟机主机服务器上注册到 libvirt 的所有虚拟机列表。

11.3.2.4 为 TLS/SSL 连接启用 VNC 编辑源文件

目前,只有少数工具支持通过 TLS 进行 VNC 通信。常见的 VNC 查看器,如 tightvnctigervnc,不支持 TLS/SSL。虚拟机管理器和 virt-viewer 之外唯一受支持的替代方案是 remmina (请参阅参考》一书,第 4 章“使用 VNC 进行远程图形会话”,第 4.2 节“Remmina:远程桌面客户端”)。

11.3.2.4.1 VNC over TLS/SSL: 虚拟机主机服务器配置 编辑源文件

要通过 TLS/SSL 访问 VNC 的图形控制台,您需要按如下方式配置虚拟机主机服务器

  1. 在防火墙中为 VNC 服务打开端口。

  2. 创建一个目录 /etc/pki/libvirt-vnc,并将证书链接到该目录,如下所示

    > sudo mkdir -p /etc/pki/libvirt-vnc && cd /etc/pki/libvirt-vnc
    > sudo ln -s /etc/pki/CA/cacert.pem ca-cert.pem
    > sudo ln -s /etc/pki/libvirt/servercert.pem server-cert.pem
    > sudo ln -s /etc/pki/libvirt/private/serverkey.pem server-key.pem
  3. 编辑 /etc/libvirt/qemu.conf 并设置以下参数

    vnc_listen = "0.0.0.0"
            vnc_tls = 1
            vnc_tls_x509_verify = 1
  4. 重启 libvirtd

    > sudo systemctl restart libvirtd
    Important
    重要:虚拟机需要重启

    VNC TLS 设置仅在启动虚拟机客户机时设置。因此,您需要重启在进行配置更改之前运行的所有虚拟机。

11.3.2.4.2 VNC over TLS/SSL: 客户端配置 编辑源文件

客户端上唯一需要的操作是将 x509 客户端证书放置在所选客户端能够识别的位置。但是,虚拟机管理器和 virt-viewer 期望在不同的位置找到证书。虚拟机管理器可以从适用于所有用户的系统范围位置读取,也可以从每个用户位置读取。Remmina (请参阅参考》一书,第 4 章“使用 VNC 进行远程图形会话”,第 4.2 节“Remmina:远程桌面客户端”) 在初始化与远程 VNC 会话的连接时会询问证书的位置。

虚拟机管理器 (virt-manager)

要连接到远程主机,虚拟机管理器需要第 11.3.2.3 节,“配置客户端并测试设置”中解释的设置。要能够通过 VNC 进行连接,还必须将客户端证书放置在以下位置

系统范围位置
/etc/pki/CA/cacert.pem
/etc/pki/libvirt-vnc/clientcert.pem
/etc/pki/libvirt-vnc/private/clientkey.pem
每个用户位置
/etc/pki/CA/cacert.pem
~/.pki/libvirt-vnc/clientcert.pem
~/.pki/libvirt-vnc/private/clientkey.pem
virt-viewer

virt-viewer 仅接受来自系统范围位置的证书

/etc/pki/CA/cacert.pem
/etc/pki/libvirt-vnc/clientcert.pem
/etc/pki/libvirt-vnc/private/clientkey.pem
Important
重要:限制对证书的访问

确保限制对证书的访问,如第 11.3.2.5 节,“限制访问 (安全注意事项)”中所述。

11.3.2.5 限制访问 (安全注意事项) 编辑源文件

每个 x509 证书由两部分组成:公共证书和私钥。客户端只能使用这两部分进行身份验证。因此,任何有权读取客户端证书及其私钥的用户都可以访问您的虚拟机主机服务器。另一方面,拥有完整服务器证书的任意机器都可以冒充虚拟机主机服务器。由于这不可取,因此必须尽可能限制对至少私钥文件的访问。控制对密钥文件的访问的最简单方法是使用访问权限。

服务器证书

QEMU 进程需要可读服务器证书。在 openSUSE Leap QEMU 上,从 libvirt 工具启动的进程归 root 所有,因此 root 可以读取证书就足够了。

> chmod 700 /etc/pki/libvirt/private/
> chmod 600 /etc/pki/libvirt/private/serverkey.pem

如果您在 /etc/libvirt/qemu.conf 中更改了 QEMU 进程的所有权,您还需要调整密钥文件的所有权。

系统范围的客户端证书

要控制对系统范围可用的密钥文件的访问,请将读取访问权限限制为某个组,以便只有该组成员才能读取密钥文件。在以下示例中,创建了一个 libvirt 组,并将 clientkey.pem 文件及其父目录的组所有权设置为 libvirt。之后,将访问权限限制为所有者和组。最后,将用户 tux 添加到 libvirt 组,从而可以访问密钥文件。

CERTPATH="/etc/pki/libvirt/"
# create group libvirt
groupadd libvirt
# change ownership to user root and group libvirt
chown root.libvirt $CERTPATH/private $CERTPATH/clientkey.pem
# restrict permissions
chmod 750 $CERTPATH/private
chmod 640 $CERTPATH/private/clientkey.pem
# add user tux to group libvirt
usermod --append --groups libvirt tux
每个用户证书

通过 VNC 访问虚拟机客户机的图形控制台的用户特定客户端证书需要放置在用户主目录的 ~/.pki 中。与 SSH 等不同,使用这些证书的 VNC 查看器不检查私钥文件的访问权限。因此,用户有责任确保密钥文件不被其他人读取。

11.3.2.5.1 从服务器端限制访问 编辑源文件

默认情况下,每个拥有适当客户端证书的客户端都可以连接到接受 TLS 连接的虚拟机主机服务器。因此,可以使用 SASL 的附加服务器端身份验证,如第 11.1.1.3 节,“使用 SASL 进行用户名和密码身份验证”中所述。

还可以使用 DN (区分名称) 的允许列表来限制访问,这样只有证书匹配列表中的 DN 的客户端才能连接。

将允许的 DN 列表添加到 /etc/libvirt/libvirtd.conf 中的 tls_allowed_dn_list。此列表可能包含通配符。不要指定空列表,因为这会导致拒绝所有连接。

tls_allowed_dn_list = [
   "C=US,L=Provo,O=SUSE Linux Products GmbH,OU=*,CN=venus.example.com,EMAIL=*",
   "C=DE,L=Nuremberg,O=SUSE Linux Products GmbH,OU=Documentation,CN=*"]

使用以下命令获取证书的区分名称

> certtool -i --infile /etc/pki/libvirt/clientcert.pem | grep "Subject:"

更改配置后重启 libvirtd

> sudo systemctl restart libvirtd

11.3.2.6 使用 SASL 为 TLS 套接字进行集中用户身份验证 编辑源文件

无法直接通过 TLS 进行用户身份验证 — 这在每个客户端上通过证书的读取权限间接处理,如第 11.3.2.5 节,“限制访问 (安全注意事项)”中所述。但是,如果需要集中的基于服务器的用户身份验证,libvirt 还允许在 TLS 之上使用 SASL (Simple Authentication and Security Layer) 进行直接用户身份验证。有关配置详细信息,请参阅第 11.1.1.3 节,“使用 SASL 进行用户名和密码身份验证”

11.3.2.7 故障排除 编辑源文件

11.3.2.7.1 虚拟机管理器/virsh 无法连接到服务器 编辑源文件

按顺序检查以下内容

是防火墙问题吗 (服务器上需要打开 TCP 端口 16514)?
启动虚拟机管理器/virsh 的用户是否可读客户端证书 (证书和密钥)?
连接指定的完全限定主机名是否与服务器证书中的主机名相同?
服务器上是否启用了 TLS (listen_tls = 1)?
服务器上的 libvirtd 是否已重启?
11.3.2.7.2 VNC 连接失败 编辑源文件

确保您可以使用虚拟机管理器连接到远程服务器。如果可以,请检查服务器上的虚拟机是否已启动 TLS 支持。以下示例中虚拟机的名称是 sles

> ps ax | grep qemu | grep "\-name sles" | awk -F" -vnc " '{ print FS $2 }'

如果输出不以类似以下内容开头的字符串开始,则该机器未启用 TLS 支持,必须重启。

 -vnc 0.0.0.0:0,tls,x509verify=/etc/pki/libvirt

12 高级存储主题 编辑源文件

本章介绍有关从 VM 主机服务器的角度操作存储的高级主题。

12.1 使用 virtlockd 锁定磁盘文件和块设备 编辑源文件

锁定块设备和磁盘文件可防止来自不同虚拟机客户机的并发写入这些资源。它能防止同一虚拟机客户机启动两次,或将同一磁盘添加到两个不同的虚拟机。这降低了虚拟机磁盘映像因配置错误而损坏的风险。

锁定由一个名为 virtlockd 的守护进程控制。由于它独立于 libvirtd 守护进程运行,因此锁定操作会承受 libvirtd 的崩溃或重启。锁定甚至在 virtlockd 本身更新期间也会持续存在,因为它可以重新执行自身。这确保了虚拟机客户机在 virtlockd 更新时不需要重启。virtlockd 支持 KVM、QEMU 和 Xen。

12.1.1 启用锁定 编辑源文件

默认情况下,openSUSE Leap 上未启用虚拟磁盘锁定。要启用它并在重新启动时自动启动,请执行以下步骤

  1. 编辑 /etc/libvirt/qemu.conf 并设置

    lock_manager = "lockd"
  2. 使用以下命令启动 virtlockd 守护进程

    > sudo systemctl start virtlockd
  3. 使用以下命令重启 libvirtd 守护进程

    > sudo systemctl restart libvirtd
  4. 确保 virtlockd 在系统启动时自动启动

    > sudo systemctl enable virtlockd

12.1.2 配置锁定 编辑源文件

默认情况下,virtlockd 配置为自动锁定虚拟机客户机使用的所有磁盘。默认设置使用“direct”锁空间,其中锁定是直接针对与虚拟机客户机 disk 设备关联的实际文件路径获取的。例如,当虚拟机客户机包含以下 disk 设备时,flock(2) 会直接在 /var/lib/libvirt/images/my-server/disk0.raw 上调用

<disk type='file' device='disk'>
 <driver name='qemu' type='raw'/>
 <source file='/var/lib/libvirt/images/my-server/disk0.raw'/>
 <target dev='vda' bus='virtio'/>
</disk>

可以通过编辑文件 /etc/libvirt/qemu-lockd.conf 来更改 virtlockd 的配置。该文件还包含详细的注释,提供更多信息。确保通过重新加载 virtlockd 来激活配置更改。

> sudo systemctl reload virtlockd

12.1.2.1 启用间接锁空间 编辑源文件

virtlockd 的默认配置使用“direct”锁空间。这意味着锁定是针对与 disk 设备关联的实际文件路径获取的。

如果所有主机都无法访问磁盘文件路径,可以配置 virtlockd 以允许“indirect”锁空间。这意味着磁盘映像路径的哈希用于在间接锁空间目录中创建文件。然后,锁定将应用于这些哈希文件,而不是实际的磁盘文件路径。如果包含磁盘文件的文件系统不支持 fcntl() 锁,则间接锁空间也很有用。间接锁空间使用 file_lockspace_dir 设置指定。

file_lockspace_dir = "/MY_LOCKSPACE_DIRECTORY"

12.1.2.2 在 LVM 或 iSCSI 卷上启用锁定 编辑源文件

当需要锁定放置在由多个主机共享的 LVM 或 iSCSI 卷上的虚拟机磁盘时,需要按 UUID 而不是按路径 (默认使用的) 进行锁定。此外,锁空间目录需要放置在所有共享该卷的主机都可以访问的共享文件系统上。为 LVM 和/或 iSCSI 设置以下选项

lvm_lockspace_dir = "/MY_LOCKSPACE_DIRECTORY"
iscsi_lockspace_dir = "/MY_LOCKSPACE_DIRECTORY"

12.2 在线调整客户机块设备大小 编辑源文件

有时需要更改 — 扩展或缩小 — 客户机系统使用的块设备的大小。例如,当最初分配的磁盘空间不再足够时,就该增加其大小了。如果客户机磁盘位于逻辑卷上,您可以在客户机系统运行时调整其大小。这与离线磁盘大小调整 (请参阅第 18.3 节,“Guestfs 工具”包中的 virt-resize 命令) 相比是一个很大的优势,因为客户机提供的服务不会因大小调整过程而中断。要调整虚拟机客户机磁盘的大小,请按照以下步骤操作

过程 12.1: 在线调整客户机磁盘大小
  1. 在客户机系统中,检查磁盘的当前大小 (例如 /dev/vda)。

    # fdisk -l /dev/vda
    Disk /dev/sda: 160.0 GB, 160041885696 bytes, 312581808 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
  2. 在主机上,将持有客户机 /dev/vda 磁盘的逻辑卷调整到所需大小,例如 200 GB。

    # lvresize -L 200G /dev/mapper/vg00-home
    Extending logical volume home to 200 GiB
    Logical volume home successfully resized
  3. 在主机上,调整与客户机磁盘 /dev/mapper/vg00-home 相关的块设备大小。您可以使用 virsh list 查找 DOMAIN_ID

    # virsh blockresize  --path /dev/vg00/home --size 200G DOMAIN_ID
    Block device '/dev/vg00/home' is resized
  4. 检查客户机是否接受了新的磁盘大小。

    # fdisk -l /dev/vda
    Disk /dev/sda: 200.0 GB, 200052357120 bytes, 390727260 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes

12.3 在主机和客户机之间共享目录 (文件系统直通) 编辑源文件

libvirt 允许使用 QEMU 的文件系统直通 (也称为 VirtFS) 功能在主机和客户机之间共享目录。这样的目录也可以同时被多个虚拟机客户机访问,因此可用于在虚拟机客户机之间交换文件。

Note
注意:Windows 客户机和文件系统直通

由于 Windows 缺少挂载共享目录所需的驱动程序,因此无法通过文件系统直通在虚拟机主机服务器和 Windows 客户机之间共享目录。

要使共享目录在虚拟机客户机上可用,请执行以下操作

  1. 在虚拟机管理器中打开客户机的控制台,然后从菜单中选择View › Details,或者单击工具栏中的Show virtual hardware details。选择Add Hardware › Filesystem以打开Filesystem Passthrough对话框。

  2. Driver 允许您在HandlePath基础驱动程序之间进行选择。默认设置是PathMode让您选择安全模型,该模型会影响文件权限在主机上的设置方式。提供三个选项

    Passthrough (默认)

    文件系统上的文件直接以客户端用户的凭据创建。这类似于 NFSv3 的工作方式。

    Squash

    Passthrough相同,但会忽略特权操作 (如 chown) 的失败。当 KVM 不以root权限运行时,需要此设置。

    Mapped

    文件以文件服务器的凭据 (qemu.qemu) 创建。用户凭据和客户端用户的凭据保存在扩展属性中。当主机和客户机域应保持隔离时,建议使用此模型。

  3. 使用 Source Path 指定虚拟机主机服务器上目录的路径。在 Target Path 中输入一个字符串,用作挂载共享目录的标签。此字段中的字符串仅为标签,而不是虚拟机客户机上的路径。

  4. 单击Apply设置。如果虚拟机客户机当前正在运行,则需要关闭它才能应用新的设置 (重启客户机不足以生效)。

  5. 启动虚拟机客户机。要挂载共享目录,请执行以下命令

    > sudo mount -t 9p -o trans=virtio,version=9p2000.L,rw TAG /MOUNT_POINT

    要使共享目录永久可用,请将以下行添加到 /etc/fstab 文件

    TAG   /MOUNT_POINT    9p  trans=virtio,version=9p2000.L,rw    0   0

12.4 将 RADOS 块设备与 libvirt 一起使用 编辑源文件

RADOS 块设备 (RBD) 将数据存储在 Ceph 集群中。它们支持快照、复制和数据一致性。您可以像使用其他块设备一样,从 libvirt 管理的虚拟机客户机中使用 RBD。

13 使用虚拟机管理器配置虚拟机 编辑源文件

摘要

Virtual Machine Manager 的 详细信息 视图提供有关 VM 访客完整配置和硬件设备的深入信息。使用此视图,您还可以更改访客配置或添加和修改虚拟硬件。要访问此视图,请在 Virtual Machine Manager 中打开访客的控制台,然后选择 视图 › 详细信息 从菜单中,或单击工具栏中的 显示虚拟硬件详细信息

Details view of a VM Guest
图 13.1: 虚拟机客户机的Details视图

窗口的左侧面板列出了虚拟机客户机概览和已安装的硬件。单击列表中的项目后,您可以在详细信息视图中访问其详细设置。您可以更改硬件参数以满足您的需求,然后单击Apply进行确认。某些更改会立即生效,而另一些更改则需要重启机器 — virt-manager 会对此进行警告。

要从虚拟机客户机中删除已安装的硬件,请在左侧面板中选择相应的列表条目,然后在窗口右下角单击Remove

要添加新硬件,请单击左侧面板下方的Add Hardware,然后在Add New Virtual Hardware窗口中选择要添加的硬件类型。修改其参数并使用Finish确认。

以下各节描述了特定硬件类型的配置选项正在添加。它们不侧重于修改现有硬件,因为选项是相同的。

13.1 机器设置 编辑源文件

本节介绍虚拟处理器和内存硬件的设置。这些组件对虚拟机客户机至关重要,因此您无法删除它们。它还显示了如何查看概览和性能信息,以及如何更改引导参数。

13.1.1 概览 编辑源文件

Overview 显示有关虚拟机客户机和虚拟机监控程序的详细信息。

Overview details
图 13.2: 概览详细信息

NameTitleDescription是可编辑的,有助于您在Virtual Machine Manager机器列表中识别虚拟机客户机。

VM Guest title and description
图 13.3: 虚拟机客户机标题和描述

UUID 显示虚拟机的通用唯一标识符,而Status显示其当前状态 —RunningPausedShutoff

Hypervisor Details 部分显示虚拟机监控程序类型、CPU 架构、使用的模拟器和芯片组类型。无法更改任何虚拟机监控程序参数。

13.1.2 性能 编辑源文件

Performance 显示 CPU 和内存使用情况以及磁盘和网络 I/O 的定期更新图表。

Performance
图 13.4: 性能
Tip
提示:启用禁用图表

并非所有 Graph 视图中的图表都默认启用。要启用这些图表,请转到File › View Manager,然后选择Edit › Preferences › Polling,并勾选您想定期更新的图表。

Statistics charts
图 13.5: 统计图表

13.1.3 处理器 编辑源文件

CPU 包含有关虚拟机客户机处理器配置的详细信息。

Processor view
图 13.6: 处理器视图

CPUs 部分,您可以配置分配给虚拟机客户机的虚拟 CPU 数量。Logical host CPUs 显示虚拟机主机服务器上在线可用 CPU 的数量。

Configuration 部分允许您配置 CPU 模型和拓扑。

激活时,Copy host CPU configuration 选项将使用主机 CPU 模型用于虚拟机客户机。您可以在 virsh capabilities 命令的输出中看到主机 CPU 模型的详细信息。停用时,需要从下拉框中可用的模型中指定 CPU 模型。

主机 CPU 模型在 CPU 功能和迁移虚拟机客户机的能力之间提供了良好的折衷。libvirt 不模拟每个 CPU 的每个方面,因此虚拟机客户机 CPU 与虚拟机主机服务器 CPU 不完全匹配。但是,提供给虚拟机客户机的 ABI 是可重现的,在迁移过程中,完整的 CPU 模型定义将被传输到目标虚拟机主机服务器,确保迁移的虚拟机客户机在目标上可以看到完全相同的 CPU 模型。

host-passthrough 模型为虚拟机客户机提供与虚拟机主机服务器 CPU 完全相同的 CPU。当虚拟机客户机工作负载需要 libvirt 简化的 host-model CPU 中不存在的 CPU 功能时,这很有用。host-passthrough 模型存在迁移能力降低的缺点。具有 host-passthrough 模型 CPU 的虚拟机客户机只能迁移到具有相同硬件的虚拟机主机服务器。

有关 libvirt 的 CPU 模型和拓扑选项的更多信息,请参阅网址为 https://libvirt.org/formatdomain.html#cpu-model-and-topologyCPU 模型和拓扑 文档。

激活Manually set CPU topology后,您可以为 CPU 指定自定义的插槽数、核心数和线程数。

13.1.4 内存 编辑源文件

Memory 包含有关虚拟机客户机可用内存的信息。

Memory view
图 13.7: 内存视图
主机总内存

安装在虚拟机主机服务器上的内存总量。

当前分配

虚拟机客户机当前可用的内存量。您可以将其增加到 Maximum allocation 的值,以热插拔更多内存。

启用共享内存

指定虚拟机是否可以通过 memfd 后端使用共享内存。这是使用 virtiofs 文件系统的要求。有关更多详细信息,请参阅https://libvirt.org/kbase/virtiofs.html

最大分配

您可以热插拔当前可用内存的最大值。对此值的任何更改将在下次虚拟机客户机重启后生效。

启用启动安全

如果虚拟机主机服务器支持 AMD-SEV 技术,则激活此选项将启用具有加密内存的安全客户机。此选项需要具有 Q35 芯片组类型的虚拟机。

Important
重要:大型内存 VM Guest

内存需求为 4 TB 或更高的虚拟机客户机必须使用 host-passthrough CPU 模式,或者在使用 host-modelcustom CPU 模式时显式指定虚拟 CPU 地址大小。对于这些模式,默认的虚拟 CPU 地址大小可能不足以满足 4 TB 或更高的内存配置。地址大小只能通过编辑虚拟机客户机的 XML 配置来指定。有关指定虚拟 CPU 地址大小的更多信息,请参阅第 14.6 节,“配置内存分配”

13.1.5 启动选项 编辑源文件

Boot Options 介绍影响虚拟机客户机启动过程的选项。

Boot options
图 13.8: 启动选项

Autostart 部分,您可以指定虚拟机是否应在虚拟机主机服务器启动阶段自动启动。

Boot device order 中,激活用于启动虚拟机客户机的设备。您可以使用列表右侧的上箭头和下箭头按钮更改它们的顺序。要在启动虚拟机客户机时从可启动设备列表中进行选择,请激活Enable boot menu

要启动不同于引导设备上的内核的内核,请激活Enable direct kernel boot,并指定虚拟机主机服务器文件系统上的备用内核和 initrd 的路径。您还可以指定传递给已加载内核的内核参数。

13.2 存储 编辑源文件

本节详细介绍存储设备的配置选项。它包括硬盘和可移动媒体,例如 USB 或 CD-ROM 驱动器。

过程 13.1: 添加新存储设备
  1. 在左侧面板下方,单击 添加硬件 以打开 添加新虚拟硬件 窗口。在那里,选择 存储

    Add a new storage
    图 13.9: 添加新存储
  2. 要在默认位置创建 qcow2 磁盘映像,请激活 为虚拟机创建磁盘映像 并以 GB 为单位指定其大小。

    要获得对磁盘映像创建的更多控制,请激活 选择或创建自定义存储 并单击 管理 来管理存储池和映像。将打开 选择存储卷 窗口,其功能与 第 8.2.2 节,“使用虚拟机管理器管理存储” 中描述的 存储 选项卡几乎相同。

    Tip
    提示:支持的存储格式

    SUSE 仅支持以下存储格式: rawqcow2

  3. 创建并指定磁盘映像文件后,指定 设备类型。它可以是以下选项之一:

    • 磁盘设备

    • CDROM 设备:不允许使用 为虚拟机创建磁盘映像

    • 软盘驱动器设备:不允许使用 为虚拟机创建磁盘映像

    • LUN 直通:无需将其添加到存储池即可直接使用现有 SCSI 存储。

  4. 选择设备的 总线类型。可用选项列表取决于您在上一步中选择的设备类型。基于 VirtIO 的类型使用半虚拟化驱动程序。

  5. 高级选项 部分,选择首选的 缓存模式。有关缓存模式的更多信息,请参阅 第 16 章,“磁盘缓存模式”

  6. 使用 完成 确认您的设置。一个新的存储设备将出现在左侧面板中。

13.3 控制器 编辑源文件

本节重点介绍添加和配置新控制器。

过程 13.2: 添加新控制器
  1. 在左侧面板下方,单击 添加硬件 以打开 添加新虚拟硬件 窗口。在那里,选择 控制器

    Add a new controller
    图 13.10: 添加新控制器
  2. 选择控制器类型。您可以选择 IDE软盘SCSISATAVirtIO 串行(半虚拟化)、USBCCID(智能卡设备)。

  3. 可选地,对于 USB 或 SCSI 控制器,请选择一个控制器模型。

  4. 使用 完成 确认您的设置。一个新的控制器将出现在左侧面板中。

13.4 网络 编辑源文件

本节介绍如何添加和配置新网络设备。

过程 13.3: 添加新网络设备
  1. 在左侧面板下方,单击 添加硬件 以打开 添加新虚拟硬件 窗口。在那里,选择 网络

    Add a new network interface
    图 13.11: 添加新网络接口
  2. 网络源 列表中,选择网络连接的源。列表包括 VM 主机服务器可用的物理网络接口、网络桥接或网络绑定。您还可以将 VM 客户机分配给已定义的虚拟网络。有关使用虚拟机管理器设置虚拟网络的信息,请参阅 第 8.1 节,“配置网络”

  3. 为网络设备指定 MAC 地址。虽然虚拟机管理器会预填充一个随机值以方便您使用,但建议提供适合您的网络环境的 MAC 地址,以避免网络冲突。

  4. 从列表中选择一个设备模型。您可以保留 Hypervisor 默认,或指定 e1000rtl8139virtio 模型之一。virtio 使用半虚拟化驱动程序。

  5. 使用 完成 确认您的设置。一个新的网络设备将出现在左侧面板中。

13.5 输入设备 编辑源文件

本节重点介绍添加和配置新的输入设备,例如鼠标、键盘或触摸板。

过程 13.4: 添加新输入设备
  1. 在左侧面板下方,单击 添加硬件 以打开 添加新虚拟硬件 窗口。在那里,选择 输入

    Add a new input device
    图 13.12: 添加新输入设备
  2. 从列表中选择一个设备类型。

  3. 使用 完成 确认您的设置。一个新的输入设备将出现在左侧面板中。

Tip
提示:启用无缝同步的鼠标指针移动

当您在 VM 客户机控制台内单击鼠标时,指针将被控制台窗口捕获,除非明确释放(按 AltCtrl),否则无法在控制台外部使用。为了防止控制台抓取按键并启用主机和客户机之间的无缝指针移动,请按照 过程 13.4,“添加新输入设备” 中的说明将 EvTouch USB 图形平板电脑 添加到 VM 客户机。

添加触摸板还有一个额外的好处,即在使用客户机上的图形环境时,可以同步 VM 主机服务器和 VM 客户机之间的鼠标指针移动。如果没有在客户机上配置触摸板,您可能会经常看到两个指针,一个落后于另一个。

13.6 视频 编辑源文件

本节介绍如何添加和配置新视频设备。

过程 13.5: 添加视频设备
  1. 在左侧面板下方,单击 添加硬件 以打开 添加新虚拟硬件 窗口。在那里,选择 视频

  2. Add a new video device
    图 13.13: 添加新视频设备
  3. 从下拉框中选择一个模型。

    Note
    注意:次要视频设备

    只有 QXLVirtio 可以添加为次要视频设备。

  4. 使用 完成 确认您的设置。一个新的视频设备将出现在左侧面板中。

13.7 USB 重定向器 编辑源文件

通过使用 USB 重定向器,可以将会连接到客户端计算机的 USB 设备重定向到 VM 客户机。

过程 13.6: 添加 USB 重定向器
  1. 在左侧面板下方,单击 添加硬件 以打开 添加新虚拟硬件 窗口。在那里,选择 USB 重定向

    Add a new USB redirector
    图 13.14: 添加新 USB 重定向器
  2. 从列表中选择一个设备类型。根据您的配置,您可以选择 Spice 通道TCP 重定向器。

  3. 使用 完成 确认您的设置。一个新的 USB 重定向器将出现在左侧面板中。

13.8 其他 编辑源文件

智能卡

可以通过 智能卡 元素添加智能卡功能。然后可以将物理 USB 智能卡读卡器传递给 VM 客户机。

看门狗

虚拟看门狗设备也得到支持。它们可以通过 看门狗 元素创建。可以指定设备的模型和操作。

Tip
提示:虚拟看门狗设备的要求

QA 虚拟看门狗设备需要在 VM 客户机中安装特定的驱动程序和守护程序。否则,虚拟看门狗设备将无法工作。

TPM

您可以通过 TPM 元素添加 TPM 功能,在 VM 客户机中使用主机 TPM 设备。

Tip
提示:虚拟 TPM

主机 TPM 一次只能在一个 VM 客户机中使用。

13.9 使用虚拟机管理器添加 CD/DVD-ROM 设备 编辑源文件

KVM 支持 VM 客户机中的 CD 或 DVD-ROM,方法是直接访问 VM 主机服务器上的物理驱动器或访问 ISO 映像。要从现有的 CD 或 DVD 创建 ISO 映像,请使用 dd

> sudo dd if=/dev/CD_DVD_DEVICE of=my_distro.iso bs=2048

要将 CD/DVD-ROM 设备添加到 VM 客户机,请按以下步骤操作:

  1. 在虚拟机管理器中双击 VM 客户机条目以打开其控制台,然后通过 视图 › 详细信息 切换到 详细信息 视图。

  2. 单击 添加硬件,然后在弹出窗口中选择 存储

  3. 设备类型 更改为 IDE CDROM

  4. 选择 选择或创建自定义存储

    1. 要将设备分配给物理介质,请在 管理 旁边输入 VM 主机服务器的 CD/DVD-ROM 设备的路径(例如,/dev/cdrom)。或者,使用 管理 打开文件浏览器,然后单击 浏览本地 选择设备。仅当在 VM 主机服务器上启动虚拟机管理器时,才可能将设备分配给物理介质。

    2. 要将设备分配给现有映像,请单击 管理 从存储池中选择一个映像。如果虚拟机管理器是在 VM 主机服务器上启动的,则可以通过单击 浏览本地 选择文件系统上的另一个位置的映像。选择一个映像,然后使用 选择卷 关闭文件浏览器。

  5. 使用 完成 保存新的虚拟化设备。

  6. 重新启动 VM 客户机以使新设备可用。有关更多信息,请参阅 第 13.11 节,“使用虚拟机管理器弹出和更改软盘或 CD/DVD-ROM 媒体”

13.10 使用虚拟机管理器添加软盘设备 编辑源文件

目前,KVM 仅支持使用软盘映像——不支持使用物理软盘驱动器。使用 dd 从现有软盘创建软盘映像。

> sudo dd if=/dev/fd0 of=/var/lib/libvirt/images/floppy.img

要创建空的软盘映像,请使用以下命令之一:

原始映像
> sudo dd if=/dev/zero of=/var/lib/libvirt/images/floppy.img bs=512 count=2880
FAT 格式化映像
> sudo mkfs.msdos -C /var/lib/libvirt/images/floppy.img 1440

要将软盘设备添加到 VM 客户机,请按以下步骤操作:

  1. 在虚拟机管理器中双击 VM 客户机条目以打开其控制台,然后通过 视图 › 详细信息 切换到 详细信息 视图。

  2. 单击 添加硬件,然后在弹出窗口中选择 存储

  3. 设备类型 更改为 软盘驱动器

  4. 选择 选择或创建自定义存储 并单击 管理 从存储池中选择现有映像。如果虚拟机管理器是在 VM 主机服务器上启动的,则可以通过单击 浏览本地 选择文件系统上的另一个位置的映像。选择一个映像,然后使用 选择卷 关闭文件浏览器。

  5. 使用 完成 保存新的虚拟化设备。

  6. 重新启动 VM 客户机以使新设备可用。有关更多信息,请参阅 第 13.11 节,“使用虚拟机管理器弹出和更改软盘或 CD/DVD-ROM 媒体”

13.11 使用虚拟机管理器弹出和更改软盘或 CD/DVD-ROM 媒体 编辑源文件

无论您使用的是 VM 主机服务器的物理 CD/DVD-ROM 设备还是 ISO/软盘映像:在更改 VM 客户机中现有设备的媒体或映像之前,您需要先将媒体从客户机 断开连接

  1. 在虚拟机管理器中双击 VM 客户机条目以打开其控制台,然后通过 视图 › 详细信息 切换到 详细信息 视图。

  2. 选择软盘或 CD/DVD-ROM 设备,然后通过单击 断开连接 “弹出” 媒体。

  3. “插入” 新媒体,请单击 连接

    1. 如果使用的是 VM 主机服务器的物理 CD/DVD-ROM 设备,请先更改设备中的媒体(这可能需要先在 VM 主机服务器上卸载它,然后才能弹出)。然后选择 CD-ROM 或 DVD,并从下拉框中选择设备。

    2. 如果您使用的是 ISO 映像,请选择 ISO 映像位置,然后单击 管理 来选择一个映像。从远程主机连接时,您只能选择现有存储池中的映像。

  4. 单击 确定 完成。新媒体现在可以在 VM 客户机中访问。

13.12 将主机 PCI 设备分配给 VM 客户机 编辑源文件

您可以直接将主机 PCI 设备分配给客户机(PCI 直通)。当 PCI 设备分配给一个 VM 客户机时,除非重新分配,否则它不能在主机上或由另一个 VM 客户机使用。此功能的前提是 VM 主机服务器的配置如 重要:VFIO 和 SR-IOV 的要求 中所述。

13.12.1 使用虚拟机管理器添加 PCI 设备 编辑源文件

以下过程描述了如何使用虚拟机管理器将主机计算机上的 PCI 设备分配给 VM 客户机。

  1. 在虚拟机管理器中双击 VM 客户机条目以打开其控制台,然后通过 视图 › 详细信息 切换到 详细信息 视图。

  2. 单击 添加硬件,然后在左侧面板中选择 PCI 主机设备 类别。可用 PCI 设备列表将出现在窗口的右侧部分。

    Adding a PCI device
    图 13.15: 添加 PCI 设备
  3. 从可用 PCI 设备列表中,选择您要传递给客户机的设备。单击 完成 确认。

Important
重要:SLES 11 SP4 KVM 客户机

在较新的 QEMU 机器类型(pc-i440fx-2.0 或更高版本)上,使用 SLES 11 SP4 KVM guests 时,acpiphp 模块默认情况下不会在 guest 中加载。必须加载此模块才能启用磁盘和网络设备的 hotplugging。要手动加载该模块,请使用命令 modprobe acpiphp。也可以通过将 install acpiphp /bin/true 添加到 /etc/modprobe.conf.local 文件中来自动加载该模块。

Important
重要提示:使用 QEMU Q35 机器类型的 KVM guests

使用 QEMU Q35 机器类型的 KVM 客户机具有一个包含 pcie-root 控制器和七个 pcie-root-port 控制器的 PCI 拓扑。pcie-root 控制器不支持热插拔。每个 pcie-root-port 控制器支持热插拔单个 PCIe 设备。PCI 控制器不支持热插拔,因此请相应计划,并为超过七个热插拔 PCIe 设备添加更多 pcie-root-port。可以添加 pcie-to-pci-bridge 控制器来支持热插拔旧版 PCI 设备。有关 QEMU 机器类型之间 PCI 拓扑的更多信息,请参阅 https://libvirt.org/pci-hotplug.html

13.13 将主机 USB 设备分配给 VM 客户机 编辑源文件

与分配主机 PCI 设备(请参阅 第 13.12 节,“将主机 PCI 设备分配给 VM 客户机”)类似,您可以直接将主机 USB 设备分配给客户机。当 USB 设备分配给一个 VM 客户机时,除非重新分配,否则它不能在主机上或由另一个 VM 客户机使用。

13.13.1 使用虚拟机管理器添加 USB 设备 编辑源文件

要使用虚拟机管理器将主机 USB 设备分配给 VM 客户机,请执行以下步骤:

  1. 在虚拟机管理器中双击 VM 客户机条目以打开其控制台,然后通过 视图 › 详细信息 切换到 详细信息 视图。

  2. 单击 添加硬件,然后在左侧面板中选择 USB 主机设备 类别。可用 USB 设备列表将出现在窗口的右侧部分。

    Adding a USB device
    图 13.16: 添加 USB 设备
  3. 从可用 USB 设备列表中,选择您要传递给客户机的设备。单击 完成 确认。新的 USB 设备将出现在 详细信息 视图的左侧窗格中。

    Tip
    提示:USB 设备移除

    要删除主机 USB 设备分配,请在 详细信息 视图的左侧窗格中单击它,然后单击 移除 确认。

14 使用 virsh 配置虚拟机 编辑源文件

摘要

您可以使用 virsh 在命令行上配置虚拟机 (VM),作为使用 Virtual Machine Manager 的替代方法。使用 virsh,您可以控制 VM 的状态、编辑 VM 的配置,甚至将 VM 迁移到另一个主机。以下部分介绍如何使用 virsh 管理 VM。

14.1 编辑 VM 配置 编辑源文件

VM 的配置存储在 /etc/libvirt/qemu/ 中的 XML 文件中,看起来如下:

示例 14.1: 示例 XML 配置文件
<domain type='kvm'>
  <name>sles15</name>
  <uuid>ab953e2f-9d16-4955-bb43-1178230ee625</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-2.0'>hvm</type>
  </os>
  <features>...</features>
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>Skylake-Client-IBRS</model>
  </cpu>
  <clock>...</clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>...</disk>
  </devices>
  ...
</domain>

要编辑 VM 客户机的配置,请检查它是否已离线

> sudo virsh list --inactive

如果 VM 客户机在此列表中,您可以安全地编辑其配置。

> sudo virsh edit NAME_OF_VM_GUEST

保存更改之前,virsh 会根据 RelaxNG 架构验证您的输入。

14.2 更改机器类型 编辑源文件

使用 virt-install 工具进行安装时,VM 客户机的机器类型默认为 pc-q35。机器类型存储在 VM 客户机的配置文件中,位于 type 元素内。

<type arch='x86_64' machine='pc-q35-2.3'>hvm</type>

例如,以下过程演示了如何将此值更改为机器类型 q35。值 q35 是 Intel* 芯片组,包含 PCIe,支持多达 12 个 USB 端口,并支持 SATAIOMMU

过程 14.1: 更改机器类型
  1. 检查您的 VM 客户机是否不活跃

    > sudo virsh list --inactive
    Id    Name                           State
    ----------------------------------------------------
    -     sles15                         shut off
  2. 编辑此 VM 客户机的配置

    > sudo virsh edit sles15
  3. machine 属性的值替换为 pc-q35-2.0

    <type arch='x86_64' machine='pc-q35-2.0'>hvm</type>
  4. 重新启动 VM 客户机

    > sudo virsh start sles15
  5. 检查机器类型是否已更改。登录 VM 客户机并运行以下命令:

    > sudo dmidecode | grep Product
    Product Name: Standard PC (Q35 + ICH9, 2009)
Tip
提示:机器类型更新建议

每当主机系统上的 QEMU 版本升级时(例如,将 VM 主机服务器升级到新的服务包时),请将 VM 客户机的机器类型升级到最新可用版本。要进行检查,请在 VM 主机服务器上使用命令 qemu-system-x86_64 -M help

例如,默认机器类型 pc-i440fx 会定期更新。如果您的 VM 客户机仍运行 pc-i440fx-1.X 的机器类型,我们强烈建议更新到 pc-i440fx-2.X。这可以利用机器定义中的最新更新和更正,并确保更好的未来兼容性。

14.3 配置 Hypervisor 功能 编辑源文件

libvirt 会自动启用一组默认的 Hypervisor 功能,这些功能在大多数情况下都足够了,但也允许根据需要启用和禁用功能。例如,Xen 默认不支持启用 PCI 直通。必须使用 passthrough 设置启用它。可以使用 virsh 配置 Hypervisor 功能。查找 VM 客户机配置文件中的 <features> 元素,并根据需要调整其功能。继续 Xen 直通示例:

> sudo virsh edit sle15sp1
 <features>
    <xen>
      <passthrough/>
    </xen>
 </features>

保存更改并重新启动 VM 客户机。

有关更多信息,请参阅 libvirt Domain XML 格式 手册的 Hypervisor 功能 部分,网址为 https://libvirt.org/formatdomain.html#elementsFeatures

14.4 配置 CPU 编辑源文件

呈现给 VM 客户机的虚拟 CPU 的许多方面都可以使用 virsh 进行配置。可以更改分配给 VM 客户机的当前和最大 CPU 数量,以及 CPU 的模型及其功能集。以下子节描述了如何更改 VM 客户机的常用 CPU 设置。

14.4.1 配置 CPU 数量 编辑源文件

分配的 CPU 数量存储在 VM 客户机的 XML 配置文件中,位于 /etc/libvirt/qemu/,在 vcpu 元素中。

<vcpu placement='static'>1</vcpu>

在此示例中,VM 客户机只有一个分配的 CPU。以下过程演示了如何更改 VM 客户机的分配 CPU 数量:

  1. 检查您的 VM 客户机是否不活跃

    > sudo virsh list --inactive
    Id    Name                           State
    ----------------------------------------------------
    -     sles15                         shut off
  2. 编辑现有 VM 客户机的配置

    > sudo virsh edit sles15
  3. 更改分配的 CPU 数量

    <vcpu placement='static'>2</vcpu>
  4. 重新启动 VM 客户机

    > sudo virsh start sles15
  5. 检查 VM 中的 CPU 数量是否已更改。

    > sudo virsh vcpuinfo sled15
    VCPU:           0
    CPU:            N/A
    State:          N/A
    CPU time        N/A
    CPU Affinity:   yy
    
    VCPU:           1
    CPU:            N/A
    State:          N/A
    CPU time        N/A
    CPU Affinity:   yy

您也可以在 VM 客户机运行时更改 CPU 数量。CPU 可以热插拔,直到达到 VM 客户机启动时配置的最大数量。同样,它们可以热拔出,直到达到下限 1。以下示例显示了将活动 CPU 数量从 2 更改为预定义的 4。

  1. 检查当前的实时 vcpu 计数

    > sudo virsh vcpucount sles15 | grep live
    maximum      live           4
    current      live           2
  2. 将当前(活动)CPU 数量更改为 4

    > sudo virsh setvcpus sles15 --count 4 --live
  3. 检查当前的实时 vcpu 计数现在是否为 4

    > sudo virsh vcpucount sles15 | grep live
    maximum      live           4
    current      live           4
Important
重要:超过 255 个 CPU

使用 KVM,可以定义一个超过 255 个 CPU 的 VM 客户机。但是,需要额外的配置才能启动和运行 VM 客户机。需要调整 ioapic 功能,并向 VM 客户机添加 IOMMU 设备。下面是一个 288 个 CPU 的示例配置。

<domain>
 <vcpu placement='static'>288</vcpu>
 <features>
  <ioapic driver='qemu'/>
 </features>
 <devices>
  <iommu model='intel'>
   <driver intremap='on' eim='on'/>
  </iommu>
 </devices>
</domain>

14.4.2 配置 CPU 模型 编辑源文件

暴露给 VM 客户机的 CPU 模型通常会影响其内部运行的工作负载。默认 CPU 模型源自称为 host-model 的 CPU 模式。

<cpu mode='host-model'/>

当使用 host-model CPU 模式启动 VM 客户机时,libvirt 会将其主机 CPU 模型复制到 VM 客户机定义中。复制到 VM 客户机定义的 CPU 模型和功能可以在 virsh capabilities 的输出中观察到。

另一个有趣的 CPU 模式是 host-passthrough

<cpu mode='host-passthrough'/>

使用 host-passthrough CPU 模式启动 VM 客户机时,它将呈现一个与 VM 主机服务器 CPU 完全相同的 CPU。当 VM 客户机工作负载需要 libvirt 简化的 host-model CPU 中不存在的功能时,这可能很有用。host-passthrough CPU 模式的缺点是迁移灵活性降低。具有 host-passthrough CPU 模式的 VM 客户机只能迁移到具有相同硬件的 VM 主机服务器。

使用 host-passthrough CPU 模式时,仍然可以禁用不需要的功能。以下配置将 VM 客户机呈现一个与主机 CPU 完全相同的 CPU,但 vmx 功能被禁用。

<cpu mode='host-passthrough'>
  <feature policy='disable' name='vmx'/>
  </cpu>

custom CPU 模式是另一个常用模式,用于定义一个可以在集群中不同主机之间迁移的标准化 CPU。例如,在包含 Nehalem、IvyBridge 和 SandyBridge CPU 的主机组成的集群中,VM 客户机可以配置为使用 custom CPU 模式,该模式包含 Nehalem CPU 模型。

<cpu mode='custom' match='exact'>
  <model fallback='allow'>Nehalem</model>
  <feature policy='require' name='vme'/>
  <feature policy='require' name='ds'/>
  <feature policy='require' name='acpi'/>
  <feature policy='require' name='ss'/>
  <feature policy='require' name='ht'/>
  <feature policy='require' name='tm'/>
  <feature policy='require' name='pbe'/>
  <feature policy='require' name='dtes64'/>
  <feature policy='require' name='monitor'/>
  <feature policy='require' name='ds_cpl'/>
  <feature policy='require' name='vmx'/>
  <feature policy='require' name='est'/>
  <feature policy='require' name='tm2'/>
  <feature policy='require' name='xtpr'/>
  <feature policy='require' name='pdcm'/>
  <feature policy='require' name='dca'/>
  <feature policy='require' name='rdtscp'/>
  <feature policy='require' name='invtsc'/>
  </cpu>

有关 libvirt 的 CPU 模型和拓扑选项的更多信息,请参阅网址为 https://libvirt.org/formatdomain.html#cpu-model-and-topologyCPU 模型和拓扑 文档。

14.5 更改启动选项 编辑源文件

VM 客户机的启动菜单可以在 os 元素中找到,看起来与此示例类似:

<os>
  <type>hvm</type>
  <loader>readonly='yes' secure='no' type='rom'/>/usr/lib/xen/boot/hvmloader</loader>
  <nvram template='/usr/share/OVMF/OVMF_VARS.fd'/>/var/lib/libvirt/nvram/guest_VARS.fd</nvram>
  <boot dev='hd'/>
  <boot dev='cdrom'/>
  <bootmenu enable='yes' timeout='3000'/>
  <smbios mode='sysinfo'/>
  <bios useserial='yes' rebootTimeout='0'/>
  </os>

在此示例中,有两个可用设备:hdcdrom。配置也反映了实际的启动顺序,因此 hdcdrom 之前。

14.5.1 更改启动顺序 编辑源文件

VM 客户机的启动顺序通过 XML 配置文件中设备的顺序来表示。由于设备是可互换的,因此可以更改 VM 客户机的启动顺序。

  1. 打开 VM 客户机的 XML 配置。

    > sudo virsh edit sles15
  2. 更改可启动设备的顺序。

    ...
    <boot dev='cdrom'/>
    <boot dev='hd'/>
    ...
  3. 通过查看 VM 客户机的 BIOS 中的启动菜单来检查启动顺序是否已成功更改。

14.5.2 使用直接内核启动 编辑源文件

直接内核启动允许您从存储在主机上的内核和 initrd 启动。在 kernelinitrd 元素中设置这两个文件的路径。

<os>
    ...
  <kernel>/root/f8-i386-vmlinuz</kernel>
  <initrd>/root/f8-i386-initrd</initrd>
    ...
<os>

启用直接内核启动

  1. 打开 VM 客户机的 XML 配置。

    > sudo virsh edit sles15
  2. os 元素内部,添加一个 kernel 元素以及主机上内核文件的路径。

    ...
    <kernel>/root/f8-i386-vmlinuz</kernel>
    ...
  3. 添加一个 initrd 元素以及主机上 initrd 文件的路径。

    ...
    <initrd>/root/f8-i386-initrd</initrd>
    ...
  4. 启动您的 VM 以从新内核启动。

    > sudo virsh start sles15

14.6 配置内存分配 编辑源文件

分配给 VM 客户机的内存量也可以使用 virsh 进行配置。它存储在 memory 元素中,并定义 VM 客户机启动时的最大内存分配。currentMemory 元素定义实际分配给 VM 客户机的内存。currentMemory 可以小于 memory,允许在 VM 客户机运行时增加(或 气球化)内存。如果省略 currentMemory,则默认为与 memory 元素相同的值。

您可以通过编辑 VM 客户机配置来调整内存设置,但请注意,更改在下次启动之前不会生效。以下步骤演示了如何将 VM 客户机更改为使用 4G 内存启动,但允许稍后扩展到 8G:

  1. 打开 VM 客户机的 XML 配置。

    > sudo virsh edit sles15
  2. 搜索 memory 元素并将其设置为 8G。

    ...
    <memory unit='KiB'>8388608</memory>
    ...
  3. 如果 currentMemory 元素不存在,请在 memory 元素下方添加它,或将其值更改为 4G。

    [...]
    <memory unit='KiB'>8388608</memory>
    <currentMemory unit='KiB'>4194304</currentMemory>
    [...]

在 VM 客户机运行时更改内存分配可以使用 setmem 子命令完成。以下示例显示了将内存分配增加到 8G:

  1. 检查 VM 客户机现有内存设置

    > sudo virsh dominfo sles15 | grep memory
    Max memory:     8388608 KiB
    Used memory:    4194608 KiB
  2. 将使用的内存更改为 8G

    > sudo virsh setmem sles15 8388608
  3. 检查更新后的内存设置

    > sudo virsh dominfo sles15 | grep memory
    Max memory:     8388608 KiB
    Used memory:    8388608 KiB
Important
重要:大型内存 VM Guest

需要 4 TB 或更多内存的 VM 客户机必须使用 host-passthrough CPU 模式,或在使用 host-modelcustom CPU 模式时显式指定虚拟 CPU 地址大小。默认虚拟 CPU 地址大小可能不足以支持 4 TB 或更多的内存配置。以下示例显示了在使用 host-model CPU 模式时如何使用 VM 主机服务器的物理 CPU 地址大小。

[...]
<cpu mode='host-model' check='partial'>
<maxphysaddr mode='passthrough'>
</cpu>
[...]

有关指定虚拟 CPU 地址大小的更多信息,请参阅 libvirt CPU 模型和拓扑 文档中的 maxphysaddr 选项,网址为 https://libvirt.org/formatdomain.html#cpu-model-and-topology

14.7 添加 PCI 设备 编辑源文件

要使用 virsh 将 PCI 设备分配给 VM 客户机,请执行以下步骤:

  1. 确定要分配给 VM 客户机的主机 PCI 设备。在以下示例中,我们将一个 DEC 网卡分配给客户机。

    > sudo lspci -nn
    [...]
    03:07.0 Ethernet controller [0200]: Digital Equipment Corporation DECchip \
    21140 [FasterNet] [1011:0009] (rev 22)
    [...]

    记下设备 ID(本例中为 03:07.0)。

  2. 使用 virsh nodedev-dumpxml ID 收集有关设备的详细信息。要获取 ID,请将设备 ID(03:07.0)中的冒号和句点替换为下划线。将结果加上前缀 pci_0000_pci_0000_03_07_0

    > sudo virsh nodedev-dumpxml pci_0000_03_07_0
    <device>
      <name>pci_0000_03_07_0</name>
      <path>/sys/devices/pci0000:00/0000:00:14.4/0000:03:07.0</path>
      <parent>pci_0000_00_14_4</parent>
      <driver>
        <name>tulip</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>3</bus>
        <slot>7</slot>
        <function>0</function>
        <product id='0x0009'>DECchip 21140 [FasterNet]</product>
        <vendor id='0x1011'>Digital Equipment Corporation</vendor>
        <numa node='0'/>
      </capability>
    </device>

    记下 domain、bus 和 function 的值(请参阅前面用粗体显示的 XML 代码)。

  3. 在将设备附加到 VM 客户机之前,将其从主机系统分离。

    > sudo virsh nodedev-detach pci_0000_03_07_0
      Device pci_0000_03_07_0 detached
    Tip
    提示:多功能 PCI 设备

    当使用不支持 FLR(功能级别重置)或 PM(电源管理)重置的多功能 PCI 设备时,需要将该设备的所有功能从 VM 主机服务器分离。出于安全原因,必须重置整个设备。libvirt 会拒绝分配设备,如果其某个功能仍被 VM 主机服务器或其他 VM 客户机使用。

  4. 将 domain、bus、slot 和 function 值从十进制转换为十六进制。在我们的示例中,domain = 0,bus = 3,slot = 7,function = 0。确保值以正确的顺序插入。

    > printf "<address domain='0x%x' bus='0x%x' slot='0x%x' function='0x%x'/>\n" 0 3 7 0

    这将导致:

    <address domain='0x0' bus='0x3' slot='0x7' function='0x0'/>
  5. 在您的域上运行 virsh edit,并在 <devices> 部分中添加以下设备条目,使用上一步的结果:

    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address domain='0x0' bus='0x03' slot='0x07' function='0x0'/>
      </source>
    </hostdev>
    Tip
    提示:managedunmanaged

    libvirt 识别两种处理 PCI 设备的方式:它们可以是 managed(托管)或 unmanaged(非托管)。在托管情况下,libvirt 会处理所有详细信息,例如在启动域之前,如果需要,则从现有驱动程序中解除绑定设备、重置设备、将其绑定到 vfio-pci 等。当域终止或设备从域中移除时,libvirt 会从 vfio-pci 解除绑定,并在托管设备的情况下重新绑定到原始驱动程序。如果设备是非托管的,用户必须确保在将其分配给域之前以及在设备不再被域使用之后,完成所有这些设备的管理方面的工作。

    在上面的示例中,managed='yes' 选项表示该设备是托管的。要将设备模式切换为非托管,请在上面的列表中设置 managed='no'。如果这样做,您需要使用 virsh nodedev-detachvirsh nodedev-reattach 命令来处理相关的驱动程序。在启动 VM 客户机之前,需要通过运行 virsh nodedev-detach pci_0000_03_07_0 将设备从主机分离。如果 VM 客户机未运行,则可以通过运行 virsh nodedev-reattach pci_0000_03_07_0 使设备对主机可用。

  6. 关闭 VM 客户机,如果主机上运行了 SELinux,则禁用它。

    > sudo setsebool -P virt_use_sysfs 1
  7. 启动您的 VM 客户机以使分配的 PCI 设备可用。

    > sudo virsh start sles15
Important
重要:SLES11 SP4 KVM 客户机

在较新的 QEMU 机器类型(pc-i440fx-2.0 或更高版本)上,使用 SLES 11 SP4 KVM guests 时,acpiphp 模块默认情况下不会在 guest 中加载。必须加载此模块才能启用磁盘和网络设备的 hotplugging。要手动加载该模块,请使用命令 modprobe acpiphp。也可以通过将 install acpiphp /bin/true 添加到 /etc/modprobe.conf.local 文件中来自动加载该模块。

Important
重要提示:使用 QEMU Q35 机器类型的 KVM guests

使用 QEMU Q35 机器类型的 KVM 客户机具有一个包含 pcie-root 控制器和七个 pcie-root-port 控制器的 PCI 拓扑。pcie-root 控制器不支持热插拔。每个 pcie-root-port 控制器支持热插拔单个 PCIe 设备。PCI 控制器不支持热插拔,因此请相应计划,并为热插拔更多 PCIe 设备添加更多 pcie-root-port。可以添加 pcie-to-pci-bridge 控制器来支持热插拔旧版 PCI 设备。有关 QEMU 机器类型之间 PCI 拓扑的更多信息,请参阅 https://libvirt.org/pci-hotplug.html

14.7.1 IBM Z 的 PCI 直通 编辑源文件

为了支持 IBM Z,QEMU 扩展了 PCI 表示,允许用户配置额外属性。在 <zpci/> libvirt 规范中添加了两个新属性——uidfiduid 表示用户定义的标识符,而 fid 表示 PCI 功能标识符。这些属性是可选的,如果您不指定它们,它们将以非冲突值自动生成。

要将 zPCI 属性包含在域规范中,请使用以下示例定义:

<controller type='pci' index='0' model='pci-root'/>
<controller type='pci' index='1' model='pci-bridge'>
  <model name='pci-bridge'/>
  <target chassisNr='1'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'>
    <zpci uid='0x0001' fid='0x00000000'/>
  </address>
</controller>
<interface type='bridge'>
  <source bridge='virbr0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x01' slot='0x01' function='0x0'>
    <zpci uid='0x0007' fid='0x00000003'/>
  </address>
</interface>

14.8 添加 USB 设备 编辑源文件

要使用 virsh 将 USB 设备分配给 VM 客户机,请执行以下步骤:

  1. 确定要分配给 VM 客户机的主机 USB 设备。

    > sudo lsusb
    [...]
    Bus 001 Device 003: ID 0557:2221 ATEN International Co., Ltd Winbond Hermon
    [...]

    记下供应商 ID和产品 ID。在我们的示例中,供应商 ID 是 0557,产品 ID 是 2221

  2. 在您的域上运行 virsh edit,并在 <devices> 部分中添加以下设备条目,使用上一步中的值:

    <hostdev mode='subsystem' type='usb'>
      <source startupPolicy='optional'>
       <vendor id='0557'/>
       <product id='2221'/>
      </source>
    </hostdev>
    Tip
    提示:供应商/产品或设备地址

    除了使用 <vendor/><product/> ID 来定义主机设备之外,您还可以使用 <address/> 元素,如 第 14.7 节,“添加 PCI 设备” 中关于主机 PCI 设备所述。

  3. 关闭 VM 客户机,如果主机上运行了 SELinux,则禁用它。

    > sudo setsebool -P virt_use_sysfs 1
  4. 启动您的 VM 客户机以使分配的 PCI 设备可用。

    > sudo virsh start sles15

14.9 添加 SR-IOV 设备 编辑源文件

支持 SR-IOVPCIe 设备可以复制其资源,因此它们显示为多个设备。这些“伪设备”中的每一个都可以分配给 VM 客户机。

SR-IOV 是由 Peripheral Component Interconnect Special Interest Group (PCI-SIG) 联盟创建的行业规范。它引入了物理功能(PF)和虚拟功能(VF)。PF 是用于管理和配置设备的完整 PCIe 功能。PF 也可以移动数据。VF 缺乏配置和管理部分——它们只能移动数据和一组有限的配置功能。由于 VF 不具有所有 PCIe 功能,因此主机操作系统或 Hypervisor 必须支持 SR-IOV 才能访问和初始化 VF。VF 的理论最大值为每个设备 256 个(因此双端口以太网卡的数量将是 512)。实际上,此最大值要低得多,因为每个 VF 都会消耗资源。

14.9.1 要求 编辑源文件

使用 SR-IOV 必须满足以下要求:

  • 支持 SR-IOV 的网卡(截至 ,只有网卡支持 SR-IOV

  • 支持硬件虚拟化的 AMD64/Intel 64 主机(AMD-V 或 Intel VT-x)

  • 支持设备分配的芯片组(AMD-Vi 或 Intel VT-d

  • libvirt 0.9.10 或更高版本

  • 必须在主机系统上加载和配置 SR-IOV 驱动程序。

  • 满足 重要:VFIO 和 SR-IOV 的要求 中列出的要求的宿主配置。

  • 分配给 VM 客户机的 VF 的 PCI 地址列表。

Tip
提示:检查设备是否支持 SR-IOV

可以通过运行 lspci 从设备的 PCI 描述符获取设备是否支持 SR-IOV 的信息。支持 SR-IOV 的设备会报告类似以下内容的硬件能力:

Capabilities: [160 v1] Single Root I/O Virtualization (SR-IOV)
Note
注意:在 VM 客户机创建时添加 SR-IOV 设备

在最初设置 VM 客户机并添加 SR-IOV 设备之前,VM 主机服务器需要已按照 第 14.9.2 节,“加载和配置 SR-IOV 主机驱动程序” 中的描述进行配置。

14.9.2 加载和配置 SR-IOV 主机驱动程序 编辑源文件

为了访问和初始化 VF,需要在主机系统上加载支持 SR-IOV 的驱动程序。

  1. 在加载驱动程序之前,请通过运行 lspci 确保卡已正确检测到。以下示例显示了双端口 Intel 82576NS 网卡的 lspci 输出:

    > sudo /sbin/lspci | grep 82576
    01:00.0 Ethernet controller: Intel Corporation 82576NS Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576NS Gigabit Network Connection (rev 01)
    04:00.0 Ethernet controller: Intel Corporation 82576NS Gigabit Network Connection (rev 01)
    04:00.1 Ethernet controller: Intel Corporation 82576NS Gigabit Network Connection (rev 01)

    如果卡未检测到,BIOS/EFI 中的硬件虚拟化支持可能未启用。要检查硬件虚拟化支持是否已启用,请查看主机 BIOS 中的设置。

  2. 通过运行 lsmod 检查 SR-IOV 驱动程序是否已加载。在以下示例中,对 igb 驱动程序(用于 Intel 82576NS 网卡)的检查返回了结果。这意味着驱动程序已加载。如果命令返回为空,则驱动程序未加载。

    > sudo /sbin/lsmod | egrep "^igb "
    igb                   185649  0
  3. 如果驱动程序已加载,请跳过以下步骤。如果 SR-IOV 驱动程序尚未加载,则需要在加载新驱动程序之前先移除非 SR-IOV 驱动程序。使用 rmmod 卸载驱动程序。以下示例卸载了 Intel 82576NS 网卡的非 SR-IOV 驱动程序:

    > sudo /sbin/rmmod igbvf
  4. 随后使用 modprobe 命令加载 SR-IOV 驱动程序——VF 参数(max_vfs)是必需的:

    > sudo /sbin/modprobe igb max_vfs=8

或者,您也可以通过 SYSFS 加载驱动程序:

  1. 通过列出以太网设备来查找物理 NIC 的 PCI ID。

    > sudo lspci | grep Eth
    06:00.0 Ethernet controller: Emulex Corporation OneConnect NIC (Skyhawk) (rev 10)
    06:00.1 Ethernet controller: Emulex Corporation OneConnect NIC (Skyhawk) (rev 10)
  2. 要启用 VF,请将要加载的所需 VF 数量 echo 到 sriov_numvfs 参数中。

    > sudo echo 1 > /sys/bus/pci/devices/0000:06:00.1/sriov_numvfs
  3. 验证 VF NIC 是否已加载。

    > sudo lspci | grep Eth
    06:00.0 Ethernet controller: Emulex Corporation OneConnect NIC (Skyhawk) (rev 10)
    06:00.1 Ethernet controller: Emulex Corporation OneConnect NIC (Skyhawk) (rev 10)
    06:08.0 Ethernet controller: Emulex Corporation OneConnect NIC (Skyhawk) (rev 10)
  4. 获取可用的最大 VF 数量。

    > sudo lspci -vvv -s 06:00.1 | grep 'Initial VFs'
                           Initial VFs: 32, Total VFs: 32, Number of VFs: 0,
    Function Dependency Link: 01
  5. 创建一个 /etc/systemd/system/before.service 文件,该文件在启动时通过 SYSFS 加载 VF。

    [Unit]
    Before=
    [Service]
    Type=oneshot
    RemainAfterExit=true
    ExecStart=/bin/bash -c "echo 1 > /sys/bus/pci/devices/0000:06:00.1/sriov_numvfs"
    # beware, executable is run directly, not through a shell, check the man pages
    # systemd.service and systemd.unit for full syntax
    [Install]
    # target in which to start the service
    WantedBy=multi-user.target
    #WantedBy=graphical.target
  6. 在启动 VM 之前,需要创建另一个指向 /etc/init.d/after.local 脚本的 after-local.service 文件,该脚本会分离 NIC。否则 VM 将无法启动。

    [Unit]
    Description=/etc/init.d/after.local Compatibility
    After=libvirtd.service
    Requires=libvirtd.service
    [Service]
    Type=oneshot
    ExecStart=/etc/init.d/after.local
    RemainAfterExit=true
    
    [Install]
    WantedBy=multi-user.target
  7. 将其复制到 /etc/systemd/system

    #! /bin/sh
    # ...
    virsh nodedev-detach pci_0000_06_08_0

    将其保存为 /etc/init.d/after.local

  8. 重新启动计算机,并通过重新运行此过程第一步中的 lspci 命令来检查 SR-IOV 驱动程序是否已加载。如果 SR-IOV 驱动程序已成功加载,您应该会看到 VF 的附加行。

    01:00.0 Ethernet controller: Intel Corporation 82576NS Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576NS Gigabit Network Connection (rev 01)
    01:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    01:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    01:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    [...]
    04:00.0 Ethernet controller: Intel Corporation 82576NS Gigabit Network Connection (rev 01)
    04:00.1 Ethernet controller: Intel Corporation 82576NS Gigabit Network Connection (rev 01)
    04:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    04:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    04:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    [...]

14.9.3 向 VM 客户机添加 VF 网络设备 编辑源文件

当 VM 主机服务器上正确设置了 SR-IOV 硬件后,您可以将 VF 添加到 VM 客户机。为此,您需要先收集特定数据。

过程 14.2: 向现有 VM 客户机添加 VF 网络设备

以下过程使用示例数据。请用您设置中的相应数据替换它。

  1. 使用 virsh nodedev-list 命令获取要分配的 VF 及其对应的 PF 的 PCI 地址。lspci 输出中的数字值(在 第 14.9.2 节,“加载和配置 SR-IOV 主机驱动程序” 中显示,例如 01:00.004:00.1)通过添加前缀 pci_0000_ 并将冒号和点替换为下划线来转换。因此,由 lspci 列出的 PCI ID 04:00.0,在 virsh 中列为 pci_0000_04_00_0。以下示例列出了 Intel 82576NS 网卡第二个端口的 PCI ID:

    > sudo virsh nodedev-list | grep 0000_04_
    pci_0000_04_00_0
    pci_0000_04_00_1
    pci_0000_04_10_0
    pci_0000_04_10_1
    pci_0000_04_10_2
    pci_0000_04_10_3
    pci_0000_04_10_4
    pci_0000_04_10_5
    pci_0000_04_10_6
    pci_0000_04_10_7
    pci_0000_04_11_0
    pci_0000_04_11_1
    pci_0000_04_11_2
    pci_0000_04_11_3
    pci_0000_04_11_4
    pci_0000_04_11_5

    前两个条目代表 PF,而其他条目代表 VF。

  2. 对要添加的 VF 的 PCI ID 运行以下 virsh nodedev-dumpxml 命令:

    > sudo virsh nodedev-dumpxml pci_0000_04_10_0
    <device>
      <name>pci_0000_04_10_0</name>
      <parent>pci_0000_00_02_0</parent>
      <capability type='pci'>
        <domain>0</domain>
        <bus>4</bus>
        <slot>16</slot>
        <function>0</function>
        <product id='0x10ca'>82576 Virtual Function</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <capability type='phys_function'>
          <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
        </capability>
      </capability>
    </device>

    下一步需要以下数据:

    • <domain>0</domain>

    • <bus>4</bus>

    • <slot>16</slot>

    • <function>0</function>

  3. 创建一个临时 XML 文件(例如 /tmp/vf-interface.xml),其中包含将 VF 网络设备添加到现有 VM 客户机所需的数据。文件的最小内容需要如下所示:

    <interface type='hostdev'>1
     <source>
      <address type='pci' domain='0' bus='11' slot='16' function='0'2/>2
     </source>
    </interface>

    1

    VF 没有固定的 MAC 地址;每次主机重启时都会更改。当以“传统”方式使用 hostdev 添加网络设备时,由于 MAC 地址更改,每次主机重启后都需要重新配置 VM 客户机的网络设备。为了避免此类问题,libvirt 引入了 hostdev 值,该值在分配设备 之前 设置特定于网络的数据。

    2

    在此处指定您在上一步中获取的数据。

  4. 如果设备已附加到主机,则无法将其附加到 VM 客户机。为了使其可供客户机使用,请先将其从主机分离:

    > sudo virsh nodedev-detach pci_0000_04_10_0
  5. 将 VF 接口添加到现有 VM 客户机:

    > sudo virsh attach-device GUEST /tmp/vf-interface.xml --OPTION

    GUEST 需要替换为 VM 客户机的域名、ID 或 UUID。--OPTION 可以是以下之一:

    --persistent

    此选项始终将设备添加到域的持久 XML。如果域正在运行,则设备会被热插拔。

    --config

    此选项仅影响持久 XML,即使域正在运行。设备将在下次启动时出现在 VM 客户机中。

    --live

    此选项仅影响正在运行的域。如果域不活跃,则操作将失败。设备不会持久化到 XML 中,并在下次启动时在 VM 客户机中可用。

    --current

    此选项影响域的当前状态。如果域不活跃,则设备会添加到持久 XML,并在下次启动时可用。如果域处于活动状态,则设备会被热插拔,但不会添加到持久 XML 中。

  6. 要分离 VF 接口,请使用 virsh detach-device 命令,该命令也接受上述选项。

14.9.4 从池中动态分配 VF 编辑源文件

如果您在 VM 客户机的配置中静态定义了 VF 的 PCI 地址(如 第 14.9.3 节,“向 VM 客户机添加 VF 网络设备” 中所述),则很难将此类客户机迁移到另一台主机。主机必须具有相同位置的相同硬件,或者必须在每次启动之前修改 VM 客户机的配置。

另一种方法是创建一个 libvirt 网络,其中包含一个设备池,该池包含 SR-IOV 设备的所有 VF。然后,VM 客户机引用该网络,每次启动时,都会动态为其分配一个 VF。当 VM 客户机停止时,VF 将返回到池中,可供另一个客户机使用。

14.9.4.1 在 VM 主机服务器上定义具有 VF 池的网络 编辑源文件

以下网络定义示例创建了一个池,其中包含主机上网络接口 eth0SR-IOV 设备的所有 VF:

<network>
  <name>passthrough</name>
    <forward mode='hostdev' managed='yes'>
      <pf dev='eth0'/>
    </forward>
  </network>

要使用主机上的此网络,请将上述代码保存到文件(例如 /tmp/passthrough.xml),然后执行以下命令。请记住将 eth0 替换为 SR-IOV 设备 PF 的实际网络接口名称:

> sudo virsh net-define /tmp/passthrough.xml
> sudo virsh net-autostart passthrough
> sudo virsh net-start passthrough

14.9.4.2 配置 VM 客户机以使用池中的 VF 编辑源文件

以下 VM 客户机设备接口定义示例使用了 第 14.9.4.1 节,“在 VM 主机服务器上定义具有 VF 池的网络” 中创建的池中的 SR-IOV 设备的 VF。libvirt 会在首次启动使用具有 VF 池的网络 mà 客户机时自动派生与该 PF 相关的所有 VF 的列表。

<interface type='network'>
  <source network='passthrough'>
</interface>

在第一个 VM 客户机启动并使用具有 VF 池的网络后,请验证相关 VF 的列表。请在主机上运行 virsh net-dumpxml passthrough 来执行此操作。

<network connections='1'>
  <name>passthrough</name>
  <uuid>a6a26429-d483-d4ed-3465-4436ac786437</uuid>
  <forward mode='hostdev' managed='yes'>
    <pf dev='eth0'/>
    <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/>
    <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x3'/>
    <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x5'/>
    <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x7'/>
    <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x1'/>
    <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x3'/>
    <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x5'/>
  </forward>
  </network>

14.10 列出已连接的设备 编辑源文件

虽然 virsh 中没有机制可以列出已连接到其 VM 客户机的所有 VM 主机服务器设备,但您可以通过运行以下命令来列出已连接到特定 VM 客户机的设备:

virsh dumpxml VMGUEST_NAME | xpath -e /domain/devices/hostdev

例如

> sudo virsh dumpxml sles12 | -e xpath /domain/devices/hostdev
Found 2 nodes:
-- NODE --
<hostdev mode="subsystem" type="pci" managed="yes">
  <driver name="xen" />
  <source>
    <address domain="0x0000" bus="0x0a" slot="0x10" function="0x1" />
  </source>
  <address type="pci" domain="0x0000" bus="0x00" slot="0x0a" function="0x0" />
  </hostdev>
-- NODE --
<hostdev mode="subsystem" type="pci" managed="yes">
  <driver name="xen" />
  <source>
    <address domain="0x0000" bus="0x0a" slot="0x10" function="0x2" />
  </source>
  <address type="pci" domain="0x0000" bus="0x00" slot="0x0b" function="0x0" />
</hostdev>
Tip
提示:列出通过 <interface type='hostdev'> 连接的 SR-IOV 设备

对于通过 <interface type='hostdev'> 连接到 VM 主机服务器的 SR-IOV 设备,您需要使用不同的 XPath 查询:

virsh dumpxml VMGUEST_NAME | xpath -e /domain/devices/interface/@type

14.11 配置存储设备 编辑源文件

存储设备在 disk 元素中定义。标准的 disk 元素支持多个属性。以下两个属性最重要:

  • type 属性描述了虚拟磁盘设备的来源。有效值为 fileblockdirnetworkvolume

  • device 属性显示磁盘如何暴露给 VM 客户机 OS。例如,可能的值包括 floppydiskcdrom 等。

以下子元素是最重要的

  • driver 包含驱动程序和总线。VM Guest 使用它们来处理新的磁盘设备。

  • target 元素包含新磁盘在 VM Guest 中显示的设备名称。它还包含可选的 bus 属性,该属性定义了新磁盘应在其上运行的总线类型。

以下过程显示了如何向 VM Guest 添加存储设备

  1. 编辑现有 VM 客户机的配置

    > sudo virsh edit sles15
  2. disk 元素内添加一个 disk 元素,并附带 typedevice 属性

    <disk type='file' device='disk'>
  3. 指定一个 driver 元素并使用默认值

    <driver name='qemu' type='qcow2'/>
  4. 创建磁盘映像作为新虚拟磁盘设备的源

    > sudo qemu-img create -f qcow2 /var/lib/libvirt/images/sles15.qcow2 32G
  5. 添加磁盘源的路径

    <source file='/var/lib/libvirt/images/sles15.qcow2'/>
  6. 定义 VM Guest 中的目标设备名称以及磁盘应在其上运行的总线

    <target dev='vda' bus='virtio'/>
  7. 重启您的 VM

    > sudo virsh start sles15

您的新存储设备应在 VM Guest OS 中可用。

14.12 配置控制器设备 编辑源文件

libvirt 根据 VM Guest 使用的虚拟设备类型自动管理控制器。如果 VM Guest 包含 PCI 和 SCSI 设备,则会自动创建和管理 PCI 和 SCSI 控制器。libvirt 还模拟特定于管理程序的控制器,例如,KVM VM Guest 的 virtio-serial 控制器或 Xen VM Guest 的 xenbus 控制器。尽管默认控制器及其配置通常没问题,但在某些用例中可能需要手动调整控制器或其属性。例如,virtio-serial 控制器可能需要更多端口,或者 xenbus 控制器可能需要更多内存或更多虚拟中断。

xenbus 控制器是独一无二的,它充当所有 Xen 半虚拟化设备的控制器。如果 VM Guest 具有许多磁盘和/或网络设备,控制器可能需要更多内存。Xen 的 max_grant_frames 属性设置了为每个 VM Guest 分配给 xenbus 控制器的授予帧(或共享内存块)的数量。

在大多数情况下,32 的默认值已足够,但具有大量 I/O 设备和 I/O 密集型工作负载的 VM Guest 可能会因授予帧耗尽而遇到性能问题。xen-diag 可以检查 dom0 和您的 VM Guest 的当前和最大 max_grant_frames 值。VM Guest 必须正在运行

> sudo virsh list
 Id   Name             State
--------------------------------
 0    Domain-0         running
 3    sle15sp1         running

 > sudo xen-diag gnttab_query_size 0
domid=0: nr_frames=1, max_nr_frames=256

> sudo xen-diag gnttab_query_size 3
domid=3: nr_frames=3, max_nr_frames=32

sle15sp1 客户机仅使用了 32 个帧中的 3 个。如果您遇到性能问题,并且日志条目指向帧不足,请使用 virsh 增加该值。在客户机的配置文件中查找 <controller type='xenbus'> 行,并添加 maxGrantFrames 控制元素

> sudo virsh edit sle15sp1
 <controller type='xenbus' index='0' maxGrantFrames='40'/>

保存您的更改并重启客户机。现在应该会显示您的更改

> sudo xen-diag gnttab_query_size 3
domid=3: nr_frames=3, max_nr_frames=40

与 maxGrantFrames 类似,xenbus 控制器也支持 maxEventChannels。事件通道类似于半虚拟化中断,并且与授予帧一起,构成了半虚拟化驱动程序的数据传输机制。它们也用于进程间中断。具有大量 vCPU 和/或许多半虚拟化设备的 VM Guest 可能需要增加 1023 的最大默认值。maxEventChannels 的更改方式类似于 maxGrantFrames

> sudo virsh edit sle15sp1
 <controller type='xenbus' index='0' maxGrantFrames='128' maxEventChannels='2047'/>

有关更多信息,请参阅 libvirt Domain XML format 手册的 Controllers 部分,网址为 https://libvirt.org/formatdomain.html#elementsControllers

14.13 配置视频设备 编辑源文件

在使用 Virtual Machine Manager 时,只能定义视频设备模型。已分配的 VRAM 量或 2D/3D 加速量只能在 XML 配置中更改。

14.13.1 更改已分配 VRAM 的量 编辑源文件

  1. 编辑现有 VM 客户机的配置

    > sudo virsh edit sles15
  2. 更改已分配 VRAM 的大小

    <video>
    <model type='vga' vram='65535' heads='1'>
    ...
    </model>
    </video>
  3. 通过查看 Virtual Machine Manager 中的 VRAM 量来检查 VM 中的 VRAM 量是否已更改。

14.13.2 更改 2D/3D 加速的状态 编辑源文件

  1. 编辑现有 VM 客户机的配置

    > sudo virsh edit sles15
  2. 要启用/禁用 2D/3D 加速,请相应地更改 accel3daccel2d 的值

    <video>
     <model>
      <acceleration accel3d='yes' accel2d='no'>
     </model>
    </video>
Tip
提示:启用 2D/3D 加速

只有 virtiovbox 视频设备能够进行 2D/3D 加速。您不能在其他视频设备上启用它。

14.14 配置网络设备 编辑源文件

本节介绍如何使用 virsh 配置虚拟网络设备的特定方面。

有关 libvirt 网络接口规范的更多详细信息,请参阅 https://libvirt.org/formatdomain.html#elementsDriverBackendOptions

14.14.1 使用多队列 virtio-net 扩展网络性能 编辑源文件

多队列 virtio-net 功能通过允许 VM Guest 的虚拟 CPU 并行传输数据包来扩展网络性能。有关更一般的信息,请参阅 第 32.3.3 节,“使用多队列 virtio-net 扩展网络性能”

要为特定的 VM Guest 启用多队列 virtio-net,请按照 第 14.1 节,“编辑 VM 配置” 中的描述编辑其 XML 配置,并修改其网络接口,如下所示

<interface type='network'>
 [...]
 <model type='virtio'/>
 <driver name='vhost' queues='NUMBER_OF_QUEUES'/>
</interface>

14.15 使用 macvtap 共享 VM 主机服务器网络接口 编辑源文件

Macvtap 提供 VM Guest 虚拟接口与主机网络接口的直接连接。基于 macvtap 的接口扩展了 VM 主机服务器网络接口,并在同一以太网段上拥有自己的 MAC 地址。通常,这用于使 VM Guest 和 VM 主机服务器直接出现在 VM 主机服务器连接到的交换机上。

Note
注意:Macvtap 不能与 Linux 网桥一起使用

Macvtap 不能与已连接到 Linux 网桥的网络接口一起使用。在尝试创建 macvtap 接口之前,请从网桥中删除该接口。

Note
注意:VM Guest 到 VM 主机服务器与 macvtap 的通信

使用 macvtap 时,VM Guest 可以与其他 VM Guest 以及网络上的其他外部主机通信。但它无法与运行 VM Guest 的 VM 主机服务器通信。这是 macvtap 的定义行为,因为 VM 主机服务器的物理以太网连接到 macvtap 网桥的方式。从 VM Guest 到转发到物理接口的网桥的流量无法被反弹到 VM 主机服务器的 IP 堆栈。同样,从 VM 主机服务器的 IP 堆栈发送到物理接口的流量也无法被反弹到 macvtap 网桥以转发到 VM Guest。

libvirt 通过指定 direct 接口类型来支持基于 macvtap 的虚拟网络接口。例如

<interface type='direct'>
   <mac address='aa:bb:cc:dd:ee:ff'/>
   <source dev='eth0' mode='bridge'/>
   <model type='virtio'/>
   </interface>

macvtap 设备的运行模式可以通过 mode 属性进行控制。以下列表显示了它的可能值以及每个值的描述

  • vepa:所有 VM Guest 数据包都将发送到外部网桥。目的地是与数据包源自同一 VM 主机服务器上的 VM Guest 的数据包将由 VEPA 兼容的网桥发送回 VM 主机服务器(今天的网桥通常不兼容 VEPA)。

  • bridge:目的地与源自同一 VM 主机服务器的数据包将直接传递到目标 macvtap 设备。源设备和目标设备都需要处于 bridge 模式才能直接传递。如果其中任何一个处于 vepa 模式,则需要 VEPA 兼容的网桥。

  • private:所有数据包都将发送到外部网桥,如果它们是通过外部路由器或网关发送并且该设备将它们发送回 VM 主机服务器,则会传递到同一 VM 主机服务器上的目标 VM Guest。如果源设备或目标设备处于 private 模式,则遵循此过程。

  • passthrough:一种特殊模式,可提供更强大的网络接口功能。所有数据包都将被转发到接口,允许 virtio VM Guest 更改 MAC 地址或设置混杂模式以桥接接口或在其之上创建 VLAN 接口。请注意,在 passthrough 模式下,网络接口无法共享。将接口分配给 VM Guest 会断开其与 VM 主机服务器的连接。因此,SR-IOV 虚拟功能通常在 passthrough 模式下分配给 VM Guest。

14.16 禁用内存气球设备 编辑源文件

内存气球已成为 KVM 的默认选项。该设备显式添加到 VM Guest,因此您无需在 VM Guest 的 XML 配置中添加此元素。如果您出于任何原因想要在 VM Guest 中禁用内存气球,则需要将 model='none' 设置为如下所示

<devices>
   <memballoon model='none'/>
</device>

14.17 配置多个显示器(双头) 编辑源文件

libvirt 支持双头配置,可在多个显示器上显示 VM Guest 的视频输出。

Important
重要:不支持 Xen

Xen 管理程序不支持双头配置。

程序 14.3: 配置双头
  1. 在虚拟机运行时,请验证 xf86-video-qxl 包是否已安装在 VM Guest 中

    > rpm -q xf86-video-qxl
  2. 关闭 VM Guest 并开始编辑其配置 XML,如 第 14.1 节,“编辑 VM 配置” 中所述。

  3. 验证虚拟显卡的模型是“qxl

    <video>
     <model type='qxl' ... />
  4. 将图形卡模型规格中的 heads 参数从默认的 1 增加到 2,例如

    <video>
     <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='2' primary='yes'/>
     <alias name='video0'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
    </video>
  5. 将虚拟机配置为使用 Spice 显示而不是 VNC

    <graphics type='spice' port='5916' autoport='yes' listen='0.0.0.0'>
     <listen type='address' address='0.0.0.0'/>
    </graphics>
  6. 启动虚拟机,然后使用 virt-viewer 连接到其显示器,例如

    > virt-viewer --connect qemu+ssh://USER@VM_HOST/system
  7. 从 VM 列表中,选择您已修改配置的 VM,然后按 Connect 确认。

  8. 在图形子系统(Xorg)在 VM Guest 中加载后,选择 View › Displays › Display 2 打开一个新窗口,其中包含第二个显示器的输出。

14.18 将加密适配器直通到 IBM Z 上的 KVM 客户机 编辑源文件

14.18.1 简介 编辑源文件

IBM Z 机器包含加密硬件,具有有用的功能,例如随机数生成、数字签名生成或加密。KVM 允许将这些加密适配器专用于客户机作为直通设备。这意味着管理程序无法观察客户机与设备之间的通信。

14.18.2 涵盖内容 编辑源文件

本节介绍如何将 IBM Z 主机上的加密适配器和域专用于 KVM 客户机。该过程包括以下基本步骤

  • 将加密适配器和域从主机上的默认驱动程序屏蔽。

  • 加载 vfio-ap 驱动程序。

  • 将加密适配器和域分配给 vfio-ap 驱动程序。

  • 配置客户机以使用加密适配器。

14.18.3 要求 编辑源文件

  • 您需要正确安装并运行 QEMU / libvirt 虚拟化环境。

  • 运行内核的 vfio_apvfio_mdev 模块需要可在宿主操作系统上使用。

14.18.4 将加密适配器专用于 KVM 主机 编辑源文件

  1. 验证 vfio_apvfio_mdev 内核模块是否已在主机上加载

    > lsmod | grep vfio_

    如果其中任何一个未列出,请手动加载它,例如

    > sudo modprobe vfio_mdev
  2. 在主机上创建新的 MDEV 设备并验证它已添加

    uuid=$(uuidgen)
    $ echo ${uuid} | sudo tee /sys/devices/vfio_ap/matrix/mdev_supported_types/vfio_ap-passthrough/create
    dmesg | tail
    [...]
    [272197.818811] iommu: Adding device 24f952b3-03d1-4df2-9967-0d5f7d63d5f2 to group 0
    [272197.818815] vfio_mdev 24f952b3-03d1-4df2-9967-0d5f7d63d5f2: MDEV: group_id = 0
  3. 识别您打算专用于 KVM 客户机的逻辑分区上的设备

    > ls -l /sys/bus/ap/devices/
    [...]
    lrwxrwxrwx 1 root root 0 Nov 23 03:29 00.0016 -> ../../../devices/ap/card00/00.0016/
    lrwxrwxrwx 1 root root 0 Nov 23 03:29 card00 -> ../../../devices/ap/card00/

    在此示例中,它是卡 0 队列 16。为了匹配硬件管理控制台 (HMC) 配置,您需要将 16 十六进制转换为 22 十进制。

  4. 将适配器从 zcrypt 使用中屏蔽

    > lszcrypt
    CARD.DOMAIN TYPE MODE STATUS REQUEST_CNT
    -------------------------------------------------
    00 CEX5C CCA-Coproc online 5
    00.0016 CEX5C CCA-Coproc online 5

    屏蔽适配器

    > cat /sys/bus/ap/apmask
    0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    echo -0x0 | sudo tee /sys/bus/ap/apmask
    0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

    屏蔽域

    > cat /sys/bus/ap/aqmask
    0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    echo -0x0 | sudo tee /sys/bus/ap/aqmask
    0xfffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  5. 将适配器 0 和域 16(十进制 22)分配给 vfio-ap

    > sudo echo +0x0 > /sys/devices/vfio_ap/matrix/${uuid}/assign_adapter
    > echo +0x16 | sudo tee /sys/devices/vfio_ap/matrix/${uuid}/assign_domain
    > echo +0x16 | sudo tee /sys/devices/vfio_ap/matrix/${uuid}/assign_control_domain
  6. 验证您配置的矩阵

    > cat /sys/devices/vfio_ap/matrix/${uuid}/matrix
    00.0016
  7. 创建新的 VM(请参阅 第 9 章,“客户机安装”)并等待其初始化,或使用现有 VM。在这两种情况下,请确保 VM 已关闭。

  8. 更改其配置以使用 MDEV 设备

    > sudo virsh edit VM_NAME
    [...]
    <hostdev mode='subsystem' type='mdev' model='vfio-ap'>
     <source>
      <address uuid='24f952b3-03d1-4df2-9967-0d5f7d63d5f2'/>
     </source>
    </hostdev>
    [...]
  9. 重启 VM

    > sudo virsh reboot VM_NAME
  10. 登录到客户机并验证适配器是否存在

    > lszcrypt
    CARD.DOMAIN TYPE MODE STATUS REQUEST_CNT
    -------------------------------------------------
    00 CEX5C CCA-Coproc online 1
    00.0016 CEX5C CCA-Coproc online 1

14.18.5 进一步阅读 编辑源文件

15 Xen 到 KVM 迁移指南 编辑源文件

随着 KVM 虚拟化解决方案在服务器管理员中越来越受欢迎,许多管理员需要一种方法来迁移他们现有的基于 Xen 的环境到 KVM。目前,没有成熟的工具可以自动将 Xen VM 转换为 KVM。但是,存在一种技术解决方案可以帮助将 Xen 虚拟机转换为 KVM。以下信息和过程有助于您执行此类迁移。

Important
重要:迁移过程不受支持

SUSE 不完全支持本文档中描述的迁移过程。我们仅提供指导。

15.1 使用 virt-v2v 迁移到 KVM 编辑源文件

本节包含有关如何导入外部管理程序(如 Xen)的虚拟机以在 libvirt 管理的 KVM 上运行的信息。

Tip
提示:Microsoft Windows 客户机

本节重点介绍转换 Linux 客户机。使用 virt-v2v 转换 Microsoft Windows 客户机与转换 Linux 客户机相同,但关于处理虚拟机驱动程序包 (VMDP) 方面有所不同。有关使用 VMDP 转换 Windows 客户机的更多详细信息,请参阅单独的 虚拟机驱动程序包文档

15.1.1 virt-v2v 简介 编辑源文件

virt-v2v 是一个命令行工具,用于将 VM Guest 从外部管理程序转换为在 libvirt 管理的 KVM 上运行。如果可能,它会在转换后的虚拟机中启用半虚拟化 virtio 驱动程序。支持的操作系统和管理程序的列表如下

支持的客户机操作系统
  • SUSE Linux Enterprise Server

  • openSUSE

  • Red Hat Enterprise Linux

  • Fedora

  • Microsoft Windows Server 2003 和 2008

支持的源管理程序
  • Xen

支持的目标管理程序
  • KVM(由 libvirt 管理)

15.1.2 安装 virt-v2v 编辑源文件

virt-v2v 的安装很简单

> sudo zypper install virt-v2v

请记住,virt-v2v 需要 root 权限,因此您需要以 root 用户身份运行它,或者通过 sudo 运行。

15.1.3 将虚拟机转换为在 libvirt 管理的 KVM 下运行 编辑源文件

virt-v2v 将虚拟机从 Xen 管理程序转换为在 libvirt 管理的 KVM 下运行。要了解有关 libvirtvirsh 的更多信息,请参阅 第二部分,“使用 libvirt 管理虚拟机”。此外,所有 virt-v2v 命令行选项都在 virt-v2v 手册页(man 1 virt-v2v)中进行了说明。

在转换虚拟机之前,请确保完成以下步骤

程序 15.1: 准备转换环境
  1. 创建一个新的本地存储池。

    virt-v2v 将源虚拟机的存储复制到 libvirt 管理的本地存储池(原始磁盘映像保持不变)。您可以使用 Virtual Machine Manager 或 virsh 创建池。有关更多信息,请参阅 第 8.2.2 节,“使用 Virtual Machine Manager 管理存储”第 8.2.1 节,“使用 virsh 管理存储”

  2. 准备本地网络接口。

    检查转换后的虚拟机是否可以使用 VM 主机服务器上的本地网络接口。它通常是网络网桥,如果尚未定义,请使用 YaST › System › Network Settings › Add › Bridge 创建它。

    Note
    注意:网络设备映射

    源 Xen 主机上的网络设备可以在转换过程中映射到 KVM 目标主机上的相应网络设备。例如,Xen 网桥 br0 可以映射到默认的 KVM 网络设备。样本映射可以在 /etc/virt-v2v.conf 中找到。要启用这些映射,请根据需要修改 XML 规则,并确保该部分未被 <!----> 标记注释掉。例如

     <network type='bridge' name='br0'>
       <network type='network' name='default'/>
     </network>
    Tip
    提示:无网络网桥

    如果没有可用的网络网桥,Virtual Machine Manager 可以选择创建它。

virt-v2v 具有以下基本命令语法

virt-v2v -i INPUT_METHOD -os STORAGE_POOL SOURCE_VM
input_method

有两种输入方法:libvirtlibvirtxml。有关更多信息,请参阅 SOURCE_VM 参数。

storage_pool

您已准备好用于目标虚拟机的存储池。

source_vm

要转换的源虚拟机。它取决于 INPUT_METHOD 参数:对于 libvirt,指定 libvirt 域的名称。对于 libvirtxml,指定包含 libvirt 域规范的 XML 文件的路径。

Note
注意:转换时间

转换虚拟机需要大量的系统资源,主要是用于复制虚拟机的整个磁盘映像。转换单个虚拟机通常需要 10 分钟。使用大型磁盘映像的虚拟机可能需要更长的时间。

15.1.3.1 基于 libvirt XML 描述文件的转换 编辑源文件

本节介绍如何使用 libvirt XML 配置文件转换本地 Xen 虚拟机。此方法适用于主机已运行 KVM 管理程序的情况。请确保源虚拟机的 libvirt XML 文件以及从中引用的 libvirt 存储池在本地主机上可用。

  1. 获取源虚拟机的 libvirt XML 描述。

    Tip
    提示:获取 XML 文件

    要获取源虚拟机的 libvirt XML 文件,您必须在 Xen 内核下运行宿主 OS。如果您已经重新启动宿主到启用了 KVM 的环境,请重新启动回 Xen 内核,转储 libvirt XML 文件,然后重新启动回 KVM 环境。

    首先在 virsh 中识别源虚拟机

    # virsh list
     Id    Name                           State
    ----------------------------------------------------
    [...]
      2     sles12_xen                     running
    [...]

    sles12_xen 是要转换的源虚拟机。现在导出其 XML 并将其保存到 sles12_xen.xml

    # virsh dumpxml sles12_xen > sles12_xen.xml
  2. 验证从 KVM 主机的角度来看,所有磁盘映像路径是否都正确。在同一台机器上转换时这不是问题,但从另一台主机进行 XML 转储转换时可能需要手动更改。

    <source file='/var/lib/libvirt/images/XenPool/SLES.qcow2'/>
    Tip
    提示:复制映像

    为了避免重复复制映像,请手动将磁盘映像直接复制到 libvirt 存储池。更新 XML 描述文件中的源文件条目。virt-v2v 进程将检测现有磁盘并原地转换它们。

  3. 运行 virt-v2v 将其转换为 KVM 虚拟机

    # virt-v2v sles12_xen.xml1 \
    -i LIBVIRTXML2 \
    -os remote_host.example.com:/exported_dir3 \
    --bridge br04 \
    -on sles12_kvm5

    1

    源基于 Xen 的虚拟机的 XML 描述。

    2

    virt-v2vlibvirt XML 文件中读取有关源虚拟机的信息。

    3

    目标虚拟机磁盘映像所在的存储池。在此示例中,映像位于 NFS 共享 /exported_dir 上,服务器为 remote_host.example.com

    4

    目标 KVM 虚拟机使用主机上的网络网桥 br0

    5

    目标虚拟机被重命名为 sles12_kvm,以防止与同名现有虚拟机发生名称冲突。

15.1.3.2 基于 libvirt 域名的转换 编辑源文件

如果您仍在 Xen 下运行 libvirt,并计划稍后重启到 KVM 管理程序,此方法很有用。

  1. 查找要转换的虚拟机的 libvirt 域名称。

    # virsh list
     Id    Name                           State
    ----------------------------------------------------
    [...]
      2     sles12_xen                     running
    [...]

    sles12_xen 是要转换的源虚拟机。

  2. 运行 virt-v2v 将其转换为 KVM 虚拟机

    # virt-v2v sles12_xen1 \
    -i libvirt2 \
    -os storage_pool3 \
    --network eth04 \
    -of qcow25 \
    -oa sparse6 \
    -on sles12_kvm

    1

    基于 Xen 的虚拟机的域名称。

    2

    virt-v2v 直接从活动的 libvirt 连接读取有关源虚拟机的信息。

    3

    目标磁盘映像位于本地 libvirt 存储池中。

    4

    所有客户机网桥(或网络)都连接到本地管理的网络。

    5

    目标虚拟机磁盘映像的格式。支持的选项是 rawqcow2

    6

    转换后的客户机磁盘空间是 sparse 还是 preallocated

15.1.3.3 转换远程 Xen 虚拟机 编辑源文件

如果您需要转换运行在远程主机上的 Xen 虚拟机,此方法很有用。由于 virt-v2v 通过 ssh 连接到远程主机,请确保 SSH 服务在主机上运行。

Note
注意:无密码 SSH 访问

virt-v2v 需要与远程主机建立无密码 SSH 连接。这意味着使用添加到 ssh-agent 的 SSH 密钥进行连接。有关详细信息,请参阅 man ssh-keygenman ssh-add。更多信息也可在 安全与加固指南》第 22 章“使用 OpenSSH 保护网络操作” 中找到。

要连接到远程 libvirt 连接,请构造与您的远程主机相关的有效连接 URI。在以下示例中,远程主机名为 remote_host.example.com,连接的用户名为 root。然后连接 URI 如下所示

xen+ssh://root@remote_host.example.com/

有关 libvirt 连接 URI 的更多信息,请参阅 https://libvirt.org/uri.html

  1. 查找要转换的远程虚拟机的 libvirt 域名称。

    # virsh -c xen+ssh://root@remote_host.example.com/ list
     Id    Name                           State
    ----------------------------------------------------
      1     sles12_xen                     running
    [...]

    sles12_xen 是要转换的源虚拟机。

  2. 远程连接的 virt-v2v 命令如下所示

    # virt-v2v sles12_xen \
    -i libvirt \
    -ic xen+ssh://root@remote_host.example.com/ \
    -os local_storage_pool \
    --bridge br0

15.1.4 运行转换后的虚拟机 编辑源文件

virt-v2v 成功完成后,将创建一个新的 libvirt 域,其名称为使用 -on 选项指定的名称。如果您未指定 -on,则使用与源虚拟机相同的名称。新客户机可以使用标准的 libvirt 工具进行管理,例如 virsh 或 Virtual Machine Manager。

Tip
提示:重启机器

如果您按照 第 15.1.3.2 节,“基于 libvirt 域名的转换” 中的描述在 Xen 下完成了转换,您可能需要重启宿主机并使用非 Xen 内核启动。

15.2 Xen 到 KVM 手动迁移 编辑源文件

15.2.1 总体概述 编辑源文件

管理虚拟机的首选解决方案是基于 libvirt;有关更多信息,请参阅 https://libvirt.org/。它比手动定义和运行虚拟机的方式有几个优点—libvirt 是跨平台的,支持许多管理程序,具有安全远程管理,有虚拟网络,最重要的是,它提供了一个统一的抽象层来管理虚拟机。因此,本文档的重点是 libvirt 解决方案。

通常,Xen 到 KVM 的迁移包括以下基本步骤

  1. 备份原始 Xen VM Guest。

  2. 可选地,应用特定于半虚拟化客户机的更改。

  3. 获取有关原始 Xen VM Guest 的信息,并将其更新为 KVM 等效项。

  4. 关闭 Xen 主机上的客户机,并在 KVM 管理程序下运行新的客户机。

Warning
警告:不支持实时迁移

Xen 到 KVM 的迁移不能在源 VM Guest 运行时进行实时迁移。在运行新的 KVM 就绪 VM Guest 之前,建议您关闭原始 Xen VM Guest。

15.2.2 备份 Xen VM Guest 编辑源文件

要备份您的 Xen VM Guest,请遵循以下步骤

  1. 识别要迁移的相关 Xen 客户机,并记住其 ID/名称。

    > sudo virsh list --all
    Id Name                 State
    ----------------------------------
     0 Domain-0             running
     1 SLES15SP3            running
    [...]
  2. 关闭客户机。您可以通过关闭客户机 OS 或使用 virsh 来完成此操作

    > sudo virsh shutdown SLES11SP3
  3. 将其配置备份到 XML 文件。

    > sudo virsh dumpxml SLES11SP3 > sles11sp3.xml
  4. 备份其磁盘映像文件。使用 cprsync 命令创建备份副本。请记住,使用 md5sum 命令检查副本始终是一个好主意。

  5. 备份完映像文件后,您可以再次使用以下命令启动客户机

    > sudo virsh start SLES11SP3

15.2.3 特定于半虚拟化客户机的更改 编辑源文件

如果您正在迁移半虚拟化 Xen 客户机,请应用以下更改。您可以在正在运行的客户机上或使用 guestfs-tools 在已停止的客户机上执行此操作。

Important
重要提示

应用本节中描述的更改后,与迁移的 VM Guest 相关的映像文件将无法再在 Xen 下使用。

15.2.3.1 安装默认内核 编辑源文件

Warning
警告:无法启动

安装默认内核后,系统将无法启动 Xen 客户机。

在克隆 Xen 客户机磁盘映像以在 KVM 管理程序下使用之前,请确保它可以在 使用 Xen 管理程序的情况下启动。这对于半虚拟化 Xen 客户机至关重要,因为它们通常包含特殊的 Xen 内核,并且通常没有安装完整的 GRUB 2 引导加载程序。

  1. 对于 SLES 11,请更新 /etc/sysconfig/kernel 文件。通过删除所有 Xen 驱动程序并用 virtio 驱动程序替换它们来更改 INITRD_MODULES 参数。替换

    INITRD_MODULES="xenblk xennet"

    INITRD_MODULES="virtio_blk virtio_pci virtio_net virtio_balloon"

    对于 SLES 12、15 和 openSUSE,请在 /etc/dracut.conf.d/*.conf 中搜索 xenblk xennet 并将其替换为 virtio_blk virtio_pci virtio_net virtio_balloon

  2. 半虚拟化 Xen 客户机运行特定的 Xen 内核。要在 KVM 下运行客户机,您需要安装默认内核。

    Note
    注意:默认内核已安装

    您无需为完全虚拟化的客户机安装默认内核,因为它已安装。

    在 Xen 客户机上输入 rpm -q kernel-default 以找出默认内核是否已安装。如果未安装,请使用 zypper in kernel-default 进行安装。

    我们将用于在 KVM 下启动客户机的内核必须具有 virtio(半虚拟化)驱动程序。运行以下命令以找出。不要忘记将 5.3.18-8 替换为您的内核版本

    > sudo sudo find /lib/modules/5.3.18-8-default/kernel/drivers/ -name virtio*
    /lib/modules/5.3.18-8-default/kernel/drivers/block/virtio_blk.ko
    /lib/modules/5.3.18-8-default/kernel/drivers/char/hw_random/virtio-rng.ko
    /lib/modules/5.3.18-8-default/kernel/drivers/char/virtio_console.ko
    /lib/modules/5.3.18-8-default/kernel/drivers/crypto/virtio
    ...
  3. 更新 /etc/fstab。将任何存储设备从 xvda 更改为 vda

  4. 更新引导加载程序配置。在 Xen 客户机上输入 rpm -q grub2 以找出 GRUB 2 是否已安装。如果未安装,请使用 zypper in grub2 进行安装。

    现在将新安装的默认内核设置为 OS 引导的默认值。还要删除/更新可能引用 Xen 特定设备的内核命令行选项。您可以分别使用 YaST(System › Boot Loader)或手动执行此操作

    • 通过列出所有 Linux 引导菜单项来找到首选的 Linux 引导菜单项

      > cat /boot/grub2/grub.cfg | grep 'menuentry '

      记住您新安装的那个的顺序号(从零开始计数)。

    • 将其设置为默认引导菜单项

      > sudo grub2-set-default N

      N 替换为您之前发现的引导菜单项的编号。

    • 打开 /etc/default/grub 进行编辑,并查找 GRUB_CMDLINE_LINUX_DEFAULTGRUB_CMDLINE_LINUX_RECOVERY 选项。删除或更新任何引用 Xen 特定设备的条目。在以下示例中,您可以替换

      root=/dev/xvda1 disk=/dev/xvda console=xvc

      root=/dev/vda1 disk=/dev/vda

      不要忘记删除所有对 xvc 类型控制台(如 xvc0)的引用。

  5. 更新 device.map 文件,无论是在 /boot/grub2 目录还是 /boot/grub2-efi 目录中,以 VM 使用的为准。将任何存储设备从 xvda 更改为 vda

  6. 要导入新的默认设置,请运行

    grub2-mkconfig -o /boot/grub2/grub.cfg

15.2.3.2 更新客户机以在 KVM 下启动 编辑源文件

  1. 更新系统以使用默认串行控制台。列出配置的控制台,并删除指向 xvc? 的符号链接。

    > sudo ls -l /etc/systemd/system/getty.target.wants/
    getty@tty1.service -> /usr/lib/systemd/system/getty@.service
    getty@xvc0.service -> /usr/lib/systemd/system/getty@xvc0.service
    getty@xvc1.service -> /usr/lib/systemd/system/getty@xvc1.service
    
    # rm /etc/systemd/system/getty.target.wants/getty@xvc?.service
  2. 更新 /etc/securetty 文件。将 xvc0 替换为 ttyS0

15.2.4 更新 Xen VM Guest 配置 编辑源文件

本节介绍如何导出原始 Xen VM Guest 的配置,以及需要对其进行哪些特定更改才能将其作为 KVM 客户机导入到 libvirt 中。

15.2.4.1 导出 Xen VM Guest 配置 编辑源文件

首先导出客户机的配置并将其保存到文件。例如

> sudo virsh dumpxml SLES11SP3
<domain type='xen'>
  <name>SLES11SP3</name>
  <uuid>fa9ea4d7-8f95-30c0-bce9-9e58ffcabeb2</uuid>
  <memory>524288</memory>
  <currentMemory>524288</currentMemory>
  <vcpu>1</vcpu>
  <bootloader>/usr/bin/pygrub</bootloader>
  <os>
    <type>linux</type>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/lib/xen/bin/qemu-dm</emulator>
    <disk type='file' device='disk'>
      <driver name='file'/>
      <source file='/var/lib/libvirt/images/SLES_11_SP2_JeOS.x86_64-0.0.2_para.raw'/>
      <target dev='xvda' bus='xen'/>
    </disk>
    <interface type='bridge'>
      <mac address='00:16:3e:2d:91:c3'/>
      <source bridge='br0'/>
      <script path='vif-bridge'/>
    </interface>
    <console type='pty'>
      <target type='xen' port='0'/>
    </console>
    <input type='mouse' bus='xen'/>
    <graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
  </devices>
</domain>

您可以在 https://libvirt.org/formatdomain.html 找到有关 VM Guest 描述的 libvirt XML 格式的详细信息。

15.2.4.2 对客户机配置的常规更改 编辑源文件

您需要对导出的 Xen 客户机 XML 配置进行一些常规更改,才能在 KVM 管理程序下运行它。以下适用于完全虚拟化和半虚拟化客户机。以下 XML 元素仅为示例,不一定需要出现在您的特定配置中。

Tip
提示:使用的约定

若要在 XML 配置文件中引用节点,本文档将始终使用 XPath 语法。例如,要引用 <domain> 标记内的 <name> 节点

<domain>
  <name>sles11sp3</name>
</domain>

将使用 XPath 等效项 /domain/name

  1. /domain 元素的 type 属性从 xen 更改为 kvm

  2. 删除 /domain/bootloader 元素节。

  3. 删除 /domain/bootloader_args 元素节。

  4. /domain/os/type 元素的值从 linux 更改为 hvm

  5. /domain/os 元素下添加 <boot dev="hd"/>

  6. /domain/os/type 元素的 arch 属性添加到。可接受的值为 arch=”x86_64”arch=”i686”

  7. /domain/devices/emulator 元素从 /usr/lib/xen/bin/qemu-dm' 更改为 /usr/bin/qemu-kvm

  8. 对于每个与半虚拟化 (PV) 客户机关联的磁盘,请进行以下更改

    • /domain/devices/disk/driver 元素的 name 属性从 file 更改为 qemu,并为磁盘类型添加 type 属性。例如,有效选项包括 rawqcow2

    • /domain/devices/disk/target 元素的 dev 属性从 xvda 更改为 vda

    • /domain/devices/disk/target 元素的 bus 属性从 xen 更改为 virtio

  9. 对于每个网卡,进行以下更改

    • 如果 /domain/devices/interface 中定义了 model,请将其 type 属性值更改为 virtio

      <model type=”virtio”>
    • 删除所有 /domain/devices/interface/script 部分。

    • 如果 dev 属性以 vifvnetveth 开头,则删除所有 /domain/devices/interface/target 元素。如果使用自定义网络,请将 dev 值更改为该目标。

  10. 如果存在,则删除 /domain/devices/console 元素节。

  11. 如果存在,则删除 /domain/devices/serial 元素节。

  12. /domain/devices/input 元素上的 bus 属性从 xen 更改为 ps2

  13. /domain/devices 元素下添加以下元素以支持内存气球功能。

    <memballoon model="virtio"/>
Tip
提示:设备名称

<target dev='hda' bus='ide'/> 控制磁盘在客户机操作系统中暴露的设备。dev 属性指示 “逻辑” 设备名称。实际指定的设备名称不能保证映射到客户机 OS 中的设备名称。因此,您可能需要在引导加载程序的命令行上更改磁盘映射。例如,如果引导加载程序将根磁盘预期为 hda2,但 KVM 仍将其视为 sda2,则将引导加载程序命令行从

[...] root=/dev/hda2 resume=/dev/hda1 [...]

的行

[...] root=/dev/sda2 resume=/dev/sda1 [...]

对于半虚拟化 xvda 设备,将其更改为

[...] root=/dev/vda2 resume=/dev/vda1 [...]

否则,VM Guest 将拒绝在 KVM 环境中启动。

15.2.4.3 目标 KVM 客户机配置 编辑源文件

在应用了上述所有修改后,您将获得 KVM 客户机的以下配置

<domain type='kvm'>
  <name>SLES11SP3</name>
  <uuid>fa9ea4d7-8f95-30c0-bce9-9e58ffcabeb2</uuid>
  <memory>524288</memory>
  <currentMemory>524288</currentMemory>
  <vcpu cpuset='0-3'>1</vcpu>
  <os>
    <type arch=”x86_64”>hvm</type>
    <boot dev="hd"/>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type="raw"/>
      <source file='/var/lib/libvirt/images/SLES_11_SP2_JeOS.x86_64-0.0.2_para.raw'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='bridge'>
      <mac address='00:16:3e:2d:91:c3'/>
      <source bridge='br0'/>
    </interface>
    <input type='mouse' bus='usb'/>
    <graphics type='vnc' port='5900' autoport='yes' keymap='en-us'/>
    <memballoon model="virtio"/>
  </devices>
</domain>

将配置保存到您主目录中的文件(例如 SLES11SP3.xml)。导入后,它将被复制到默认的 /etc/libvirt/qemu 目录。

15.2.5 迁移 VM Guest 编辑源文件

更新 VM Guest 配置并对客户机 OS 应用了必要的更改后,关闭原始 Xen 客户机,并在 KVM 管理程序下运行其克隆。

  1. 在 Xen 主机上通过从控制台以 root 用户身份运行 shutdown -h now 来关闭客户机。

  2. 如果需要,复制与 VM Guest 关联的磁盘映像。默认配置要求将 Xen 磁盘文件从 /var/lib/xen/images 复制到 /var/lib/kvm/images。如果您之前没有创建 VM Guest,则可能需要创建(以 root 用户身份)/var/lib/kvm/images 目录。

  3. 创建新域,并将其注册到 libvirt

    > sudo virsh define SLES11SP3.xml
     Domain SLES11SP3 defined from SLES11SP3.xml
  4. 验证 KVM 配置中是否看到新客户机

    > virsh list –all
  5. 创建域后,您可以启动它

    > sudo virsh start SLES11SP3
     Domain SLES11SP3 started

15.3 更多信息 编辑源文件

有关 libvirt 的更多信息,请参阅 https://libvirt.org

您可以在 https://libvirt.org/formatdomain.html 找到有关 libvirt XML 格式的更多详细信息。

第三部分 与管理程序无关的功能 编辑源文件

16 磁盘缓存模式

17 VM 客户机时钟设置

在虚拟机 Guest 中保持正确的时间是虚拟化中比较困难的方面之一。保持正确的时间对于网络应用程序尤其重要,并且也是进行虚拟机 Guest 实时迁移的先决条件。

18 libguestfs

虚拟机由磁盘映像和定义文件组成。手动访问和操作这些客户机组件(在正常管理程序进程之外)是可能的,但本质上是危险的,并可能损害数据完整性。libguestfs 是一个 C 库和一套相应的工具,用于安全地访问和修改 虚拟机 磁盘映像—在正常管理程序进程之外,但没有手动编辑通常带来的风险。

19 QEMU 客户机代理

QEMU 客户代理 (GA) 在 VM 客户机内部运行,允许 VM 主机服务器通过 libvirt 在客户机操作系统中运行命令。它支持许多功能——例如,获取客户机文件系统的详细信息、冻结和解冻文件系统,或暂停或重新启动客户机。

20 软件 TPM 模拟器

可信平台模块 (TPM) 是一个加密处理器,它使用加密密钥来保护硬件。对于使用 TPM 开发安全功能的开发人员来说,软件 TPM 仿真器是一个方便的解决方案。与硬件 TPM 设备相比,仿真器对虚拟机数量没有限制…

21 创建 VM 客户机的崩溃转储

每当虚拟机崩溃时,收集虚拟机的内存核心转储以便于调试和分析都很有用。对于物理机器,Kexec 和 Kdump 会负责收集崩溃转储。对于虚拟机,这取决于 Guest 是完全虚拟化 (FV) 还是准虚拟化 (PV)。

16 磁盘缓存模式 编辑源文件

16.1 什么是磁盘缓存? 编辑源文件

磁盘缓存是一种内存,用于加速从硬盘存储和访问数据的过程。物理硬盘将缓存集成作为标准功能。对于虚拟磁盘,缓存使用 VM 主机服务器的内存,您可以对其行为进行微调,例如,通过设置其类型。

16.2 磁盘缓存如何工作? 编辑源文件

通常,磁盘缓存存储最近和最频繁使用的程序和数据。当用户或程序请求数据时,操作系统首先检查磁盘缓存。如果数据存在,操作系统会快速将数据传递给程序,而不是从磁盘重新读取数据。

Caching mechanism
图 16.1: 缓存机制

16.3 磁盘缓存的好处 编辑源文件

虚拟磁盘设备的缓存会影响客户机机器的整体性能。您可以通过优化缓存模式、磁盘映像格式和存储子系统的组合来提高性能。

16.4 虚拟磁盘缓存模式 编辑源文件

如果您未指定缓存模式,默认使用 writeback。每个客户机磁盘可以使用以下缓存模式之一

writeback

writeback 使用主机页面缓存。当写入操作被放入主机缓存时,将向客户机报告完成。缓存管理负责提交到存储设备。客户机的虚拟存储适配器会收到 writeback 缓存的通知,因此期望它发送刷新命令以管理数据完整性。

writethrough

仅当数据已提交到存储设备时,才报告写入操作已完成。客户机的虚拟存储适配器会收到没有 writeback 缓存的通知,因此客户机不需要发送刷新命令来管理数据完整性。

none

将绕过主机缓存,并且读写直接在管理程序和存储设备之间发生。由于实际存储设备可能会在数据仍在其写队列中时报告写入已完成,因此客户机的虚拟存储适配器会收到 writeback 缓存的通知。此模式等同于直接访问主机磁盘。

unsafe

writeback 模式类似,但会忽略客户机的所有刷新命令。使用此模式意味着用户优先考虑性能提升,而不是在主机发生故障时丢失数据的风险。此模式在客户机安装期间可能很有用,但不适合生产工作负载。

directsync

仅当数据已提交到存储设备并且绕过主机缓存时,才报告写入操作已完成。与 writethrough 类似,此模式对于不发送刷新命令的客户机可能很有用。

16.5 缓存模式与数据完整性 编辑源文件

writethrough, none, directsync

当客户机操作系统按需使用刷新命令时,这些模式被认为是最安全的。对于不安全或不稳定的客户机,请使用 writethoughdirectsync

writeback

此模式通知客户机写入缓存的存在,并依赖客户机按需发送刷新命令来维护其磁盘映像内的数据完整性。如果主机发生故障,此模式将使客户机面临数据丢失的风险。原因是写入操作报告完成与写入操作提交到存储设备之间存在时间差。

unsafe

此模式类似于 writeback 缓存,但会忽略客户机刷新命令。这意味着主机故障导致数据丢失的风险更高。

16.6 缓存模式与实时迁移 编辑源文件

存储数据的缓存限制了支持实时迁移的配置。目前,只有 rawqcow2 映像格式可用于实时迁移。如果使用群集文件系统,所有缓存模式都支持实时迁移。否则,唯一支持在读/写共享存储上进行实时迁移的缓存模式是 none

libvirt 管理层包含基于多个因素的迁移兼容性检查。如果客户机存储位于群集文件系统上、只读或标记为可共享,那么在确定是否允许迁移时将忽略缓存模式。否则,除非将缓存模式设置为 none,否则 libvirt 不允许迁移。但是,可以使用迁移 API 的 “--unsafe” 选项覆盖此限制,该选项也由 virsh 支持。例如

> virsh migrate --live --unsafe
Tip
提示

缓存模式 none 是 AIO 模式设置 native 所必需的。如果使用其他缓存模式,AIO 模式将自动切换回默认的 threads

17 VM Guest 时钟设置 编辑源文件

摘要

在虚拟机 Guest 中保持正确的时间是虚拟化中比较困难的方面之一。保持正确的时间对于网络应用程序尤其重要,并且也是进行虚拟机 Guest 实时迁移的先决条件。

Tip
提示:VM 主机服务器上的计时

强烈建议确保 VM 主机服务器也保持正确的时间,例如,通过使用 NTP(有关更多信息,请参阅 参考》第 18 章“使用 NTP 进行时间同步”)。

17.1 KVM:使用 kvm_clock Edit source

KVM 提供了一个半虚拟化时钟,通过 kvm_clock 驱动程序支持。强烈建议使用 kvm_clock

在运行 Linux 的虚拟机客户机内部运行以下命令,以检查是否已加载 kvm_clock 驱动程序

> sudo dmesg | grep kvm-clock
[    0.000000] kvm-clock: cpu 0, msr 0:7d3a81, boot clock
[    0.000000] kvm-clock: cpu 0, msr 0:1206a81, primary cpu clock
[    0.012000] kvm-clock: cpu 1, msr 0:1306a81, secondary cpu clock
[    0.160082] Switching to clocksource kvm-clock

要检查当前使用的是哪个时钟源,请在虚拟机客户机中运行以下命令。它应该输出 kvm-clock

> cat /sys/devices/system/clocksource/clocksource0/current_clocksource
Important
重要提示:《code class="literal">kvm-clock 和 NTP

使用 kvm-clock 时,也建议在虚拟机客户机中使用 NTP。也建议在 VM Host Server 上使用 NTP。

17.1.1 其他计时方法 Edit source

半虚拟化的 kvm-clock 目前不适用于 Windows* 操作系统。对于 Windows*,请使用 Windows Time Service Tools 进行时间同步。

17.2 Xen 虚拟机时钟设置 Edit source

在 Xen 4 中,用于 Xen 主机和客户机之间时间同步的独立墙钟设置 /proc/sys/xen/independent_wallclock 已被移除。引入了一个新的配置选项 tsc_mode。它指定了一种使用 时间戳计数器 来同步客户机时间与 Xen 服务器的方法。其默认值 0 可处理大多数硬件和软件环境。

有关 tsc_mode 的更多详细信息,请参阅 xen-tscmode 手册页(man 7 xen-tscmode)。

18 libguestfs Edit source

摘要

虚拟机由磁盘映像和定义文件组成。手动访问和操作这些客户机组件(在正常管理程序进程之外)是可能的,但本质上是危险的,并可能损害数据完整性。libguestfs 是一个 C 库和一套相应的工具,用于安全地访问和修改 虚拟机 磁盘映像—在正常管理程序进程之外,但没有手动编辑通常带来的风险。

Important
重要提示

libguestfs 工具仅在 AMD64/Intel 64 架构上完全受支持。

18.1 虚拟机客户机操作概述 Edit source

18.1.1 虚拟机客户机操作风险 Edit source

由于磁盘映像和定义文件在 Linux 环境中仅仅是另一种类型的文件,因此可以使用许多工具来访问、编辑和写入这些文件。正确使用时,这些工具可以成为客户机管理的重要组成部分。但是,即使正确使用这些工具也并非没有风险。手动操作客户机磁盘映像时应考虑的风险包括

  • 数据损坏:如果绕过虚拟化保护层,主计算机或集群中的另一个节点同时访问映像可能导致更改丢失或数据损坏。

  • 安全:将磁盘映像挂载为环回设备需要 root 访问权限。当映像被环回挂载时,其他用户和进程可能可以访问磁盘内容。

  • 管理员错误:正确绕过虚拟化层需要对虚拟组件和工具的深入理解。未能隔离映像或在更改后未能正确清理可能会在返回虚拟化控制后导致更多问题。

18.1.2 libguestfs 设计 Edit source

libguestfs C 库旨在安全可靠地创建、访问和修改虚拟机 (VM Guest) 磁盘映像。它还提供额外的语言绑定:用于 PerlPython、PHP(仅适用于 64 位机器)和 Ruby。libguestfs 无需 root 即可访问 VM Guest 磁盘映像,并具有多层防御措施,以防止恶意磁盘映像。

libguestfs 提供了许多用于访问和修改 VM Guest 磁盘映像及其内容的工具。这些工具提供了诸如以下功能:查看和编辑客户机内的文件、脚本化对 VM Guest 的更改、监控磁盘使用/可用空间统计信息、创建客户机、执行 V2V 或 P2V 迁移、执行备份、克隆 VM Guest、格式化磁盘以及调整磁盘大小。

Warning
警告:最佳实践

切勿在实时虚拟机上使用 libguestfs 工具。这样做可能导致 VM Guest 中的磁盘损坏。libguestfs 工具会尝试阻止您执行此操作,但无法捕获所有情况。

但是,大多数命令都有 --ro(只读)选项。使用此选项,可以在实时虚拟机上运行命令。结果可能奇怪或不一致,但您不会面临磁盘损坏的风险。

18.2 软件包安装 Edit source

libguestfs 通过 4 个软件包提供

  • libguestfs0:提供主要的 C 库

  • guestfs-data:包含启动映像时使用的应用程序文件(存储在 /usr/lib64/guestfs

  • guestfs-tools:核心 guestfs 工具、手册页和 /etc/libguestfs-tools.conf 配置文件。

  • guestfs-winsupport:为 guestfs 工具中的 Windows 文件客户机提供支持。此软件包仅在处理 Windows 客户机时需要安装,例如在将 Windows 客户机转换为 KVM 时。

要在系统上安装 guestfs 工具,请运行

> sudo zypper in guestfs-tools

18.3 Guestfs 工具 Edit source

18.3.1 修改虚拟机 Edit source

guestfs-tools 软件包中的工具集用于访问和修改虚拟机磁盘映像。此功能通过熟悉的 shell 界面和内置的安全措施提供,以确保映像的完整性。Guestfs 工具 shell 暴露了 guestfs API 的所有功能,并使用计算机上安装的软件包和 /usr/lib64/guestfs 中的文件即时创建应用程序。

18.3.2 支持的文件系统和磁盘映像 Edit source

Guestfs 工具支持多种文件系统,包括

  • Ext2、Ext3、Ext4

  • Xfs

  • Btrfs

还支持多种磁盘映像格式

  • raw

  • qcow2

Warning
警告:不支持的文件系统

Guestfs 也可能支持 Windows* 文件系统(VFAT、NTFS)、BSD* 和 Apple* 文件系统以及其他磁盘映像格式(VMDK、VHDX…)。但是,这些文件系统和磁盘映像格式在 openSUSE Leap 上不受支持。

18.3.3 virt-rescue Edit source

virt-rescue 类似于救援 CD,但适用于虚拟机,并且无需 CD。virt-rescue 为用户提供一个救援 shell 和一些简单的恢复工具,可用于检查和修复虚拟机或磁盘映像中的问题。

> virt-rescue -a sles.qcow2
Welcome to virt-rescue, the libguestfs rescue shell.

Note: The contents of / are the rescue appliance.
You need to mount the guest's partitions under /sysroot
before you can examine them. A helper script for that exists:
mount-rootfs-and-do-chroot.sh /dev/sda2

><rescue>
[   67.194384] EXT4-fs (sda1): mounting ext3 file system
using the ext4 subsystem
[   67.199292] EXT4-fs (sda1): mounted filesystem with ordered data
mode. Opts: (null)
mount: /dev/sda1 mounted on /sysroot.
mount: /dev bound on /sysroot/dev.
mount: /dev/pts bound on /sysroot/dev/pts.
mount: /proc bound on /sysroot/proc.
mount: /sys bound on /sysroot/sys.
Directory: /root
Thu Jun  5 13:20:51 UTC 2014
(none):~ #

您现在正在以救援模式运行 VM Guest

(none):~ # cat /etc/fstab
devpts  /dev/pts          devpts  mode=0620,gid=5 0 0
proc    /proc             proc    defaults        0 0
sysfs   /sys              sysfs   noauto          0 0
debugfs /sys/kernel/debug debugfs noauto          0 0
usbfs   /proc/bus/usb     usbfs   noauto          0 0
tmpfs   /run              tmpfs   noauto          0 0
/dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part1 / ext3 defaults 1 1

18.3.4 virt-resize Edit source

virt-resize 用于调整虚拟机磁盘大小,使其整体变大或变小,并调整或删除其中包含的任何分区。

过程 18.1: 扩展磁盘

完整分步示例:如何扩展虚拟机磁盘

  1. 首先,在虚拟机关闭电源的情况下,确定此虚拟机上可用分区的数量

    > virt-filesystems --long --parts --blkdevs -h -a sles.qcow2
    Name       Type       MBR  Size  Parent
    /dev/sda1  partition  83   16G   /dev/sda
    /dev/sda   device     -    16G   -
  2. virt-resize 无法执行就地磁盘修改 — 必须有足够的空间来存储调整大小后的输出磁盘。使用 truncate 命令创建一个合适大小的文件

    > truncate -s 32G outdisk.img
  3. 使用 virt-resize 调整磁盘映像大小。virt-resize 需要两个强制参数用于输入和输出映像

    > virt-resize --expand /dev/sda1 sles.qcow2 outdisk.img
    Examining sles.qcow2 ...
    **********
    Summary of changes:
    
    /dev/sda1: This partition will be resized from 16,0G to 32,0G.  The
        filesystem ext3 on /dev/sda1 will be expanded using the 'resize2fs'
        method.
    
    **********
    Setting up initial partition table on outdisk.img ...
    Copying /dev/sda1 ...
    ◐ 84%
    ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒════════⟧ 00:03
    Expanding /dev/sda1 using the 'resize2fs' method ...
    
    Resize operation completed with no errors.  Before deleting the old
    disk, carefully check that the resized disk boots and works correctly.
  4. 确认映像已正确调整大小

    > virt-filesystems --long --parts --blkdevs -h -a outdisk.img
    Name       Type       MBR  Size  Parent
    /dev/sda1  partition  83   32G   /dev/sda
    /dev/sda   device     -    32G   -
  5. 使用新的磁盘映像启动 VM Guest,并在删除旧映像之前确认其正常运行。

18.3.5 其他 virt-* 工具 Edit source

有一些 guestfs 工具可以简化管理任务—例如查看和编辑文件,或获取有关虚拟机的信息。

18.3.5.1 virt-filesystems Edit source

此工具用于报告有关磁盘映像或虚拟机中的文件系统、分区和逻辑卷的信息。

> virt-filesystems -l -a sles.qcow2
Name       Type        VFS   Label  Size         Parent
/dev/sda1  filesystem  ext3  -      17178820608  -

18.3.5.2 virt-ls Edit source

virt-ls 列出虚拟机或磁盘映像中的文件名、文件大小、校验和、扩展属性等。可以提供多个目录名,在这种情况下,每个目录的输出将被连接起来。要列出 libvirt 客户机中的目录,请使用 -d 选项指定客户机的名称。对于磁盘映像,请使用 -a 选项。

> virt-ls -h -lR -a sles.qcow2 /var/log/
d 0755        776 /var/log
- 0640          0 /var/log/NetworkManager
- 0644        23K /var/log/Xorg.0.log
- 0644        23K /var/log/Xorg.0.log.old
d 0700        482 /var/log/YaST2
- 0644        512 /var/log/YaST2/_dev_vda
- 0644         59 /var/log/YaST2/arch.info
- 0644        473 /var/log/YaST2/config_diff_2017_05_03.log
- 0644       5.1K /var/log/YaST2/curl_log
- 0644       1.5K /var/log/YaST2/disk_vda.info
- 0644       1.4K /var/log/YaST2/disk_vda.info-1
[...]

18.3.5.3 virt-cat Edit source

virt-cat 是一个命令行工具,用于显示命名虚拟机(或磁盘映像)中存在的文件内容。可以提供多个文件名,在这种情况下,它们将连接在一起。每个文件名必须由其绝对路径指定,从根目录开始,以 / 开头。

> virt-cat -a sles.qcow2 /etc/fstab
devpts /dev/pts devpts mode=0620,gid=5 0 0
proc   /proc    proc   defaults        0 0

18.3.5.4 virt-df Edit source

virt-df 是一个命令行工具,用于显示虚拟机文件系统上的可用空间。与其他工具不同,它不仅显示分配给虚拟机的磁盘大小,还可以深入磁盘映像以显示已使用的空间量。

> virt-df -a sles.qcow2
Filesystem                           1K-blocks       Used  Available  Use%
sles.qcow2:/dev/sda1                  16381864     520564   15022492  4%

18.3.5.5 virt-edit Edit source

virt-edit 是一个命令行工具,能够编辑位于命名虚拟机(或磁盘映像)中的文件。

18.3.5.6 virt-tar-in/out Edit source

virt-tar-in 将未压缩的 TAR 归档解压到虚拟机磁盘映像或命名的 libvirt 域。virt-tar-out 将虚拟机磁盘映像目录打包成 TAR 归档。

> virt-tar-out -a sles.qcow2 /home homes.tar

18.3.5.7 virt-copy-in/out Edit source

virt-copy-in 将文件和目录从本地磁盘复制到虚拟机磁盘映像或命名的 libvirt 域。virt-copy-out 将文件和目录从虚拟机磁盘映像或命名的 libvirt 域复制出来。

> virt-copy-in -a sles.qcow2 data.tar /tmp/
> virt-ls -a sles.qcow2 /tmp/
.ICE-unix
.X11-unix
data.tar

18.3.5.8 virt-log Edit source

virt-log 显示命名 libvirt 域、虚拟机或磁盘映像的日志文件。如果安装了 guestfs-winsupport 软件包,它还可以显示 Windows 虚拟机磁盘映像的事件日志。

> virt-log -a windows8.qcow2
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Events>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"><System><Provider Name="EventLog"></Provider>
<EventID Qualifiers="32768">6011</EventID>
<Level>4</Level>
<Task>0</Task>
<Keywords>0x0080000000000000</Keywords>
<TimeCreated SystemTime="2014-09-12 05:47:21"></TimeCreated>
<EventRecordID>1</EventRecordID>
<Channel>System</Channel>
<Computer>windows-uj49s6b</Computer>
<Security UserID=""></Security>
</System>
<EventData><Data><string>WINDOWS-UJ49S6B</string>
<string>WIN-KG190623QG4</string>
</Data>
<Binary></Binary>
</EventData>
</Event>

...

18.3.6 guestfish Edit source

guestfish 是一个用于检查和修改虚拟机文件系统的 shell 和命令行工具。它使用 libguestfs 并暴露 guestfs API 的所有功能。

用法示例

> guestfish -a disk.img <<EOF
run
list-filesystems
EOF
guestfish

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

Type: 'help' for help on commands
      'man' to read the manual
      'quit' to quit the shell

><fs> add sles.qcow2
><fs> run
><fs> list-filesystems
/dev/sda1: ext3
><fs> mount /dev/sda1 /
 cat /etc/fstab
devpts  /dev/pts          devpts  mode=0620,gid=5 0 0
proc    /proc             proc    defaults        0 0
sysfs   /sys              sysfs   noauto          0 0
debugfs /sys/kernel/debug debugfs noauto          0 0
usbfs   /proc/bus/usb     usbfs   noauto          0 0
tmpfs   /run              tmpfs   noauto          0 0
/dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part1 / ext3 defaults 1 1

18.3.7 将物理机转换为 KVM 客户机 Edit source

Libguestfs 提供工具来帮助将 Xen 虚拟机或物理机转换为 KVM 客户机。以下部分涵盖了一个特殊用例:将裸机转换为 KVM 机器。

openSUSE Leap 中,尚未支持将物理机转换为 KVM 机器。此功能仅作为技术预览发布。

将物理机转换为 KVM 机器需要收集有关它的信息并将其传输到转换服务器。通过在机器上运行预先准备好的 virt-p2v 和 KIWI 工具的实时系统来实现。

过程 18.2: 使用 virt-p2v
  1. 使用命令安装所需的软件包

    > sudo zypper in virt-p2v kiwi-desc-isoboot
    Note
    注意

    这些步骤记录了如何创建 ISO 映像以创建可启动 DVD。或者,您也可以创建 PXE 启动映像;有关使用 KIWI 构建 PXE 映像的更多信息,请参阅 man virt-p2v-make-kiwi

  2. 创建 KIWI 配置

    > virt-p2v-make-kiwi -o /tmp/p2v.kiwi

    -o 定义了创建 KIWI 配置的位置。

  3. 如果需要,请编辑生成配置中的 config.xml 文件。例如,在 config.xml 中调整实时系统的键盘布局。

  4. 使用 kiwi 构建 ISO 映像

    > kiwi --build /tmp/p2v.kiwi1 \
         -d /tmp/build2 \
         --ignore-repos \
         --add-repo http://URL_TO_REPOSITORIES3 \
         --type iso

    1

    在上一阶段生成 KIWI 配置的目录。

    2

    KIWI 将生成 ISO 映像和其他中间构建结果放置的目录。

    3

    软件包存储库的 URL,如使用 zypper lr -d 找到的。

    每个存储库使用一个 --add-repo 参数。

  5. 将 ISO 刻录到 DVD 或 USB 闪存盘。使用此类介质,启动要转换的机器。

  6. 系统启动后,输入 转换服务器 的连接详细信息。此服务器是一台安装了 virt-v2v 软件包的计算机。

    如果网络设置比 DHCP 客户端复杂,请单击 Configure network 按钮以打开 YaST 网络配置对话框。

    单击 Test connection 按钮以允许进入向导的下一页。

  7. 选择要转换的磁盘和网络接口,并定义 VM 数据,例如分配的 CPU 数量、内存和虚拟机名称。

    Note
    注意

    如果未定义,则创建的磁盘映像格式默认是 raw。可以通过在 Output format 字段中输入所需的格式来更改此设置。

    有两种生成虚拟机的方法:使用 locallibvirt 输出。第一种方法将虚拟机磁盘映像和配置放置在 Output storage 字段中定义的路径。然后可以使用 virsh 来定义新的 libvirt 处理的客户机。第二种方法创建了一个新的 libvirt 处理的客户机,其磁盘映像放置在 Output storage 字段中定义的池中。

    单击 Start conversion 开始转换。

18.4 故障排除 Edit source

18.4.1 Btrfs 相关问题 Edit source

在对具有 Btrfs 根分区的映像(openSUSE Leap 的默认设置)使用 guestfs 工具时,可能会显示以下错误消息

> virt-ls -a /path/to/sles12sp2.qcow2 /
virt-ls: multi-boot operating systems are not supported

If using guestfish '-i' option, remove this option and instead
use the commands 'run' followed by 'list-filesystems'.
You can then mount file systems you want by hand using the
'mount' or 'mount-ro' command.

If using guestmount '-i', remove this option and choose the
filesystem(s) you want to see by manually adding '-m' option(s).
Use 'virt-filesystems' to see what file systems are available.

If using other virt tools, multi-boot operating systems won't work
with these tools.  Use the guestfish equivalent commands
(see the virt tool manual page).

这通常是由客户机中存在快照引起的。在这种情况下,guestfs 不知道要引导哪个快照。要强制使用快照,请使用 -m 参数,如下所示

> virt-ls -m /dev/sda2:/:subvol=@/.snapshots/2/snapshot -a /path/to/sles12sp2.qcow2 /

18.4.2 环境 Edit source

在对 libguestfs 应用程序中的问题进行故障排除时,可以使用环境变量 LIBGUESTFS_DEBUG=1 来启用调试消息。要以类似于 guestfish 命令的格式输出每个命令/API 调用,请使用环境变量 LIBGUESTFS_TRACE=1

18.4.3 libguestfs-test-tool Edit source

libguestfs-test-tool 是一个测试程序,用于检查基本的 libguestfs 功能是否正常工作。它会打印大量诊断消息和 guestfs 环境的详细信息,然后创建一个测试映像并尝试启动它。如果它成功完成,在结尾附近应该会看到以下消息

===== TEST FINISHED OK =====

19 QEMU 客户机代理 Edit source

QEMU 客户代理 (GA) 在 VM 客户机内部运行,允许 VM 主机服务器通过 libvirt 在客户机操作系统中运行命令。它支持许多功能——例如,获取客户机文件系统的详细信息、冻结和解冻文件系统,或暂停或重新启动客户机。

QEMU GA 包含在 qemu-guest-agent 软件包中,并且默认在 KVM 虚拟机上安装、配置和激活。

QEMU GA 安装在 Xen 虚拟机中,但默认未激活。虽然可以与 Xen 虚拟机一起使用 QEMU GA,但没有像下面为 KVM 虚拟机描述的那样与 libvirt 集成。要将 QEMU GA 与 Xen 一起使用,必须将通道设备添加到 VM Guest 配置中。通道设备包含 VM Host Server 上的 Unix 套接字路径,用于与 QEMU GA 通信。

<channel type='unix'>
  <source mode='bind' path='/example/path'/>
  <target type='xen' name='org.qemu.guest_agent.0'/>
</channel>

19.1 运行 QEMU GA 命令 Edit source

QEMU GA 包含许多本机命令,这些命令没有直接的 libvirt 对应命令。请参阅 第 19.4 节,“更多信息” 以查找完整列表。您可以使用 libvirt 的通用命令 qemu-agent-command 来运行所有 QEMU GA 命令。

virsh qemu-agent-command DOMAIN_NAME '{"execute":"QEMU_GA_COMMAND"}'

例如

> sudo virsh qemu-agent-command sle15sp2 '{"execute":"guest-info"}' --pretty
{
"return": {
  "version": "4.2.0",
  "supported_commands": [
    {
      "enabled": true,
      "name": "guest-get-osinfo",
      "success-response": true
    },
[...]

19.2 virsh 命令,需要 QEMU GA Edit source

几个 virsh 命令需要 QEMU GA 来实现其功能。例如,以下命令

virsh guestinfo

从客户机的角度打印有关客户机的信息。

virsh guestvcpus

从客户机的角度查询或更改虚拟 CPU 的状态。

virsh set-user-password

设置客户机中用户帐户的密码。

virsh domfsinfo

显示运行域内挂载的文件系统列表。

virsh dompmsuspend

挂起运行中的客户机。

19.3 增强 libvirt 命令 Edit source

如果在客户机内部启用 QEMU GA,则几个 virsh 子命令在 agent 模式下运行时具有增强的功能。以下列表仅包含其中一些示例。有关完整列表,请参阅 virsh 手册页并搜索 agent 字符串。

virsh shutdown --mode agentvirsh reboot --mode agent

这种关机或重启方式使客户机在下次运行时保持干净状态,类似于 ACPI 方法。

virsh domfsfreezevirsh domfsthaw

指示客户机使文件系统静止—将缓存中的所有 I/O 操作刷新,并将卷保持在一致状态,以便在重新挂载它们时无需进行检查。

virsh setvcpus --guest

更改分配给客户机的 CPU 数量。

virsh domifaddr --source agent

查询 QEMU GA 以获取客户机的 IP 地址。

virsh vcpucount --guest

从客户机的角度打印有关虚拟 CPU 数量的信息。

19.4 更多信息 Edit source

20 软件 TPM 模拟器 Edit source

20.1 简介 Edit source

可信平台模块 (TPM) 是一个使用加密密钥保护硬件的加密处理器。对于使用 TPM 开发安全功能的开发人员来说,软件 TPM 模拟器是一个方便的解决方案。与硬件 TPM 设备相比,模拟器对可以访问它的客户机数量没有限制。此外,还可以轻松地在 TPM 版本 1.2 和 2.0 之间切换。QEMU 支持包含在 swtpm 软件包中的软件 TPM 模拟器。

20.2 先决条件 Edit source

在安装和使用软件 TPM 模拟器之前,需要安装 libvirt 虚拟化环境。请参阅 第 6.2 节,“安装虚拟化组件” 并安装提供的虚拟化解决方案之一。

20.3 安装 Edit source

要使用软件 TPM 模拟器,请安装 swtpm 软件包

> sudo zypper install swtpm

20.4 swtpm 与 QEMU 一起使用 Edit source

swtpm 提供三种接口类型:socketchardevcuse。本过程重点介绍 socket 接口。

  1. 在 VM 目录中创建一个名为 mytpm0 的目录来存储 TPM 状态—例如,/var/lib/libvirt/qemu/sle15sp3

    > sudo mkdir /var/lib/libvirt/qemu/sle15sp3/mytpm0
  2. 启动 swtmp。它创建一个 QEMU 可以使用的套接字文件—例如,/var/lib/libvirt/qemu/sle15sp3

     > sudo swtpm socket
      --tpmstate dir=/var/lib/libvirt/qemu/sle15sp3/mytpm0 \
      --ctrl type=unixio,path=/var/lib/libvirt/qemu/sle15sp3/mytpm0/swtpm-sock \
      --log level=20
    Tip
    提示:TPM 版本 2.0

    默认情况下,swtpm 启动 TPM 版本 1.2 模拟器,并将其状态存储在 tpm-00.permall 目录中。要创建 TPM 2.0 实例,请运行

     > sudo swtpm socket
      --tpm2
      --tpmstate dir=/var/lib/libvirt/qemu/sle15sp3/mytpm0 \
      --ctrl type=unixio,path=/var/lib/libvirt/qemu/sle15sp3/mytpm0/swtpm-sock \
      --log level=20

    TPM 2.0 状态存储在 tpm2-00.permall 目录中。

  3. 将以下命令行参数添加到 qemu-system-ARCH 命令

    > qemu-system-x86_64 \
    [...]
    -chardev socket,id=chrtpm,path=/var/lib/libvirt/qemu/sle15sp3/mytpm0/swtpm-sock \
    -tpmdev emulator,id=tpm0,chardev=chrtpm \
    -device tpm-tis,tpmdev=tpm0
  4. 通过运行以下命令验证 TPM 设备是否在客户机中可用

    > tpm_version
    TPM 1.2 Version Info:
    Chip Version:        1.2.18.158
    Spec Level:          2
    Errata Revision:     3
    TPM Vendor ID:       IBM
    TPM Version:         01010000
    Manufacturer Info:   49424d00

20.5 将 swtpm 与 libvirt 一起使用 Edit source

要将 swtpm 与 libvirt 一起使用,请将以下 TPM 设备添加到客户机 XML 规范中

<devices>
 <tpm model='tpm-tis'>
  <backend type='emulator' version='2.0'/>
 </tpm>
</devices>

libvirt 会自动为客户机启动 swtpm。您无需提前手动启动它。相应的 permall 文件创建在 /var/lib/libvirt/swtpm/VM_UUID 中。

20.6 使用 OVMF 固件进行 TPM 测量 Edit source

如果客户机使用 Open Virtual Machine Firmware (OVMF),它会用 TPM 测量组件。您可以在 /sys/kernel/security/tpm0/binary_bios_measurements 中找到事件日志。

20.7 资源 Edit source

21 创建 VM Guest 的崩溃转储 Edit source

21.1 简介 Edit source

每当虚拟机崩溃时,收集虚拟机的内存核心转储以便于调试和分析都很有用。对于物理机器,Kexec 和 Kdump 会负责收集崩溃转储。对于虚拟机,这取决于 Guest 是完全虚拟化 (FV) 还是准虚拟化 (PV)。

21.2 为完全虚拟化机器创建崩溃转储 Edit source

要查看完全虚拟化机器的崩溃转储,请使用与物理机相同的过程—Kexec 和 Kdump。

21.3 为半虚拟化机器创建崩溃转储 Edit source

与完全虚拟化机器不同,Kexec/Kdump 在半虚拟化机器中不起作用。PV 客户机的崩溃转储必须由主机工具堆栈执行。如果使用 Xen domUs 的 xl 工具堆栈,xl dump-core 命令会生成转储。对于基于 libvirt 的 VM Guest,virsh dump 命令提供相同的功能。

您可以通过 VM Guest 配置中的 on_crash 设置来配置核心转储的自动收集。此设置告诉主机工具堆栈 VM Guest 遇到崩溃时该做什么。在 xllibvirt 中的默认值均为 destroy。用于自动收集核心转储的有用选项是 coredump-destroycoredump-restart

21.4 其他信息 Edit source

  • 完全虚拟化和半虚拟化虚拟机之间的区别在 第 1.3 节,“虚拟化模式” 中进行了描述。

  • 有关 Kexec/Kdump 机制的详细信息包含在《系统分析与调优指南》一书的第 17 章“Kexec 和 Kdump”中。

  • 有关 xl 配置语法的信息,请参阅 xl.cfg 手册页(man 5 xl.cfg)。

  • 有关 libvirt XML 设置的详细信息,请参阅 https://libvirt.org/formatdomain.html#events-configuration。

第四部分 使用 Xen 管理虚拟机 Edit source

22 设置虚拟机主机

本节文档介绍了如何将 openSUSE Leap 15.5 设置为虚拟主机。

23 虚拟网络

VM Guest 系统需要特定的方式来与 VMGuest 系统或其他 VM Guest 系统或本地网络通信。VM Guest 系统的网络接口由一个拆分设备驱动程序组成,这意味着任何虚拟以太网设备在 Dom0 中都有一个对应的网络接口。此接口……

24 管理虚拟化环境

除了使用推荐的 libvirt 库(第二部分,“使用 libvirt 管理虚拟机”)之外,您还可以使用命令行中的 xl 工具来管理 Xen 客户机域。

25 Xen 中的块设备

26 虚拟化:配置选项和设置

本节文档描述了高级管理任务和配置选项,这些任务和选项可能有助于技术创新者实施最先进的虚拟化解决方案。提供这些内容仅供参考,并不意味着 Novell, Inc. 支持所有记录的选项和任务。

27 管理任务

28 XenStore:域之间共享的配置数据库

本节介绍 XenStore 的基本信息,包括它在 Xen 环境中的作用、XenStore 使用的文件目录结构以及 XenStore 命令的描述。

29 Xen 作为高可用性虚拟化主机

将两台 Xen 宿主机设置为故障转移系统,与每台服务器在专用硬件上运行的设置相比,具有多项优势。

30 Xen:将半虚拟化 (PV) 客户机转换为完全虚拟化 (FV/HVM) 客户机

本章解释了如何将 Xen 准虚拟化机器转换为 Xen 完全虚拟化机器。

22 设置虚拟机主机 Edit source

本节文档介绍了如何将 openSUSE Leap 15.5 设置为虚拟主机。

Dom0 的硬件要求通常与 openSUSE Leap 操作系统相同。应添加额外的 CPU、磁盘、内存和网络资源,以满足所有计划的 VM Guest 系统的资源需求。

Tip
提示:资源

请记住,虚拟机客户机与物理机一样,在运行速度更快的处理器上运行时以及能够访问更多系统内存时性能更好。

虚拟机主机需要安装几个软件包及其依赖项。要安装所有必需的软件包,请运行 YaST Software Management,选择 View › Patterns,然后选择 Xen Virtual Machine Host Server 进行安装。也可以使用 YaST 的 Virtualization › Install Hypervisor and Tools 模块进行安装。

安装 Xen 软件后,重新启动计算机,然后在启动屏幕上选择新添加的 Xen 内核选项。

更新可通过您的更新通道获得。为确保安装了最新的更新,请在安装完成后运行 YaST Online Update

22.1 最佳实践和建议 Edit source

在主机上安装和配置 openSUSE Leap 操作系统时,请注意以下最佳实践和建议

  • 如果主机始终运行为 Xen 主机,请运行 YaST System › Boot Loader 并将 Xen 启动项激活为默认启动部分。

    • 在 YaST 中,单击 System > Boot Loader

    • 将默认启动更改为 Xen 标签,然后单击 Set as Default

    • 单击 完成

  • 为获得最佳性能,仅应在虚拟机主机上安装虚拟化所需的应用程序和进程。

  • 如果您打算使用连接到 Xen 主机的看门狗设备,请一次只使用一个。建议使用具有实际硬件集成的驱动程序,而不是通用的软件驱动程序。

Note
注意:硬件监控

Dom0 内核是虚拟化运行的,因此像 irqbalancelscpu 这样的工具无法反映真实的硬件特性。

Important
重要提示:Xen 不支持受信任启动

Xen 不支持受信任启动 (Tboot)。为确保 Xen 主机正确启动,请验证 GRUB 2 配置对话框中的 Enable Trusted Boot Support 选项是否已停用。

22.2 管理 Dom0 内存 Edit source

openSUSE Leap 的早期版本中,Xen 主机的默认内存分配方案是将所有主机物理内存分配给 Dom0 并启用自动气球化。在启动其他域时,内存会自动从 Dom0 中气球化。这种行为一直容易出错,因此强烈建议禁用它。从 openSUSE Leap 15.1 开始,自动气球化默认已禁用,并且 Dom0 分配到主机物理内存的 10% + 1 GB。例如,在具有 32 GB 物理内存的主机上,为 Dom0 分配 4.2 GB 内存。

/etc/default/grub 中使用 dom0_mem Xen 命令行选项仍然支持并鼓励使用。您可以通过将 dom0_mem 设置为主机物理内存大小并在 /etc/xen/xl.conf 中启用 autoballoon 设置来恢复旧行为。

Warning
警告:Dom0 内存不足

为 Dom0 保留的内存量是运行在主机上的虚拟机数量的函数,因为 Dom0 为每个 VM Guest 提供后端网络和磁盘 I/O 服务。在计算 Dom0 内存分配时,还应考虑在 Dom0 中运行的其他工作负载。总的来说,Dom0 的内存大小确定应与其他虚拟机一样。

22.2.1 设置 Dom0 内存分配 Edit source

  1. 确定 Dom0 所需的内存分配。

  2. 在 Dom0 中,键入 xl info 查看机器上可用的内存量。可以通过 xl list 命令确定 Dom0 当前的内存分配。

  3. 编辑 /etc/default/grub 并调整 GRUB_CMDLINE_XEN 选项,使其包含 dom0_mem=MEM_AMOUNT。将 MEM_AMOUNT 替换为分配给 Dom0 的最大内存量。添加 KMG 来指定大小单位。例如

    GRUB_CMDLINE_XEN="dom0_mem=2G"
  4. 重新启动计算机以应用更改。

Tip
提示

有关 Xen 相关启动配置选项的更多详细信息,请参阅《参考》一书的第 12 章“GRUB 2 引导加载程序”,第 12.2.2 节“文件 /etc/default/grub

Warning
警告:Xen Dom0 内存

在使用 XL 工具堆栈和 GRUB 2 中 Xen hypervisor 的 dom0_mem= 选项时,需要在 etc/xen/xl.conf 中禁用 xl autoballoon。否则,启动 VM 会因无法气球化 Dom0 的错误而失败。因此,如果在 Xen 中指定了 dom0_mem= 选项,请将 autoballoon=0 添加到 xl.conf。另请参阅 Xen dom0 内存

22.3 完全虚拟化客户机中的网卡 Edit source

在完全虚拟化客户机中,默认网卡是模拟的 Realtek 网卡。但是,也可以使用拆分网络驱动程序来运行 Dom0 和 VM Guest 之间的通信。默认情况下,两个接口都呈现给 VM Guest,因为某些操作系统的驱动程序要求两者都存在。

在使用 openSUSE Leap 时,默认情况下 VM Guest 只能使用半虚拟化网卡。以下网络选项可用

emulated

要使用模拟网络接口(如模拟的 Realtek 网卡),请在域 xl 配置的 vif 设备部分指定 type=ioemu。示例如下配置:

vif = [ 'type=ioemu,mac=00:16:3e:5f:48:e4,bridge=br0' ]

有关 xl 配置的更多详细信息,请参阅 xl.conf 手册页 man 5 xl.conf

paravirtualized

当指定 type=vif 且未指定模型或类型时,将使用半虚拟化网络接口

vif = [ 'type=vif,mac=00:16:3e:5f:48:e4,bridge=br0,backen=0' ]
emulated and paravirtualized

如果管理员应同时提供这两个选项,只需指定类型和模型。xl 配置将如下所示

vif = [ 'type=ioemu,mac=00:16:3e:5f:48:e4,model=rtl8139,bridge=br0' ]

在这种情况下,虚拟机客户机中的一个网络接口应被禁用。

22.4 启动虚拟机主机 Edit source

如果虚拟化软件已正确安装,计算机将启动并显示 GRUB 2 引导加载程序,菜单中有一个 Xen 选项。选择此选项以启动虚拟机主机。

Warning
警告

启动 Xen 系统时,您可能会在 dom0 的 /var/log/messages 日志文件或 systemd 日志中看到类似以下内容的错误消息

isst_if_mbox_pci: probe of 0000:ff:1e.1 failed with error -5
isst_if_pci: probe of 0000:fe:00.1 failed with error -5

忽略它们,因为它们无害,并且是由 ISST 驱动程序不为虚拟机提供任何电源或频率缩放功能引起的。

Note
注意:Xen 和 Kdump

在 Xen 中,hypervisor 管理内存资源。如果您需要为 Dom0 中的恢复内核保留系统内存,则必须由 hypervisor 保留此内存。因此,必须将 crashkernel=size 参数添加到 kernel 行,而不是使用带有其他引导参数的行。

有关 crashkernel 参数的更多信息,请参阅《系统分析与调优指南》一书的第 17 章“Kexec 和 Kdump”,第 17.4 节“计算 crashkernel 分配大小”

如果 GRUB 2 菜单中没有 Xen 选项,请回顾安装步骤并验证 GRUB 2 引导加载程序是否已更新。如果在未选择 Xen 模式的情况下完成安装,请运行 YaST Software Management,选择 Patterns 过滤器,然后选择 Xen Virtual Machine Host Server 进行安装。

引导 hypervisor 后,Dom0 虚拟机将启动并显示其图形桌面环境。如果您未安装图形桌面,则会显示命令行环境。

Tip
提示:图形问题

有时可能会出现图形系统无法正常工作的情况。在这种情况下,请在引导参数中添加 vga=ask。要激活永久设置,请使用 vga=mode-0x???,其中 ??? 计算为 0x100 + VESA 模式,来自 http://en.wikipedia.org/wiki/VESA_BIOS_Extensions,例如 vga=mode-0x361

在开始安装虚拟客户机之前,请确保系统时间正确。为此,请在控制域上配置 NTP(网络时间协议)

  1. 在 YaST 中选择 Network Services › NTP Configuration

  2. 选择在启动期间自动启动 NTP 守护程序的选项。提供现有 NTP 时间服务器的 IP 地址,然后单击 Finish

Note
注意:虚拟机客户机上的时间服务

硬件时钟不精确。所有现代操作系统都会尝试通过额外的计时源通过硬件时间进行系统时间校正。为了在所有 VM Guest 系统上获得正确的时间,还应在每个相应的客户机上激活网络时间服务,或确保客户机使用主机的系统时间。有关 openSUSE LeapIndependent Wallclocks 的更多信息,请参阅 第 17.2 节,“Xen 虚拟机时钟设置”

有关管理虚拟机的更多信息,请参阅 第 24 章,“管理虚拟化环境”

22.5 PCI 直通 Edit source

为了充分利用 VM Guest 系统,有时需要将特定的 PCI 设备分配给专用域。在使用完全虚拟化客户机时,仅当系统的芯片组支持此功能并在 BIOS 中激活时,此功能才可用。

此功能在 AMD* 和 Intel* 上均可用。对于 AMD 机器,该功能称为 IOMMU。在 Intel 术语中,这是 VT-d。请注意,Intel-VT 技术不足以将此功能用于完全虚拟化的客户机。为确保您的计算机支持此功能,请向供应商明确要求提供支持 PCI 直通的系统。

限制
  • 某些图形驱动程序使用高度优化的 DMA 访问方式。这不受支持,因此使用图形卡可能很困难。

  • 访问 PCIe 桥后面的 PCI 设备时,所有 PCI 设备必须分配给单个客户机。此限制不适用于 PCIe 设备。

  • 具有专用 PCI 设备的客户机无法实时迁移到另一台主机。

PCI 直通的配置分为两部分。首先,必须在启动时告知 hypervisor PCI 设备应可用于重新分配。其次,必须将 PCI 设备分配给 VM Guest。

22.5.1 配置 hypervisor 以进行 PCI 直通 Edit source

  1. 选择要重新分配给 VM Guest 的设备。为此,请运行 lspci -k,并读取设备编号以及分配给该设备的原始模块名称

    06:01.0 Ethernet controller: Intel Corporation Ethernet Connection I217-LM (rev 05)
            Subsystem: Dell Device 0617
            Kernel driver in use: e1000e
            Kernel modules: e1000e

    在这种情况下,PCI 编号为 (06:01.0),依赖的内核模块为 e1000e

  2. 指定模块依赖项,以确保 xen_pciback 是控制该设备的第一个模块。创建一个名为 /etc/modprobe.d/50-e1000e.conf 的文件,内容如下

    install e1000e /sbin/modprobe xen_pciback ; /sbin/modprobe \
     --first-time --ignore-install e1000e
  3. 使用 hide 选项指示 xen_pciback 模块控制该设备。编辑或创建 /etc/modprobe.d/50-xen-pciback.conf,内容如下

    options xen_pciback hide=(06:01.0)
  4. 重新启动系统。

  5. 使用以下命令检查设备是否在可分配设备列表中

    xl pci-assignable-list

22.5.1.1 使用 xl 进行动态分配 Edit source

为了避免重新启动主机系统,您可以使用 xl 进行动态分配来使用 PCI 直通。

首先,请确保 dom0 已加载 pciback 模块

> sudo modprobe pciback

然后使用 xl pci-assignable-add 使设备可分配。例如,要使设备 06:01.0 可用于客户机,请运行命令

> sudo xl pci-assignable-add 06:01.0

22.5.2 将 PCI 设备分配给 VM Guest 系统 Edit source

有几种可能性可以将 PCI 设备专用于 VM Guest

在安装时添加设备

安装期间,将 pci 行添加到配置文件

pci=['06:01.0']
将 PCI 设备热插拔到 VM Guest 系统

可以使用 xl 命令即时添加或删除 PCI 设备。要将设备编号 06:01.0 添加到名为 sles12 的客户机,请使用

xl pci-attach sles12 06:01.0
将 PCI 设备添加到 Xend

要将设备永久添加到客户机,请将以下代码段添加到客户机配置文件

pci = [ '06:01.0,power_mgmt=1,permissive=1' ]

将 PCI 设备分配给 VM Guest 后,客户机系统必须负责该设备的配置和设备驱动程序。

22.5.3 VGA 直通 Edit source

Xen 4.0 及更高版本支持完全虚拟化 VM Guest 上的 VGA 图形适配器直通。客户机可以完全控制图形适配器,实现高性能的 3D 和视频加速。

限制
  • VGA 直通功能类似于 PCI 直通,因此也需要主板芯片组和 BIOS 支持 IOMMU(或 Intel VT-d)。

  • 只有主图形适配器(计算机开机时使用的适配器)才能与 VGA 直通一起使用。

  • VGA 直通仅支持完全虚拟化客户机。不支持半虚拟化客户机 (PV)。

  • 使用 VGA 直通的图形卡不能在多个 VM Guest 之间共享—您只能将其专用于一个客户机。

要启用 VGA 直通,请将以下设置添加到您的完全虚拟化客户机配置文件

gfx_passthru=1
pci=['yy:zz.n']

其中 yy:zz.n 是在 Dom0 上使用 lspci -v 找到的 VGA 图形适配器的 PCI 控制器 ID。

22.5.4 故障排除 Edit source

在某些情况下,VM Guest 的安装过程中可能会出现问题。本节描述了几个已知问题及其解决方案。

引导时,系统挂起

软件 I/O 翻译缓冲区在引导过程的早期分配了大量低内存。如果内存请求超过缓冲区的大小,可能会导致引导过程挂起。要检查是否是这种情况,请切换到控制台 10 并检查那里的输出,看是否有类似以下的消息

kernel: PCI-DMA: Out of SW-IOMMU space for 32768 bytes at device 000:01:02.0

在此情况下,您需要增加 swiotlb 的大小。在 Dom0 的命令行中添加 swiotlb=VALUE(其中 VALUE 指定为 slab 条目数)。该数值可以上下调整,以找到适合该机器的最佳大小。

Note
注意:swiotlb 一个 PV 客户机

对于 PCI 设备在 PV 客户机上的 DMA 访问,需要 swiotlb=force 内核参数才能正常工作。有关 IOMMU 和 swiotlb 选项的更多信息,请参阅 kernel-source 包中的 boot-options.txt 文件。

22.6 USB 直通 Edit source

有两种方法可以将单个主机 USB 设备直通给客户机。第一种是通过模拟的 USB 设备控制器,第二种是使用 PVUSB。

22.6.1 识别 USB 设备 Edit source

在将 USB 设备直通给虚拟机客户机之前,您需要在 VM 主机服务器上识别它。使用 lsusb 命令列出主机系统上的 USB 设备。

# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0461:4d15 Primax Electronics, Ltd Dell Optical Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

例如,要直通 Dell 鼠标,请指定 vendor_id:device_id(0461:4d15)形式的设备标签或 bus.device(2.3)形式的总线地址。请记住删除前导零,否则 xl 会将数字解释为八进制值。

22.6.2 模拟 USB 设备 Edit source

在模拟 USB 中,设备模型(QEMU)会向客户机呈现一个模拟的 USB 控制器。USB 设备随后由 Dom0 控制,同时 USB 命令在虚拟机客户机和主机 USB 设备之间进行翻译。此方法仅适用于完全虚拟化的域 (HVM)。

使用 usb=1 选项启用模拟的 USB 集线器。然后,在配置文件中的设备列表中与其他模拟设备一起使用 host:USBID 指定设备。例如:

usb=1
usbdevice=['tablet','host:2.3','host:0424:460']

26.6.3 半虚拟化 PVUSB Edit source

PVUSB 是一种用于从 dom0 到虚拟化客户机的 USB 直通的新型高性能方法。使用 PVUSB,有两种方法可以向客户机添加 USB 设备:

  • 在域创建时通过配置文件

  • 在虚拟机运行时通过热插拔

PVUSB 使用半虚拟化的前端和后端接口。PVUSB 支持 USB 1.1 和 USB 2.0,并且适用于 PV 和 HVM 客户机。要使用 PVUSB,您的客户机操作系统中需要有 usbfront,在 dom0 中需要有 usbback 或在 qemu 中需要有 usb 后端。在 openSUSE Leap 中,USB 后端随 qemu 提供。

从 Xen 4.7 开始,引入了 xl PVUSB 支持和热插拔支持。

在配置文件中,使用 usbctrlusbdev 指定 USB 控制器和 USB 主机设备。例如,对于 HVM 客户机:

usbctrl=['type=qusb,version=2,ports=4', 'type=qusb,version=1,ports=4', ]
usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ]
Note
注意

对于 HVM 客户机的控制器,指定 type=qusb 非常重要。

要管理热插拔 PVUSB 设备,请使用 usbctrl-attachusbctrl-detachusb-listusbdev-attachusb-detach 子命令。例如:

创建一个版本为 USB 1.1 且有 8 个端口的 USB 控制器。

# xl usbctrl-attach test_vm version=1 ports=8 type=qusb

在域中找到第一个可用的控制器:端口,并将其连接到总线号:设备号为 2:3 的 USB 设备;您也可以指定 controllerport

# xl usbdev-attach test_vm hostbus=2 hostaddr=3

显示域中的所有 USB 控制器和 USB 设备。

# xl usb-list test_vm
Devid  Type   BE  state usb-ver ports
0      qusb   0   1     1       8
  Port 1: Bus 002 Device 003
  Port 2:
  Port 3:
  Port 4:
  Port 5:
  Port 6:
  Port 7:
  Port 8:

分离控制器 0 端口 1 下的 USB 设备。

# xl usbdev-detach test_vm 0 1

移除具有指定 dev_id 的 USB 控制器及其下的所有 USB 设备。

# xl usbctrl-detach test_vm dev_id

有关更多信息,请参阅 https://wiki.xenproject.org/wiki/Xen_USB_Passthrough

23 虚拟网络 Edit source

虚拟机客户机系统需要特定的方式来与其他虚拟机客户机系统或本地网络进行通信。虚拟机客户机系统的网络接口由一个分离的设备驱动程序组成,这意味着任何虚拟以太网设备都有一个对应的 Dom0 中的网络接口。此接口被设置为访问运行在 Dom0 中的虚拟网络。openSUSE Leap 的系统配置中已完全集成了桥接虚拟网络,并且可以使用 YaST 进行配置。

安装 Xen VM 主机服务器时,会在正常的网络配置期间提供一个桥接网络配置。用户可以选择在安装期间更改配置,并根据本地需求进行自定义。

如果需要,可以在执行了默认的物理服务器安装之后,使用 YaST 中的 安装 Hypervisor 和工具模块来安装 Xen VM 主机服务器。此模块准备系统以托管虚拟机,包括调用默认的桥接网络建议。

如果使用 rpmzypper 手动安装了 Xen VM 主机服务器所需的软件包,则其余的系统配置需要由管理员手动完成或使用 YaST 完成。

openSUSE Leap 默认不使用 Xen 提供的网络脚本。它们仅作为参考提供,但已禁用。在 openSUSE Leap 中使用的网络配置是通过 YaST 系统配置实现的,类似于 openSUSE Leap 中网络接口的配置。

有关管理网络桥接的更多一般信息,请参阅 Section 8.1.1, “网络桥接”

23.1 客户机系统的网络设备 Edit source

Xen hypervisor 可以为虚拟机客户机系统提供不同类型的网络接口。首选网络设备应为半虚拟化网络接口。这可以提供最高的传输速率和最低的系统要求。每个虚拟机客户机最多可提供八个网络接口。

不了解半虚拟化硬件的系统可能没有此选项。要将只能运行完全虚拟化的系统连接到网络,可以使用以下几种模拟网络接口:

  • Realtek 8139 (PCI)。这是默认的模拟网卡。

  • AMD PCnet32 (PCI)

  • NE2000 (PCI)

  • NE2000 (ISA)

  • Intel e100 (PCI)

  • Intel e1000 及其变体 e1000-82540em、e1000-82544gc、e1000-82545em (PCI)

所有这些网络接口都是软件接口。由于每个网络接口都必须具有唯一的 MAC 地址,因此已为 Xensource 分配了一个地址范围,可供这些接口使用。

Tip
提示:虚拟网络接口和 MAC 地址

虚拟化环境中的 MAC 地址的默认配置会创建一个随机 MAC 地址,看起来像 00:16:3E:xx:xx:xx。通常,可用的 MAC 地址数量应该足够以确保只获得唯一的地址。但是,如果您有大量的安装,或者为了确保随机 MAC 地址分配不会引起任何问题,您也可以手动分配这些地址。

出于调试或系统管理目的,了解 Dom0 中的哪个虚拟接口连接到运行客户机中的哪个以太网设备可能很有用。此信息可以从 Dom0 中的设备命名读取。所有虚拟设备都遵循 vif<domain number>.<interface_number> 规则。

例如,要了解 ID 为 5 的虚拟机的第三个接口(eth2)的设备名称,Dom0 中的设备将是 vif5.2。要获取所有可用接口的列表,请运行 ip a 命令。

设备命名不包含有关此接口连接到哪个桥接器的任何信息。但是,此信息在 Dom0 中可用。要获取有关哪个接口连接到哪个桥接器的概述,请运行 bridge link 命令。输出可能如下所示:

> sudo bridge link
2: eth0 state DOWN : <NO-CARRIER,BROADCAST,MULTICAST,SLAVE,UP> mtu 1500 master br0
3: eth1 state UP : <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 master br1

在此示例中,有三个配置的桥接器:br0br1br2。当前,br0br1 各自添加了一个真实的以太网设备:分别是 eth0eth1

23.2 Xen 中的基于主机的路由 Edit source

Xen 可以设置为在控制域 Dom0 中使用基于主机的路由,尽管 YaST 对此支持尚不完善,并且需要手动编辑一些配置文件。因此,这是一项需要高级管理员的任务。

以下配置仅在使用固定 IP 地址时有效。使用 DHCP 在此过程中不可行,因为 IP 地址必须同时为虚拟机客户机和 VM 主机服务器系统所知。

创建路由客户机的最简单方法是将网络从桥接网络更改为路由网络。作为以下过程的先决条件,必须安装具有桥接网络设置的虚拟机客户机。例如,VM 主机服务器名为 earth,IP 地址为 192.168.1.20,VM 客户机名为 alice,IP 地址为 192.168.1.21。

Procedure 23.1: 配置路由的 IPv4 虚拟机客户机
  1. 确保 alice 已关闭。使用 xl 命令关闭和检查。

  2. 在 VM 主机服务器 earth 上准备网络配置。

    1. 创建热插拔接口以路由流量。为此,创建一个名为 /etc/sysconfig/network/ifcfg-alice.0 的文件,内容如下:

      NAME="Xen guest alice"
      BOOTPROTO="static"
      STARTMODE="hotplug"
    2. 确保 IP 转发已启用。

      1. 在 YaST 中,转到 网络设置 › 路由

      2. 进入 路由选项卡,然后激活 启用 IPv4 转发启用 IPv6 转发选项。

      3. 确认设置并退出 YaST。

    3. firewalld 应用以下配置:

      • 将 alice.0 添加到 public 区域的设备中。

        > sudo firewall-cmd --zone=public --add-interface=alice.0
      • 告知防火墙应转发哪个地址。

        > sudo firewall-cmd --zone=public \
        --add-forward-port=port=80:proto=tcp:toport=80:toaddr="192.168.1.21/32,0/0"
      • 使运行时配置更改永久生效。

        > sudo firewall-cmd --runtime-to-permanent
    4. 向 alice 的接口添加静态路由。为此,请将以下行添加到 /etc/sysconfig/network/routes 的末尾:

      192.168.1.21  -  -  alice.0
    5. 为确保 VM 主机服务器连接到的交换机和路由器了解路由接口,请在 earth 上激活 proxy_arp。将以下行添加到 /etc/sysctl.conf

      net.ipv4.conf.default.proxy_arp = 1
      net.ipv4.conf.all.proxy_arp = 1
    6. 使用以下命令激活所有更改:

      > sudo systemctl restart systemd-sysctl wicked
  3. 继续配置 VM 客户机的 Xen 配置,方法如 Section 24.1, “XL—Xen 管理工具” 中所述,修改 vif 接口配置。对在过程中生成文本文件进行以下更改:

    1. 删除代码段。

      bridge=br0
    2. 并添加以下代码段:

      vifname=vifalice.0

      或者

      vifname=vifalice.0=emu

      对于完全虚拟化的域。

    3. 将用于设置接口的脚本更改为以下内容:

      script=/etc/xen/scripts/vif-route-ifup
    4. 激活新配置并启动 VM 客户机。

  4. 其余配置任务必须在 VM 客户机内部完成。

    1. 使用 xl console DOMAIN 打开虚拟机客户机的控制台并登录。

    2. 检查客户机 IP 是否设置为 192.168.1.21。

    3. 为虚拟机客户机提供到 VM 主机服务器的主机路由和默认网关。为此,请将以下行添加到 /etc/sysconfig/network/routes

      192.168.1.20 - - eth0
      default 192.168.1.20 - -
  5. 最后,测试从 VM 客户机到外部世界的网络连接,以及从网络到您的 VM 客户机的连接。

23.3 创建伪装网络设置 Edit source

创建伪装网络设置与路由设置类似。但是,不需要 proxy_arp,并且某些防火墙规则有所不同。要创建一个到 IP 地址为 192.168.100.1 的客户机 dolly 的伪装网络,其中主机在其外部接口上是 br0,请按以下步骤操作。为了简化配置,仅修改已安装的客户机以使用伪装网络。

Procedure 23.2: 配置伪装的 IPv4 虚拟机客户机
  1. 使用 xl shutdown DOMAIN 关闭 VM 客户机系统。

  2. 在 VM 主机服务器上准备网络配置。

    1. 创建一个热插拔接口以路由流量。为此,创建一个名为 /etc/sysconfig/network/ifcfg-dolly.0 的文件,内容如下:

      NAME="Xen guest dolly"
      BOOTPROTO="static"
      STARTMODE="hotplug"
    2. 编辑 /etc/sysconfig/SuSEfirewall2 文件并添加以下配置:

      • 将 dolly.0 添加到 FW_DEV_DMZ 中的设备。

        FW_DEV_DMZ="dolly.0"
      • 在防火墙中启用路由。

        FW_ROUTE="yes"
      • 在防火墙中启用伪装。

        FW_MASQUERADE="yes"
      • 告知防火墙哪个网络应该被伪装。

        FW_MASQ_NETS="192.168.100.1/32"
      • 从伪装异常中移除网络。

        FW_NOMASQ_NETS=""
      • 最后,使用以下命令重启防火墙:

        > sudo systemctl restart SuSEfirewall2
    3. 向 dolly 的接口添加静态路由。为此,请将以下行添加到 /etc/sysconfig/network/routes 的末尾:

      192.168.100.1 - - dolly.0
    4. 使用以下命令激活所有更改:

      > sudo systemctl restart wicked
  3. 继续配置 VM 客户机的 Xen 配置。

    1. Section 24.1, “XL—Xen 管理工具” 中所述,修改 dolly 的 vif 接口配置。

    2. 移除条目:

      bridge=br0
    3. 并添加以下代码段:

      vifname=vifdolly.0
    4. 将用于设置接口的脚本更改为以下内容:

      script=/etc/xen/scripts/vif-route-ifup
    5. 激活新配置并启动 VM 客户机。

  4. 剩余的配置任务必须在 VM 客户机内部完成。

    1. 使用 xl console DOMAIN 打开虚拟机客户机的控制台并登录。

    2. 检查客户机 IP 是否设置为 192.168.100.1。

    3. 为虚拟机客户机提供到 VM 主机服务器的主机路由和默认网关。为此,请将以下行添加到 /etc/sysconfig/network/routes

      192.168.1.20 - - eth0
      default 192.168.1.20 - -
  5. 最后,测试从 VM 客户机到外部世界的网络连接。

23.4 特殊配置 Edit source

Xen 提供了许多网络配置可能性。以下配置默认未启用:

23.4.1 虚拟网络中的带宽限制 Edit source

使用 Xen,您可以限制虚拟机可以用来访问桥接器的网络传输速率。要配置此项,您需要按照 Section 24.1, “XL—Xen 管理工具” 中的说明修改 VM 客户机配置。

在配置文件中,首先查找连接到虚拟桥接器的设备。配置如下所示:

vif = [ 'mac=00:16:3e:4f:94:a9,bridge=br0' ]

要添加最大传输速率,请向此配置添加 rate 参数,如下所示:

vif = [ 'mac=00:16:3e:4f:94:a9,bridge=br0,rate=100Mb/s' ]

速率可以是 Mb/s(兆比特每秒)或 MB/s(兆字节每秒)。在上面的示例中,虚拟接口的最大传输速率为 100 兆比特。默认情况下,客户机到虚拟桥接器的带宽没有限制。

还可以通过指定用于定义信用补充粒度的时段来微调行为:

vif = [ 'mac=00:16:3e:4f:94:a9,bridge=br0,rate=100Mb/s@20ms' ]

23.4.2 监控网络流量 Edit source

要监控特定接口上的流量,小应用程序 iftop 是一个不错的程序,它可以在终端中显示当前网络流量。

运行 Xen VM 主机服务器时,需要定义被监控的接口。Dom0 用于访问物理网络的接口是桥接设备,例如 br0。但是,这可能会因您的系统而异。要监控到物理接口的所有流量,请以 root 用户身份运行终端并使用以下命令:

iftop -i br0

要监控特定 VM 客户机的特殊网络接口的网络流量,请提供正确的虚拟接口。例如,要监控 ID 为 5 的域的第一个以太网设备,请使用以下命令:

ftop -i vif5.0

要退出 iftop,请按 Q 键。有关更多选项和可能性,请参阅手册页 man 8 iftop

24 管理虚拟化环境 Edit source

除了使用推荐的 libvirt 库(第二部分,“使用 libvirt 管理虚拟机”)之外,您还可以使用命令行中的 xl 工具来管理 Xen 客户机域。

24.1 XL—Xen 管理工具 Edit source

xl 程序是用于管理 Xen 客户机域的工具。它是 xen-tools 包的一部分。xl 基于 LibXenlight 库,可用于通用的域管理,如域创建、列表、暂停或关机。您需要是 root 用户才能执行 xl 命令。

Note
注意

xl 只能管理由其配置文件指定的正在运行的客户机域。如果客户机域未运行,则无法使用 xl 管理它。

Tip
提示

为了让用户继续以旧版 xm 命令允许的方式管理客户机域,我们现在推荐使用 libvirtvirshvirt-manager 工具。有关更多信息,请参阅 Part II, “使用 libvirt 管理虚拟机”

xl 操作依赖于 xenstoredxenconsoled 服务。确保在启动时启动它们:

> systemctl start xencommons

在启动时初始化 xl 所需的所有守护程序。

Tip
提示:在主机域中设置 xenbr0 网络桥接。

在最常见的网络配置中,您需要在主机域中设置一个名为 xenbr0 的桥接器,以便为客户机域提供可工作的网络。

每个 xl 命令的基本结构是:

xl <subcommand> [options] domain_id

其中 <subcommand> 是要运行的 xl 命令,domain_id 是分配给域的 ID 号或虚拟机的名称,而 OPTIONS 表示特定于子命令的选项。

有关可用 xl 子命令的完整列表,请运行 xl help。每个命令都有更详细的帮助,可以通过额外的参数 --help 获取。有关相应子命令的更多信息,请参阅 xl 的手册页。

例如,xl list --help 显示了 list 命令的所有可用选项。例如,xl list 命令显示所有虚拟机的状态。

> sudo xl list
Name                                 ID    Mem VCPUs        State   Time(s)
Domain-0                              0    457     2       r-----   2712.9
sles12                                7    512     1       -b----     16.3
opensuse                                   512     1                  12.9

State 信息表示机器是否正在运行以及处于什么状态。最常见的标志是 r(运行)和 b(阻塞),其中阻塞表示它正在等待 IO 或已停止工作。有关状态标志的更多详细信息,请参阅 man 1 xl

其他有用的 xl 命令包括:

  • xl create 从给定的配置文件创建虚拟机。

  • xl reboot 重启虚拟机。

  • xl destroy 立即终止虚拟机。

  • xl block-list 显示附加到虚拟机的虚拟块设备。

24.1.1 客户机域配置文件 Edit source

在操作域时,xl 需要每个域的域配置文件。存储此类配置文件的默认目录是 /etc/xen/

域配置文件是纯文本文件。它由多个 KEY=VALUE 对组成。某些键是必需的。通用键适用于任何客户机,而特定键仅适用于特定客户机类型(半虚拟化或完全虚拟化)。值可以是单引号或双引号包围的 "string"、数字、布尔值,或用方括号 [ value1, value2, ... ] 包围的多个值列表。

Example 24.1: SLED 12 的客户机域配置文件: /etc/xen/sled12.cfg
name= "sled12"
builder = "hvm"
vncviewer = 1
memory = 512
disk = [ '/var/lib/xen/images/sled12.raw,,hda', '/dev/cdrom,,hdc,cdrom' ]
vif = [ 'mac=00:16:3e:5f:48:e4,model=rtl8139,bridge=br0' ]
boot = "n"

要启动这样的域,请运行 xl create /etc/xen/sled12.cfg

24.2 客户机域自动启动 Edit source

要使客户机域在主机系统启动后自动启动,请执行以下步骤:

  1. 创建客户机域配置文件(如果不存在),并将其保存在 /etc/xen/ 目录中,例如 /etc/xen/domain_name.cfg

  2. auto/ 子目录中创建客户机域配置文件的符号链接。

    > sudo ln -s /etc/xen/domain_name.cfg /etc/xen/auto/domain_name.cfg
  3. 在下次系统启动时,将启动 domain_name.cfg 中定义的客户机域。

24.3 事件操作 Edit source

在客户机域配置文件中,您可以定义在预定义事件集上执行的操作。例如,要指示域在关机后重新启动自身,请在其配置文件中包含以下行:

on_poweroff="restart"

以下是客户机域预定义事件的列表:

事件列表
on_poweroff

指定如果域自行关闭,应如何处理该域。

on_reboot

如果域因请求重启的原因代码而关闭时要执行的操作。

on_watchdog

如果域因 Xen 看门狗超时而关闭时要执行的操作。

on_crash

如果域崩溃时要执行的操作。

对于这些事件,您可以定义以下操作之一:

相关操作列表
destroy

销毁域。

重新启动

销毁域并立即使用相同配置创建新域。

rename-restart

重命名已终止的域,然后立即使用与原始域相同的配置创建新域。

preserve

保留域。可以对其进行检查,然后使用 xl destroy 进行销毁。

coredump-destroy

将域的核心转储写入 /var/xen/dump/NAME,然后销毁域。

coredump-restart

将域的核心转储写入 /var/xen/dump/NAME,然后重启域。

24.4 时间戳计数器 Edit source

可以在客户机域配置文件中为每个域指定时间戳计数器(TSC)(有关更多信息,请参阅 Section 24.1.1, “客户机域配置文件”)。

使用 tsc_mode 设置,您可以指定 rdtsc 指令是“原生”执行(快速,但对 TSC 敏感的应用程序有时可能运行不正确)还是模拟执行(始终运行正确,但性能可能会受到影响)。

tsc_mode=0(默认)

使用此设置可确保正确性,同时提供最佳性能——有关更多信息,请参阅 https://xenbits.xen.org/docs/4.3-testing/misc/tscmode.txt

tsc_mode=1(始终模拟)

在运行 TSC 敏感应用程序且最坏情况性能下降是已知且可接受的情况下使用此选项。

tsc_mode=2(从不模拟)

在运行在此 VM 中的所有应用程序都对 TSC 具有弹性并且需要最高性能时使用此选项。

tsc_mode=3(PVRDTSCP)

高 TSC 频率应用程序可以半虚拟化(修改)以同时获得正确性和最高性能——任何未修改的应用程序都必须对 TSC 具有弹性。

有关背景信息,请参阅 https://xenbits.xen.org/docs/4.3-testing/misc/tscmode.txt

24.5 保存虚拟机 Edit source

Procedure 24.1: 保存虚拟机的当前状态
  1. 确保要保存的虚拟机正在运行。

  2. 在主机环境中,输入:

    > sudo xl save ID STATE-FILE

    其中 ID 是您要保存的虚拟机 ID,而 STATE-FILE 是您为内存状态文件指定的名称。默认情况下,创建快照后域将不再运行。使用 -c 可以在创建快照后仍保持其运行。

24.6 恢复虚拟机 Edit source

Procedure 24.2: 恢复虚拟机的当前状态
  1. 确保要恢复的虚拟机自上次运行保存操作以来尚未启动。

  2. 在主机环境中,输入:

    > sudo xl restore STATE-FILE

    其中 STATE-FILE 是先前保存的内存状态文件。默认情况下,域在恢复后运行。要在恢复后暂停它,请使用 -p

24.7 虚拟机状态 Edit source

可以通过查看 xl list 命令的结果来显示虚拟机的状态,该命令使用单个字符缩写状态。

  • r - running - 虚拟机当前正在运行并占用分配的资源。

  • b - blocked - 虚拟机处理器未运行且无法运行。它正在等待 I/O 或已停止工作。

  • p - paused - 虚拟机已暂停。它不与 hypervisor 交互,但仍然保留其分配的资源,例如内存。

  • s - shutdown - 客户机操作系统正在关闭、重启或挂起过程中,并且虚拟机正在停止。

  • c - crashed - 虚拟机已崩溃且未运行。

  • d - dying - 虚拟机正在关闭或崩溃。

25 Xen 中的块设备 Edit source

25.1 将物理存储映射到虚拟磁盘 Edit source

Xen 域在域配置文件中的磁盘规范与以下示例一样简单:

disk = [ 'format=raw,vdev=hdc,access=ro,devtype=cdrom,target=/root/image.iso' ]

它基于 /root/image.iso 磁盘映像文件定义了一个磁盘块设备。客户机将其视为 hdc,具有只读(ro)访问权限。设备类型为 cdrom,格式为 raw

以下示例定义了一个相同的设备,但使用了简化的位置语法:

disk = [ '/root/image.iso,raw,hdc,ro,cdrom' ]

您可以在同一行中包含更多磁盘定义,每个定义用逗号分隔。如果未指定参数,则使用其默认值。

disk = [ '/root/image.iso,raw,hdc,ro,cdrom','/dev/vg/guest-volume,,hda','...' ]
参数列表
target

源块设备或磁盘映像路径。

format

映像文件的格式。默认值为 raw

vdev

客户机看到的虚拟设备。支持的值为 hd[x]、xvd[x]、sd[x] 等。有关更多详细信息,请参阅 /usr/share/doc/packages/xen/misc/vbd-interface.txt。此参数是必需的。

access

块设备是否以只读或读写模式提供给客户机。支持的值为 ror 表示只读,rww 表示读写访问。对于 devtype=cdrom,默认值为 ro;对于其他设备类型,默认值为 rw

devtype

限定虚拟设备类型。支持的值为 cdrom

backendtype

要使用的后端实现。支持的值为 phytapqdisk。通常不应指定此选项,因为后端类型是自动确定的。

script

指定 target 不是普通主机路径,而是由可执行程序解释的信息。如果脚本文件未指向绝对路径,则会在 /etc/xen/scripts 中查找指定的脚本文件。这些脚本通常称为 block-<script_name>

有关指定虚拟磁盘的更多信息,请参阅 /usr/share/doc/packages/xen/misc/xl-disk-configuration.txt

25.2 将网络存储映射到虚拟磁盘 Edit source

与映射本地磁盘映像(请参阅 Section 25.1, “将物理存储映射到虚拟磁盘”)类似,您也可以将网络磁盘映射为虚拟磁盘。

以下示例显示了具有多个 Ceph 监视器并启用了 cephx 身份验证的 RBD(RADOS 块设备)磁盘的映射:

disk = [ 'vdev=hdc, backendtype=qdisk, \
target=rbd:libvirt-pool/new-libvirt-image:\
id=libvirt:key=AQDsPWtW8JoXJBAAyLPQe7MhCC+JPkI3QuhaAw==:auth_supported=cephx;none:\
mon_host=137.65.135.205\\:6789;137.65.135.206\\:6789;137.65.135.207\\:6789' ]

以下是 NBD(网络块设备)磁盘映射的示例:

disk = [ 'vdev=hdc, backendtype=qdisk, target=nbd:151.155.144.82:5555' ]

25.3 基于文件的虚拟磁盘和回环设备 Edit source

当虚拟机运行时,其每个基于文件的虚拟磁盘都会在主机上占用一个回环设备。默认情况下,主机最多允许使用 64 个回环设备。

要同时在主机上运行更多基于文件的虚拟磁盘,可以通过将以下选项添加到主机的 /etc/modprobe.conf.local 文件来增加可用回环设备的数量。

options loop max_loop=x

其中 x 是要创建的回环设备的最大数量。

在模块重新加载后,更改将生效。

Tip
提示

输入 rmmod loopmodprobe loop 来卸载和重新加载模块。如果 rmmod 不起作用,请卸载所有现有的回环设备或重新启动计算机。

25.4 调整块设备大小 Edit source

虽然始终可以向 VM 客户机系统添加新的块设备,但有时更希望增加现有块设备的大小。如果 VM 客户机部署期间已计划进行此类系统修改,则应考虑以下基本注意事项:

  • 使用可以增加大小的块设备。常用的有 LVM 设备和文件系统映像。

  • 不要在 VM 客户机内部分区设备,而是直接使用主设备来应用文件系统。例如,直接使用 /dev/xvdb 而不是向 /dev/xvdb 添加分区。

  • 确保要使用的文件系统可以调整大小。有时,例如对于 Ext3,必须关闭某些功能才能调整文件系统大小。可以在线调整大小并挂载的文件系统是 XFS。在底层块设备的大小增加后,使用 xfs_growfs 命令调整该文件系统的大小。有关 XFS 的更多信息,请参阅 man 8 xfs_growfs

调整分配给 VM 客户机的 LVM 设备大小时,VM 客户机会自动知道新的大小。无需进一步操作即可告知 VM 客户机块设备的新大小。

使用文件系统映像时,会使用回环设备将映像文件连接到客户机。有关调整该映像大小和刷新 VM 客户机大小信息的信息,请参阅 Section 27.2, “稀疏映像文件和磁盘空间”

25.5 管理高级存储场景的脚本 Edit source

有一些脚本可以帮助管理高级存储场景,例如 dmmd设备映射器—多磁盘)提供的磁盘环境,包括构建在软件 RAID 集上的 LVM 环境,或构建在 LVM 环境上的软件 RAID 集。这些脚本是 xen-tools 包的一部分。安装后,可以在 /etc/xen/scripts 中找到它们。

  • block-dmmd

  • block-drbd-probe

  • block-npiv

这些脚本允许外部命令在将块设备提供给客户机之前执行特定操作或一系列操作。

过去,这些脚本只能与 xllibxl 一起使用,并使用 script= 的磁盘配置语法。现在它们可以使用 libvirt,通过在磁盘的 <source> 元素中指定块脚本的基本名称来实现。例如:

<source dev='dmmd:md;/dev/md0;lvm;/dev/vgxen/lv-vm01'/>

26 虚拟化:配置选项和设置 Edit source

本节文档描述了高级管理任务和配置选项,这些任务和选项可能有助于技术创新者实施最先进的虚拟化解决方案。提供这些内容仅供参考,并不意味着 Novell, Inc. 支持所有记录的选项和任务。

26.1 虚拟 CD 读取器 Edit source

可以在创建虚拟机时或向现有虚拟机添加虚拟 CD 读取器。虚拟 CD 读取器可以基于物理 CD/DVD,也可以基于 ISO 映像。虚拟 CD 读取器的工作方式取决于它们是半虚拟化还是完全虚拟化。

26.1.1 半虚拟化虚拟机上的虚拟 CD 读取器 Edit source

半虚拟化虚拟机最多可以有 100 个块设备,由虚拟 CD 读取器和虚拟磁盘组成。在半虚拟化虚拟机上,虚拟 CD 读取器将 CD 显示为只读虚拟磁盘。虚拟 CD 读取器不能用于向 CD 写入数据。

在半虚拟化虚拟机上完成访问 CD 后,建议从虚拟机中移除虚拟 CD 读取器。

半虚拟化客户机可以使用 devtype=cdrom 设备类型。这部分模拟了真实 CD 读取器的行为,并允许更改 CD。甚至可以使用 eject 命令打开 CD 读取器的托盘。

26.1.2 完全虚拟化虚拟机上的虚拟 CD 读取器 Edit source

完全虚拟化虚拟机最多可以有四个块设备,由虚拟 CD 读取器和虚拟磁盘组成。完全虚拟化虚拟机上的虚拟 CD 读取器与插入的 CD 的交互方式与您期望的物理 CD 读取器一样。

当 CD 插入主机计算机上的物理 CD 读取器时,所有基于物理 CD 读取器的虚拟 CD 读取器的虚拟机,例如 /dev/cdrom/,都可以读取插入的 CD。假设操作系统具有自动挂载功能,CD 应该会自动出现在文件系统中。虚拟 CD 读取器不能用于向 CD 写入数据。它们被配置为只读设备。

26.1.3 添加虚拟 CD 读取器 Edit source

虚拟 CD 读取器可以基于插入 CD 读取器中的 CD 或基于 ISO 映像文件。

  1. 确保虚拟机正在运行并且操作系统已完成启动。

  2. 将所需的 CD 插入物理 CD 读取器,或将所需的 ISO 映像复制到 Dom0 可访问的位置。

  3. 在 VM 客户机中选择一个新的、未使用的块设备,例如 /dev/xvdb

  4. 选择要分配给客户机的 CD 读取器或 ISO 映像。

  5. 使用真实的 CD 读取器时,使用以下命令将 CD 读取器分配给您的 VM 客户机。在此示例中,客户机名为 alice:

    > sudo xl block-attach alice target=/dev/sr0,vdev=xvdb,access=ro
  6. 分配映像文件时,使用以下命令:

    > sudo xl block-attach alice target=/path/to/file.iso,vdev=xvdb,access=ro
  7. 新的块设备(例如 /dev/xvdb)将被添加到虚拟机中。

  8. 如果虚拟机正在运行 Linux,请完成以下步骤:

    1. 在虚拟机中打开终端并输入 fdisk -l 以验证设备是否已正确添加。您也可以输入 ls /sys/block 来查看虚拟机可用的所有磁盘。

      CD 被虚拟机识别为具有驱动器标识符的虚拟磁盘,例如:

      /dev/xvdb
    2. 输入命令以使用其驱动器标识符挂载 CD 或 ISO 映像。例如:

      > sudo mount -o ro /dev/xvdb /mnt

      将 CD 挂载到名为 /mnt 的挂载点。

      CD 或 ISO 映像文件应在指定的挂载点对虚拟机可用。

  9. 如果虚拟机正在运行 Windows,请重启虚拟机。

    验证虚拟 CD 读取器是否显示在其 我的电脑 部分。

26.1.4 移除虚拟 CD 读取器 Edit source

  1. 确保虚拟机正在运行并且操作系统已完成启动。

  2. 如果虚拟 CD 读取器已挂载,请从虚拟机内部将其卸载。

  3. 在主机视图中输入 xl block-list alice 查看客户机块设备。

  4. 输入 xl block-detach alice BLOCK_DEV_ID 从客户机中移除虚拟设备。如果失败,请尝试添加 -f 来强制移除。

  5. 按下硬件弹出按钮弹出 CD。

26.2 远程访问方法 Edit source

某些配置,例如包含机架式服务器的配置,要求计算机在没有视频监视器、键盘或鼠标的情况下运行。这种类型的配置通常称为headless,并需要使用远程管理技术。

典型的配置场景和技术包括:

带有 X Window System 服务器的图形桌面

如果在虚拟机主机上安装了图形桌面(如 GNOME),您可以使用远程查看器(如 VNC 查看器)。在远程计算机上,使用图形工具(如 tigervncvirt-viewer)登录并管理远程客户机环境。

仅文本

您可以使用远程计算机上的 ssh 命令登录到虚拟机主机并访问其基于文本的控制台。然后,您可以使用 xl 命令管理虚拟机,并使用 virt-install 命令创建新虚拟机。

26.3 VNC 查看器 Edit source

VNC 查看器用于以图形方式查看正在运行的客户机系统的环境。您可以从 Dom0(称为本地访问或盒内访问)或从远程计算机使用它。

您可以使用 VM 主机服务器的 IP 地址和 VNC 查看器来查看此 VM 客户机的显示。当虚拟机运行时,主机上的 VNC 服务器会为虚拟机分配一个用于 VNC 查看器连接的端口号。分配的端口号是虚拟机启动时可用的最低端口号。该数字仅在虚拟机运行时对虚拟机可用。关机后,端口号可能会分配给其他虚拟机。

例如,如果端口 1、2、4 和 5 分配给了正在运行的虚拟机,则 VNC 查看器将分配最低可用端口号 3。如果下次虚拟机启动时端口号 3 仍在使用中,则 VNC 服务器将为虚拟机分配另一个端口号。

要从远程计算机使用 VNC 查看器,防火墙必须允许访问与运行的 VM 客户机系统数量一样多的端口。这意味着从端口 5900 开始。例如,要运行 10 个 VM 客户机系统,您需要打开 TCP 端口 5900:5910。

要从运行 VNC 查看器客户端的本地控制台访问虚拟机,请输入以下命令之一:

  • vncviewer ::590#

  • vncviewer :#

# 是分配给虚拟机的 VNC 查看器端口号。

从 Dom0 以外的计算机访问 VM 客户机时,使用以下语法:

> vncviewer 192.168.1.20::590#

在这种情况下,Dom0 的 IP 地址是 192.168.1.20。

26.3.1 为虚拟机分配 VNC 查看器端口号 Edit source

尽管 VNC 查看器的默认行为是分配第一个可用端口号,但您应该为特定虚拟机分配一个特定的 VNC 查看器端口号。

要为 VM 客户机分配特定端口号,请编辑虚拟机的 xl 设置,并将 vnclisten 更改为所需值。例如,对于端口号 5902,仅指定 2,因为 5900 是自动添加的:

vfb = [ 'vnc=1,vnclisten="localhost:2"' ]

有关编辑客户机域的 xl 设置的更多信息,请参阅 Section 24.1, “XL—Xen 管理工具”

Tip
提示

分配更高的端口号以避免与 VNC 查看器分配的端口号冲突,VNC 查看器使用最低的可用端口号。

26.3.2 使用 SDL 而不是 VNC 查看器 Edit source

如果您从虚拟机主机控制台(称为本地或盒内访问)访问虚拟机的显示,则应使用 SDL 而不是 VNC 查看器。VNC 查看器在网络上查看桌面速度更快,但 SDL 在同一计算机上查看桌面速度更快。

要将默认值设置为使用 SDL 而不是 VNC,请将虚拟机的配置信息更改为以下内容。有关说明,请参阅 Section 24.1, “XL—Xen 管理工具”

vfb = [ 'sdl=1' ]

请记住,与 VNC 查看器窗口不同,关闭 SDL 窗口会终止虚拟机。

26.4 虚拟键盘 Edit source

启动虚拟机时,主机将创建一个虚拟键盘,该键盘根据虚拟机的设置匹配 keymap 条目。如果未指定 keymap 条目,则虚拟机的键盘默认为英语(美国)。

要查看虚拟机当前 keymap 条目,请在 Dom0 上输入以下命令:

> xl list -l VM_NAME | grep keymap

要为客户机配置虚拟键盘,请使用以下代码段:

vfb = [ 'keymap="de"' ]

有关支持的键盘布局的完整列表,请参阅 xl.cfg 手册页 man 5 xl.cfg 中的 Keymaps 部分。

26.5 专用 CPU 资源 Edit source

在 Xen 中,可以指定 Dom0 或 VM 客户机应该使用多少 CPU 核心以及使用哪些 CPU 核心来保持其性能。Dom0 的性能对于整个系统很重要,因为磁盘和网络驱动程序在上面运行。此外,I/O 密集型客户机的负载可能会消耗大量的 Dom0 CPU 周期。然而,VM 客户机的性能也很重要,以便能够完成它们被设置的任务。

26.5.1 Dom0 Edit source

将 CPU 资源专用给 Dom0 可以提高虚拟化环境的整体性能,因为 Dom0 有空闲的 CPU 时间来处理来自 VM 客户机的 I/O 请求。未能将 CPU 资源专用给 Dom0 可能会导致性能低下,并可能导致 VM 客户机运行不正常。

专用 CPU 资源包括三个基本步骤:修改 Xen 引导行、将 Dom0 的 VCPU 绑定到物理处理器,以及配置 VM 客户机的 CPU 相关选项。

  1. 首先,您需要将 dom0_max_vcpus=X 追加到 Xen 引导行。为此,请将以下行添加到 /etc/default/grub

    GRUB_CMDLINE_XEN="dom0_max_vcpus=X"

    如果 /etc/default/grub 已包含设置 GRUB_CMDLINE_XEN 的行,则将 dom0_max_vcpus=X 追加到该行。

    X 需要替换为专用于 Dom0 的 VCPU 数量。

  2. 通过运行以下命令更新 GRUB 2 配置文件:

    > sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 重新启动以使更改生效。

  4. 下一步是将 Dom0 的每个 VCPU 绑定(或“固定”)到物理处理器。

    > sudo xl vcpu-pin Domain-0 0 0
    xl vcpu-pin Domain-0 1 1

    第一行将 Dom0 的 VCPU 号 0 绑定到物理处理器号 0,而第二行将 Dom0 的 VCPU 号 1 绑定到物理处理器号 1。

  5. 最后,您需要确保没有 VM 客户机使用专用于 Dom0 VCPU 的物理处理器。假设您正在运行一个 8-CPU 系统,您需要添加:

    cpus="2-8"

    到相关 VM 客户机的配置文件中。

26.5.2 VM 客户机 Edit source

通常有必要为虚拟机分配特定的 CPU 资源。默认情况下,虚拟机使用任何可用的 CPU 核心。通过为其分配合理的物理处理器数量,可以提高其性能,因为之后不允许其他 VM 客户机使用这些处理器。假设有一台 8 个 CPU 核心的机器,而虚拟机需要使用其中 2 个,请按以下方式更改其配置文件:

vcpus=2
cpus="2,3"

上面的示例将 2 个处理器分配给 VM 客户机,并且这些是第三和第四个处理器(从零开始计数为 23)。如果您需要分配更多物理处理器,请使用 cpus="2-8" 语法。

如果您需要以热插拔方式更改名为alice的客户机的 CPU 分配,请在相关的 Dom0 上执行以下操作:

> sudo xl vcpu-set alice 2
> sudo xl vcpu-pin alice 0 2
> sudo xl vcpu-pin alice 1 3

该示例将 2 个物理处理器分配给客户机,并将 VCPU 0 绑定到物理处理器 2,将 VCPU 1 绑定到物理处理器 3。现在检查分配:

> sudo xl vcpu-list alice
Name                              ID VCPUs   CPU State   Time(s) CPU Affinity
alice                             4     0     2   -b-       1.9 2-3
alice                             4     1     3   -b-       2.8 2-3

26.6 HVM 功能 Edit source

在 Xen 中,某些功能仅适用于完全虚拟化的域。它们很少使用,但仍可能在特定环境中很有趣。

26.6.1 在启动时指定引导设备 Edit source

就像物理硬件一样,有时希望从与虚拟机自身的引导设备不同的设备引导 VM 客户机。对于完全虚拟化的虚拟机,可以在域 xl 配置文件中使用 boot 参数选择引导设备:

boot = BOOT_DEVICE

BOOT_DEVICE 可以是 c(硬盘)、d(CD-ROM)或 n(网络/PXE)之一。您可以指定多个选项,它们将按给定的顺序尝试。例如:

boot = dc

从 CD-ROM 引导,如果 CD-ROM 不可引导,则回退到硬盘。

26.6.2 更改客户机的 CPUID Edit source

为了能够将 VM 客户机从一个 VM 主机服务器迁移到另一个 VM 主机服务器,VM 客户机系统只能使用两个 VM 主机服务器系统都可用的 CPU 功能。如果两个主机上的实际 CPU 不同,则可能需要在 VM 客户机启动前隐藏某些功能。这可以保留在两个主机之间迁移 VM 客户机的可能性。对于完全虚拟化的客户机,可以通过配置可用于客户机的 cpuid 来实现。

要全面了解当前 CPU,请查看 /proc/cpuinfo。它包含定义当前 CPU 的所有重要信息。

要重新定义 CPU,请首先查看 CPU 供应商的相应 cpuid 定义。它们可从以下位置获得:

cpuid = "host,tm=0,sse3=0"

语法是逗号分隔的 key=value 对列表,前面是 host 一词。一些键接受数值,而所有其他键接受一个字符,描述了如何处理该功能位。有关 cpuid 键的完整列表,请参阅 man 5 xl.cfg。可以使用以下值更改相应位:

1

强制将相应位设置为 1

0

强制将相应位设置为 0

x

使用默认策略的值。

k

使用主机定义的值。

s

k 类似,但保留迁移过程中的值。

Tip
提示

请记住,位计数从右到左,从位 0 开始。

26.6.3 增加 PCI-IRQs 的数量 Edit source

如果您需要增加可用于 Dom0 和/或 VM 客户机的默认 PCI-IRQs 数量,可以通过修改 Xen 内核命令行来实现。使用命令 extra_guest_irqs= DOMU_IRGS,DOM0_IRGS。可选的第一个数字 DOMU_IRGS 对所有 VM 客户机通用,而可选的第二个数字 DOM0_IRGS(前面有逗号)用于 Dom0。更改 VM 客户机的设置对 Dom0 没有影响,反之亦然。例如,要更改 Dom0 而不更改 VM 客户机,请使用:

extra_guest_irqs=,512

26.7 虚拟 CPU 调度 Edit source

Xen hypervisor 会单独调度虚拟 CPU。借助支持每个核心多线程的现代 CPU,虚拟 CPU 可以跨不同线程在同一个核心上运行,从而相互影响。在一个线程中运行的虚拟 CPU 的性能可能会受到其他线程中其他虚拟 CPU 所做操作的显着影响。当这些虚拟 CPU 属于不同的客户机系统时,这些客户机可能会相互影响。影响范围可能从客户机 CPU 时间计费的差异到更糟糕的情况,例如侧信道攻击

调度粒度 解决了这个问题。您可以在启动时通过使用 Xen 引导参数指定它:

sched-gran=GRANULARITY

GRANULARITY 替换为以下选项之一:

cpu

Xen hypervisor 的常规调度。不同客户机的虚拟 CPU 可以共享一个物理 CPU 核心。这是默认设置。

core

一个虚拟核心的虚拟 CPU 始终一起在单个物理核心上调度。来自不同虚拟核心的两个或多个虚拟 CPU 绝不会在同一个物理核心上调度。因此,即使有想要运行的虚拟 CPU,某些物理核心也可能留下多个 CPU 空闲。性能影响将取决于客户机系统内部运行的实际工作负载。在大多数已分析的案例中,观察到的性能下降(尤其是在负载很大的情况下)小于禁用超线程(这会将所有核心只保留一个线程)(请参阅 https://xenbits.xen.org/docs/unstable/misc/xen-command-line.html#smt-x86 中的 smt 引导选项)。

socket

粒度甚至可以上升到 CPU 插槽级别。

27 管理任务 Edit source

27.1 引导加载程序 Edit source

引导加载程序控制虚拟化软件的引导和运行方式。您可以通过 YaST 进行修改引导加载程序属性,或直接编辑引导加载程序配置文件。

YaST 引导加载程序程序位于 YaST › System › Boot Loader。单击 Bootloader Options 选项卡,然后选择包含 Xen 内核的行作为 Default Boot Section

Boot loader settings
Figure 27.1: 引导加载程序设置

OK 确认。下次引导主机时,它就可以提供 Xen 虚拟化环境。

您可以使用引导加载程序程序指定功能,例如:

您可以通过编辑 /etc/default/grub 文件来定制您的虚拟化环境。将以下行添加到此文件中: GRUB_CMDLINE_XEN="<boot_parameters>"。编辑文件后,不要忘记运行 grub2-mkconfig -o /boot/grub2/grub.cfg

27.2 稀疏映像文件和磁盘空间 Edit source

如果主机物理磁盘达到没有可用空间的状态,则使用基于稀疏映像文件的虚拟磁盘的虚拟机无法写入其磁盘。因此,它会报告 I/O 错误。

如果发生这种情况,您应该释放物理磁盘上的可用空间,重新挂载虚拟机的ファイルシステム,并将ファイルシステム设置回读写模式。

要检查稀疏映像文件的实际磁盘要求,请使用 du -h <image file> 命令。

要增加稀疏映像文件的可用空间,请先增加文件大小,然后增加文件系统。

Warning
警告:调整大小时请备份。

修改分区或稀疏文件的大小始终存在数据失败的风险。请务必进行备份。

映像文件的调整大小可以在 VM 客户机运行时在线完成。使用以下命令增加稀疏映像文件的大小:

> sudo dd if=/dev/zero of=<image file> count=0 bs=1M seek=<new size in MB>

例如,要将文件 /var/lib/xen/images/sles/disk0 的大小增加到 16GB,请使用以下命令:

> sudo dd if=/dev/zero of=/var/lib/xen/images/sles/disk0 count=0 bs=1M seek=16000
Note
注意:增加非稀疏映像。

也可以增加非稀疏文件的映像文件。但是,您必须确切知道上一个映像在哪里结束。使用 seek 参数指向映像文件的末尾,并使用类似以下的命令:

> sudo dd if=/dev/zero of=/var/lib/xen/images/sles/disk0 seek=8000 bs=1M count=2000

请务必使用正确的 seek 值,否则可能导致数据丢失。

如果在虚拟机客户机运行期间执行调整大小操作,还需要调整为虚拟机客户机提供映像文件的环形设备。首先使用命令检测正确的环形设备

> sudo losetup -j /var/lib/xen/images/sles/disk0

然后使用以下命令调整环形设备的大小,例如 /dev/loop0

> sudo losetup -c /dev/loop0

最后使用命令 fdisk -l /dev/xvdb 检查客户机系统中块设备的大小。将设备名称替换为已增加的磁盘。

稀疏文件内文件系统的调整大小涉及依赖于实际文件系统的工具。

27.3 迁移 Xen 虚拟机客户机系统 编辑源

使用 Xen,几乎无需服务中断即可将虚拟机客户机系统从一个 VM 主机服务器迁移到另一个。例如,这可以用于将繁忙的虚拟机客户机迁移到一个拥有更强硬件或尚未加载的 VM 主机服务器。或者,如果需要 VM 主机服务器的服务,可以将在此机器上运行的所有虚拟机客户机系统迁移到其他机器,以避免服务中断。这仅是两个示例—根据您个人情况,可能还有更多原因。

在开始之前,应考虑有关 VM 主机服务器的一些初步事项

  • 所有 VM 主机服务器系统都应使用相似的 CPU。频率并非那么重要,但它们应使用相同的 CPU 系列。要获取有关所用 CPU 的更多信息,请使用 cat /proc/cpuinfo。在 第 27.3.1 节,“检测 CPU 功能” 中查找有关比较主机 CPU 功能的更多详细信息。

  • 特定客户机系统使用的所有资源必须在所有参与的 VM 主机服务器系统上可用—例如,所有使用的块设备必须存在于两个 VM 主机服务器系统上。

  • 如果迁移过程中涉及的主机运行在不同的子网中,请确保 DHCP 中继可用于客户机,或者对于具有静态网络配置的客户机,请手动设置网络。

  • 使用 PCI Pass-Through 等特殊功能可能会有问题。在部署一个应在不同 VM 主机服务器系统之间迁移虚拟机客户机系统的环境时,请不要实现这些功能。

  • 对于快速迁移,快速网络是强制性的。如果可能,请使用 GB 以太网和快速交换机。部署 VLAN 也可能有助于避免冲突。

27.3.1 检测 CPU 功能 编辑源

通过使用 cpuidxen_maskcalc.py 工具,您可以比较正在迁移源虚拟机客户机的宿主机 CPU 功能与目标宿主机 CPU 的功能。这样,您可以更好地预测客户机迁移是否会成功。

  1. 在每个应该运行或接收已迁移虚拟机客户机的 Dom0 上运行 cpuid -1r 命令,并将输出捕获到文本文件中,例如

    tux@vm_host1 > sudo cpuid -1r > vm_host1.txt
    tux@vm_host2 > sudo cpuid -1r > vm_host2.txt
    tux@vm_host3 > sudo cpuid -1r > vm_host3.txt
  2. 将所有输出文本文件复制到一个安装了 xen_maskcalc.py 脚本的主机上。

  3. 在所有输出文本文件上运行 xen_maskcalc.py 脚本

    > sudo xen_maskcalc.py vm_host1.txt vm_host2.txt vm_host3.txt
    cpuid = [
        "0x00000001:ecx=x00xxxxxx0xxxxxxxxx00xxxxxxxxxxx",
        "0x00000007,0x00:ebx=xxxxxxxxxxxxxxxxxx00x0000x0x0x00"
    ]
  4. 将输出 cpuid=[...] 配置片段复制到已迁移客户机的 xl 配置 domU.cfg 中,或者选择性地复制到其 libvirt 的 XML 配置中。

  5. 使用修剪后的 CPU 配置启动源客户机。客户机现在只能使用每个主机上都存在的功能。

27.3.1.1 更多信息 编辑源

您可以在 http://etallen.com/cpuid.html 找到有关 cpuid 的更多详细信息。

您可以从 https://github.com/twizted/xen_maskcalc 下载 CPU 掩码计算器的最新版本。

27.3.2 为迁移准备块设备 编辑源

虚拟机客户机系统所需的块设备必须在所有参与的 VM 主机服务器系统上可用。这是通过实现一种特殊的共享存储来实现的,该存储充当已迁移虚拟机客户机系统的根文件系统的容器。常见的可能性包括

  • iSCSI 可以配置为使不同系统能够同时访问相同的块设备。

  • NFS 是一个广泛使用的根文件系统,可以从不同位置轻松访问。有关更多信息,请参阅 《参考》一书,第 22 章“使用 NFS 共享文件系统”

  • DRBD 可用于仅涉及两个 VM 主机服务器系统的情况。这增加了某些额外的数据安全性,因为使用的数据通过网络进行镜像。

  • SCSI 如果可用硬件允许共享访问相同的磁盘,也可以使用。

  • NPIV 是一种使用光纤通道磁盘的特殊模式。但是,在这种情况下,所有迁移主机都必须连接到同一个光纤通道交换机。有关 NPIV 的更多信息,请参阅 第 25.1 节,“将物理存储映射到虚拟磁盘”。通常,如果光纤通道环境支持 4 Gbps 或更快的连接,则此方法可行。

27.3.3 迁移虚拟机客户机系统 编辑源

虚拟机客户机系统的实际迁移是通过命令完成的

> sudo xl migrate <domain_name> <host>

迁移速度取决于内存映像可以保存到磁盘、发送到新 VM 主机服务器并在此处加载的速度。这意味着小型虚拟机客户机系统可以比内存量大的大型系统迁移得更快。

27.4 监控 Xen 编辑源

为了定期运行许多虚拟客户机,能够检查所有不同虚拟机客户机系统的运行状况是必不可少的。Xen 除了系统工具外,还提供了一些工具来收集有关系统的信息。

Tip
提示:监控 VM 主机服务器

可以通过虚拟机管理器(Virtual Machine Manager)来监控 VM 主机服务器(I/O 和 CPU)的基本情况。有关详细信息,请参阅 第 10.8.1 节,“使用虚拟机管理器进行监控”

27.4.1 使用 xentop 监控 Xen 编辑源

用于收集 Xen 虚拟环境信息的首选终端应用程序是 xentop。请注意,此工具需要一个相当宽的终端,否则它会在显示中插入换行符。

xentop 具有几个命令键,可以为您提供有关监控系统更多的信息。例如

D

更改屏幕刷新之间的延迟。

N

也显示网络统计信息。请注意,仅显示标准配置。如果使用特殊配置,如路由网络,则不显示网络。

B

显示相应的块设备及其累计使用计数。

有关 xentop 的更多信息,请参阅手册页 man 1 xentop

Tip
提示:virt-top

libvirt 提供了一个与 hypervisor 无关的工具 virt-top,推荐用于监控虚拟机客户机。有关详细信息,请参阅 第 10.8.2 节,“使用 virt-top 进行监控”

27.4.2 附加工具 编辑源

有许多系统工具也有助于监控或调试正在运行的 openSUSE 系统。其中许多工具在 《系统分析与调优指南》一书,第 2 章“系统监控实用程序” 中进行了介绍。以下工具对于监控虚拟化环境特别有用

ip

可以使用命令行实用程序 ip 来监控任意网络接口。如果您设置了路由网络或应用了伪装网络,这尤其有用。要监控名为 alice.0 的网络接口,请运行以下命令

> watch ip -s link show alice.0
bridge

在标准设置中,所有 Xen 虚拟机客户机系统都连接到一个虚拟网络桥。 bridge 允许您确定桥与虚拟机客户机系统中的虚拟网络适配器之间的连接。例如,bridge link 的输出可能如下所示

2: eth0 state DOWN : <NO-CARRIER, ...,UP> mtu 1500 master br0
8: vnet0 state UNKNOWN : <BROADCAST, ...,LOWER_UP> mtu 1500 master virbr0 \
  state forwarding priority 32 cost 100

这表明系统上定义了两个虚拟桥。一个连接到物理以太网设备 eth0,另一个连接到 VLAN 接口 vnet0

iptables-save

特别是在使用伪装网络,或者当多个以太网接口与防火墙设置一起设置时,检查当前防火墙规则可能会很有帮助。

命令 iptables 可用于检查所有不同的防火墙设置。要列出链中的所有规则,甚至整个设置,您可以使用命令 iptables-saveiptables -S

27.5 为虚拟机客户机系统提供主机信息 编辑源

在标准的 Xen 环境中,虚拟机客户机系统对它们运行的 VM 主机服务器系统的了解有限。如果客户机应该了解它运行的 VM 主机服务器的更多信息,vhostmd 可以为选定的客户机提供更多信息。要设置您的系统以运行 vhostmd,请按以下步骤操作

  1. 在 VM 主机服务器上安装 vhostmd 包。

  2. 要从配置中添加或删除 metric 部分,请编辑文件 /etc/vhostmd/vhostmd.conf。但是,默认设置效果很好。

  3. 使用命令检查 vhostmd.conf 配置文件是否有效

    > cd /etc/vhostmd
    > xmllint --postvalid --noout vhostmd.conf
  4. 使用命令 sudo systemctl start vhostmd 启动 vhostmd 守护程序。

    如果 vhostmd 应该在系统启动时自动启动,请运行命令

    > sudo systemctl enable vhostmd
  5. 使用命令 sudo xl attach /dev/shm/vhostmd0 alice 将映像文件 /dev/shm/vhostmd0 附加到名为 alice 的虚拟机客户机系统

    > xl block-attach opensuse /dev/shm/vhostmd0,,xvdb,ro
  6. 登录到虚拟机客户机系统。

  7. 安装客户端包 vm-dump-metrics

  8. 运行命令 vm-dump-metrics。要将结果保存到文件,请使用选项 -d <filename>

命令 vm-dump-metrics 的结果是 XML 输出。相应的度量条目遵循 /etc/vhostmd/metric.dtd 的 DTD。

有关更多信息,请参阅 VM 主机服务器系统上的手册页 man 8 vhostmd/usr/share/doc/vhostmd/README。在客户机上,请参阅手册页 man 1 vm-dump-metrics

28 XenStore:域之间共享的配置数据库 编辑源

本节介绍 XenStore 的基本信息,包括它在 Xen 环境中的作用、XenStore 使用的文件目录结构以及 XenStore 命令的描述。

28.1 简介 编辑源

XenStore 是虚拟机客户机和运行在 Dom0 中的管理工具之间共享的配置和状态信息的数据库。虚拟机客户机和管理工具读写 XenStore 以传递配置信息、状态更新和状态更改。XenStore 数据库由 Dom0 管理,并支持简单的操作,例如读写键。虚拟机客户机和管理工具可以通过监视感兴趣的条目来获得 XenStore 中任何更改的通知。 xenstored 守护程序由 xencommons 服务管理。

XenStore 位于 Dom0 上,位于单个数据库文件 /var/lib/xenstored/tdb 中(tdb 代表树数据库)。

28.2 文件系统接口 编辑源

XenStore 数据库内容由一个类似 /proc 的虚拟文件系统表示(有关 /proc 的更多信息,请参阅 《系统分析与调优指南》一书,第 2 章“系统监控实用程序”,第 2.6 节“/proc 文件系统”)。树有三个主要路径:/vm/local/domain/tool

  • /vm - 存储有关虚拟机客户机配置的信息。

  • /local/domain - 存储有关本地节点上虚拟机客户机的信息。

  • /tool - 存储有关多个工具的一般信息。

Tip
提示

每个虚拟机客户机都有两个不同的 ID 号。即使虚拟机客户机迁移到另一台机器,通用唯一标识符 (UUID) 也会保持不变。 域标识符 (DOMID) 是一个标识号,代表一个特定的运行实例。当虚拟机客户机迁移到另一台机器时,它通常会改变。

28.2.1 XenStore 命令 编辑源

XenStore 数据库的文件系统结构可以使用以下命令进行操作

xenstore-ls

显示 XenStore 数据库的完整转储。

xenstore-readpath_to_xenstore_entry

显示指定的 XenStore 条目的值。

xenstore-existsxenstore_path

报告指定的 XenStore 路径是否存在。

xenstore-listxenstore_path

显示指定 XenStore 路径的所有子条目。

xenstore-writepath_to_xenstore_entry

更新指定的 XenStore 条目的值。

xenstore-rmxenstore_path

删除指定的 XenStore 条目或目录。

xenstore-chmodxenstore_pathmode

更新指定 XenStore 路径的读/写权限。

xenstore-control

xenstored 后端发送命令,例如触发完整性检查。

28.2.2 /vm 编辑源

/vm 路径由每个虚拟机客户机的 UUID 索引,并存储配置信息,例如虚拟 CPU 的数量和分配的内存量。每个虚拟机客户机都有一个 /vm/<uuid> 目录。要列出目录内容,请使用 xenstore-list

> sudo xenstore-list /vm
00000000-0000-0000-0000-000000000000
9b30841b-43bc-2af9-2ed3-5a649f466d79-1

输出的第一行属于 Dom0,第二行属于运行中的虚拟机客户机。以下命令列出了与虚拟机客户机相关的所有条目

> sudo xenstore-list /vm/9b30841b-43bc-2af9-2ed3-5a649f466d79-1
image
rtc
device
pool_name
shadow_memory
uuid
on_reboot
start_time
on_poweroff
bootloader_args
on_crash
vcpus
vcpu_avail
bootloader
name

要读取条目的值,例如分配给虚拟机客户机的虚拟 CPU 的数量,请使用 xenstore-read

> sudo xenstore-read /vm/9b30841b-43bc-2af9-2ed3-5a649f466d79-1/vcpus
1

以下是 /vm/<uuid> 条目列表

uuid

虚拟机客户机的 UUID。在迁移过程中不会更改。

on_reboot

指定在响应重启请求时是销毁还是重启虚拟机客户机。

on_poweroff

指定在响应关机请求时是销毁还是重启虚拟机客户机。

on_crash

指定在响应崩溃时是销毁还是重启虚拟机客户机。

vcpus

分配给虚拟机客户机的虚拟 CPU 数量。

vcpu_avail

虚拟机客户机的活动虚拟 CPU 的位掩码。位掩码有几个位等于 vcpus 的值,每个在线虚拟 CPU 都有一个设置的位。

name

虚拟机客户机的名称。

常规虚拟机客户机(非 Dom0)使用 /vm/<uuid>/image 路径

> sudo xenstore-list /vm/9b30841b-43bc-2af9-2ed3-5a649f466d79-1/image
ostype
kernel
cmdline
ramdisk
dmargs
device-model
display

以下是对使用条目的解释

ostype

虚拟机客户机的操作系统类型。

kernel

Dom0 上虚拟机客户机内核的路径。

cmdline

虚拟机客户机启动时使用的内核命令行。

ramdisk

Dom0 上虚拟机客户机 RAM 磁盘的路径。

dmargs

显示传递给 QEMU 进程的参数。如果您使用 ps 查看 QEMU 进程,您应该看到与 /vm/<uuid>/image/dmargs 相同的参数。

28.2.3 /local/domain/<domid> 编辑源

此路径由正在运行的域(虚拟机客户机)ID 索引,并包含有关正在运行的虚拟机客户机的信息。请记住,域 ID 在虚拟机客户机迁移期间会发生变化。以下条目可用

vm

此虚拟机客户机的 /vm 目录的路径。

on_reboot, on_poweroff, on_crash, name

请参阅 第 28.2.2 节,“/vm 中相同的选项。

domid

虚拟机客户机的域标识符。

cpu

虚拟机客户机当前固定到的 CPU。

cpu_weight

为虚拟机客户机分配的调度权重。较高的权重更频繁地使用物理 CPU。

除了上面描述的单个条目外,/local/domain/<domid> 下还有几个子目录,其中包含特定条目。要查看所有可用条目,请参阅 XenStore 参考

/local/domain/<domid>/memory

包含内存信息。/local/domain/<domid>/memory/target 包含虚拟机客户机的目标内存大小(以千字节为单位)。

/local/domain/<domid>/console

包含有关虚拟机客户机使用的控制台的信息。

/local/domain/<domid>/backend

包含有关虚拟机客户机使用的所有后端设备的信息。路径有自己的子目录。

/local/domain/<domid>/device

包含有关虚拟机客户机前端设备的信息。

/local/domain/<domid>/device-misc

包含设备的其他杂项信息。

/local/domain/<domid>/store

包含有关虚拟机客户机存储的信息。

29 Xen 作为高可用性虚拟化主机 编辑源

将两台 Xen 宿主机设置为故障转移系统,与每台服务器在专用硬件上运行的设置相比,具有多项优势。

  • 单个服务器的故障不会导致服务中断。

  • 一台大型机器通常比多台小型机器便宜得多。

  • 根据需要添加新服务器是一项微不足道的工作。

  • 服务器的使用得到改善,这对系统的功耗有积极影响。

Xen 主机的迁移设置在 第 27.3 节,“迁移 Xen 虚拟机客户机系统” 中进行了描述。接下来,将描述几种典型场景。

29.1 Xen HA 与远程存储 编辑源

Xen 可以直接为相应的 Xen 客户机系统提供几种远程块设备。这些包括 iSCSI、NPIV 和 NBD。它们可用于进行实时迁移。当存储系统已就位时,首先尝试使用您已在网络中使用的相同设备类型。

如果存储系统不能直接使用,但可以提供通过 NFS 提供的所需空间,也可以在 NFS 上创建映像文件。如果 NFS 在所有 Xen 主机系统上都可用,此方法也允许 Xen 客户机的实时迁移。

在设置新系统时,主要考虑因素之一是是否应实现专用存储区域网络。可用选项如下

表 29.1:Xen 远程存储

方法

复杂性

注释

以太网

所有块设备流量都通过与网络流量相同的以太网接口。这可能会限制客户机的性能。

专用于存储的以太网。

将存储流量运行在专用的以太网接口上可以消除服务器端的瓶颈。但是,使用自己的 IP 地址范围和专用于存储的 VLAN 规划自己的网络需要仔细考虑。

NPIV

NPIV 是一种虚拟化光纤通道连接的方法。这适用于数据速率至少为 4 Gbit/s 的适配器,并允许设置复杂的存储系统。

通常,1 Gbit/s 以太网设备可以完全利用典型的硬盘或存储系统。使用快速存储系统时,这样的以太网设备可能会限制系统的速度。

29.2 Xen HA 与本地存储 编辑源

由于空间或预算原因,可能需要依赖 Xen 主机系统本地的存储。为了仍能进行实时迁移,必须构建镜像到两个 Xen 主机的块设备。允许此操作的软件称为分布式复制块设备 (DRBD)。

如果设置了一个使用 DRBD 在两个 Xen 主机之间镜像块设备或文件的系统,则两个主机都应使用相同的硬件。如果其中一个主机具有较慢的硬盘,则两个主机都会受到此限制。

在设置过程中,每个必需的块设备都应使用自己的 DRBD 设备。设置此类系统是一项复杂的任务。

29.3 Xen HA 与私有桥 编辑源

当使用多个需要相互通信的客户机系统时,可以通过常规接口进行通信。但是,出于安全原因,可能建议创建一个仅连接到客户机系统的桥。

在也应支持实时迁移的 HA 环境中,此类私有桥必须连接到其他 Xen 主机。这可以通过使用专用的物理以太网设备和专用网络来实现。

另一种实现方法是使用 VLAN 接口。在这种情况下,所有流量都通过常规以太网接口。但是,VLAN 接口不会获得常规流量,因为只转发标记为正确 VLAN 的 VLAN 数据包。

有关 VLAN 接口设置的更多信息,请参阅 第 8.1.1.4 节,“使用 VLAN 接口”

30 Xen:将半虚拟化 (PV) 客户机转换为完全虚拟化 (FV/HVM) 客户机 编辑源

本章解释了如何将 Xen 准虚拟化机器转换为 Xen 完全虚拟化机器。

过程 30.1:客户机端

要以 FV 模式启动客户机,您需要在客户机内部执行以下步骤。

  1. 在转换客户机之前,应用所有待处理的补丁并重新启动客户机。

  2. FV 机器使用 -default 内核。如果尚未安装此内核,请安装 kernel-default 包(在 PV 模式下运行)。

  3. PV 机器通常使用 vda* 等磁盘名称。这些名称必须更改为 FV hd* 语法。此更改必须在以下文件中完成

    • /etc/fstab

    • /boot/grub/menu.lst (仅限 SLES 11)

    • /boot/grub*/device.map

    • /etc/sysconfig/bootloader

    • /etc/default/grub (SLES 12、15、openSUSE)

    Note
    注意:首选 UUID

    您应该在 /etc/fstab 中使用 UUID 或逻辑卷。使用 UUID 可以简化附加网络存储、多路径和虚拟化的使用。要查找磁盘的 UUID,请使用命令 blkid

  4. 为避免在重新生成包含必需模块的 initrd 时出现任何错误,您可以使用 ln 命令从 /dev/hda2 创建一个符号链接到 /dev/xvda2 等。

    ln -sf /dev/xvda2 /dev/hda2
    ln -sf /dev/xvda1 /dev/hda1
    .....
  5. PV 和 FV 机器使用不同的磁盘和网络驱动程序模块。这些 FV 模块必须手动添加到 initrd 中。预期的模块是 xen-vbd(用于磁盘)和 xen-vnif(用于网络)。这些是完全虚拟化虚拟机客户机的唯一 PV 驱动程序。所有其他模块,如 ata_piixata_genericlibata,都应自动添加。

    Tip
    提示:将模块添加到 initrd
    • 在 SLES 11 上,您可以将模块添加到 /etc/sysconfig/kernel 文件中的 INITRD_MODULES 行。例如

      INITRD_MODULES="xen-vbd xen-vnif"

      运行 dracut 来构建包含模块的新 initrd。

    • 在 SLES 12、15 和 openSUSE 上,打开或创建 /etc/dracut.conf.d/10-virt.conf,并通过 force_drivers 添加模块,如下例所示(请注意前面的空格)

      force_drivers+=" xen-vbd xen-vnif"

      运行 dracut -f --kver KERNEL_VERSION-default 来构建包含必需模块的新 initrd(针对默认版本的内核)。

      查找内核版本。  使用 uname -r 命令获取您系统上当前使用的版本。

  6. 在关闭客户机之前,使用 yast bootloader 将默认启动参数设置为 -default 内核。

  7. openSUSE Leap 11 上,如果您的客户机上运行着 X 服务器,您需要调整 /etc/X11/xorg.conf 文件以调整 X 驱动程序。搜索 fbdev 并更改为 cirrus

    Section "Device"
              Driver       "cirrus"
              ......
              EndSection
    Note
    注意:openSUSE Leap 12/15 和 Xorg

    openSUSE Leap 12/15 上,Xorg 会自动调整所需的驱动程序以获得可工作的 X 服务器。

  8. 关闭客户机。

过程 30.2:主机端

以下步骤说明了您需要在主机上执行的操作。

  1. 要以 FV 模式启动客户机,必须修改 VM 的配置以匹配 FV 配置。使用 virsh edit [DOMAIN] 可以轻松编辑 VM 的配置。建议进行以下更改

    • 确保 OS 部分中的 machine、type 和 loader 条目从 xenpv 更改为 xenfv。更新的 OS 部分应类似于

      <os>
                <type arch='x86_64' machine='xenfv'>hvm</type>
                <loader>/usr/lib/xen/boot/hvmloader</loader>
                <boot dev='hd'/>
      </os>
    • 在 OS 部分,删除任何特定于 PV 客户机的内容

      • <bootloader>pygrub</bootloader>
      • <kernel>/usr/lib/grub2/x86_64-xen/grub.xen</kernel>
      • <cmdline>xen-fbfront.video=4,1024,768</cmdline>
    • 在 devices 部分,添加 qemu 模拟器为

      <emulator>/usr/lib/xen/bin/qemu-system-i386</emulator>
    • 更新磁盘配置,使目标设备和总线使用 FV 语法。这需要将 xen 磁盘总线替换为 ide,并将 vda 目标设备替换为 hda。更改应类似于

      <target dev='hda' bus='ide'/>
    • 将鼠标和键盘的总线从 xen 更改为 ps2。此外,添加一个新的 USB 平板电脑设备

      <input type='mouse' bus='ps2'/>
                <input type='keyboard' bus='ps2'/>
      <input type='tablet' bus='usb'/>
    • 将控制台目标类型从 xen 更改为 serial

      <console type='pty'>
                <target type='serial' port='0'/>
      </console>
    • 将视频配置从 xen 更改为 cirrus,并具有 8 MB 的 VRAM

      <video>
                <model type='cirrus' vram='8192' heads='1' primary='yes'/>
      </video>
    • 如果需要,将 acpiapic 添加到 VM 的功能中

      <features>
                <acpi/>
                <apic/>
      </features>
  2. 启动客户机(使用 virshvirt-manager)。如果客户机正在运行 kernel-default(通过 uname -a 验证),则机器正在全虚拟化模式下运行。

Note
注意:guestfs-tools

要脚本化此过程,或直接处理磁盘映像,可以使用 guestfs-tools 套件(有关更多信息,请参阅 第 18.3 节,“Guestfs 工具”)。存在多个工具可以帮助修改磁盘映像。

第五部分 使用 QEMU 管理虚拟机 编辑源

31 QEMU 概述

QEMU 是一个快速、跨平台的开源机器模拟器,可以模拟许多硬件架构。QEMU 允许您在现有系统(VM 主机服务器)之上运行一个完整的未修改操作系统(VM 客户机)。您还可以使用 QEMU 进行调试—您可以轻松停止正在运行的…

32 设置 KVM VM 主机服务器

本节文档介绍了如何将 openSUSE Leap 15.5 设置为基于 QEMU-KVM 的虚拟机宿主机。

33 客户机安装

基于 libvirt 的工具,例如 virt-managervirt-install,提供了方便的界面来设置和管理虚拟机。它们充当 qemu-system-ARCH 命令的一种包装。但是,也可以直接使用 qemu-system-ARCH,而无需使用基于 libvirt 的工具。

34 使用 qemu-system-ARCH 运行虚拟机

一旦您准备好了虚拟磁盘映像(有关磁盘映像的更多信息,请参阅第 33.2 节,“使用 qemu-img 管理磁盘映像”),就可以启动相关的虚拟机了。第 33.1 节,“使用 qemu-system-ARCH 进行基本安装”介绍了安装和运行 VM 客户机的简单命令。 …

35 使用 QEMU 监视器管理虚拟机

当虚拟机由 qemu-system-ARCH 命令调用时,例如 qemu-system-x86_64,将提供一个监视器控制台以执行与用户的交互。使用监视器控制台中可用的命令,可以检查正在运行的操作系统,更改可移动媒体…

31 QEMU 概述 编辑源

QEMU 是一个快速、跨平台的开源机器模拟器,可以模拟许多硬件架构。QEMU 允许您在现有系统(VM 主机服务器)之上运行一个完整的未修改操作系统(VM 客户机)。您还可以使用 QEMU 进行调试—您可以轻松停止正在运行的虚拟机、检查其状态,然后稍后保存和恢复它。

QEMU 主要由以下部分组成

  • 处理器模拟器。

  • 模拟设备,例如显卡、网卡、硬盘或鼠标。

  • 用于将模拟设备连接到相关主机设备的通用设备。

  • 调试器。

  • 用于与模拟器交互的用户界面。

QEMU 是 KVM 和 Xen 虚拟化的核心,它提供了通用的机器模拟。Xen 对 QEMU 的使用在一定程度上对用户是隐藏的,而 KVM 的使用则透明地暴露了大多数 QEMU 功能。如果 VM 客户机的硬件架构与 VM 主机服务器的架构相同,QEMU 可以使用 KVM 加速(SUSE 仅支持加载 KVM 加速的 QEMU)。

除了提供核心虚拟化基础架构和特定于处理器的驱动程序外,QEMU 还提供了一个特定于架构的用户空间程序来管理 VM 客户机。根据架构,此程序是以下之一

  • qemu-system-i386

  • qemu-system-s390x

  • qemu-system-x86_64

  • qemu-system-aarch64

在下面,此命令称为 qemu-system-ARCH;在示例中,使用了 qemu-system-x86_64 命令。

32 设置 KVM VM 主机服务器 编辑源

本节文档介绍了如何将 openSUSE Leap 15.5 设置为基于 QEMU-KVM 的虚拟机宿主机。

Tip
提示:资源

虚拟机客户机系统需要与安装在物理机器上的情况相同的硬件资源。您计划在主机系统上运行的客户机越多,就需要向 VM 主机服务器添加越多的硬件资源—CPU、磁盘、内存和网络。

32.1 CPU 对虚拟化的支持 编辑源

要运行 KVM,您的 CPU 必须支持虚拟化,并且需要在 BIOS 中启用虚拟化。文件 /proc/cpuinfo 包含有关您的 CPU 功能的信息。

32.2 所需软件 编辑源

KVM 主机需要安装几个软件包。要安装所有必需的软件包,请执行以下操作

  1. 验证 yast2-vm 包是否已安装。此包是 YaST 的配置工具,可简化虚拟化 hypervisor 的安装。

  2. 运行 YaST ›  Virtualization ›  Install Hypervisor and Tools

    Installing the KVM hypervisor and tools
    图 32.1:安装 KVM hypervisor 和工具
  3. 选择 KVM server,最好也选择 KVM tools,然后按 Accept 确认。

  4. 在安装过程中,您可以选择让 YaST 自动创建一个 Network Bridge。如果您不打算为虚拟客户机分配额外的物理网络卡,网络桥是连接客户机到网络的标准方法。

    Network bridge
    图 32.2:网络桥
  5. 在安装了所有必需的软件包(并激活了新的网络设置)后,尝试加载与您的 CPU 类型相关的 KVM 内核模块—kvm_intelkvm_amd

    # modprobe kvm_intel

    检查模块是否已加载到内存中

    > lsmod | grep kvm
    kvm_intel              64835  6
    kvm                   411041  1 kvm_intel

    现在 KVM 主机已准备好为 KVM VM 客户机提供服务。有关更多信息,请参阅第 34 章,“使用 qemu-system-ARCH 运行虚拟机”。

32.3 KVM 主机特定功能 编辑源

通过让 KVM 虚拟机客户机完全利用 VM 主机服务器硬件的特定功能(半虚拟化),可以提高 KVM 虚拟机客户机的性能。本节介绍了一些技术,可让客户机直接访问物理主机硬件—无需模拟层—以充分利用它。

Tip
提示

本节包含的示例假定对 qemu-system-ARCH 命令行选项有基本了解。有关更多信息,请参阅第 34 章,“使用 qemu-system-ARCH 运行虚拟机”。

32.3.1 使用 virtio-scsi 使用主机存储 编辑源

virtio-scsi 是 KVM 的高级存储堆栈。它取代了以前的 virtio-blk SCSI 设备直通堆栈。与 virtio-blk 相比,它具有以下优点

改进的可扩展性

KVM 客户机具有有限数量的 PCI 控制器,这导致附加设备数量有限。 virtio-scsi 通过将多个存储设备分组到单个控制器上来解决此限制。 virtio-scsi 控制器上的每个设备都表示为一个逻辑单元,或 LUN

标准命令集

virtio-blk 使用一组少量命令,这需要 virtio-blk 驱动程序和虚拟机监视器都知道,因此引入新命令需要更新驱动程序和监视器。

相比之下,virtio-scsi 不定义命令,而是遵循行业标准 SCSI 规范的命令的传输协议。此方法与其他技术共享,如光纤通道、ATAPI 和 USB 设备。

设备命名

virtio-blk 设备在客户机内部显示为 /dev/vdX,这与物理系统中的设备名称不同,并可能导致迁移问题。

virtio-scsi 使设备名称与物理系统中的名称相同,从而使虚拟机易于迁移。

SCSI 设备直通

对于由主机上的 LUN 支持的虚拟磁盘,最好让客户机直接向 LUN 发送 SCSI 命令(直通)。这在 virtio-blk 中受到限制,因为客户机需要使用 virtio-blk 协议而不是 SCSI 命令直通,而且它不适用于 Windows 客户机。 virtio-scsi 本机消除了这些限制。

32.3.1.1 virtio-scsi 使用 编辑源

KVM 支持带 virtio-scsi-pci 设备的 SCSI 直通功能

# qemu-system-x86_64 [...] \
-device virtio-scsi-pci,id=scsi

32.3.2 使用 vhost-net 加速网络 编辑源

vhost-net 模块用于加速 KVM 的半虚拟化网络驱动程序。它提供了更低的延迟和更高的网络吞吐量。通过使用以下示例命令行启动客户机来使用 vhost-net 驱动程序

# qemu-system-x86_64 [...] \
-netdev tap,id=guest0,vhost=on,script=no \
-net nic,model=virtio,netdev=guest0,macaddr=00:16:35:AF:94:4B

guest0 是 vhost 驱动设备的一个标识符字符串。

32.3.3 使用多队列 virtio-net 扩展网络性能 编辑源

随着虚拟机客户机中虚拟 CPU 数量的增加,QEMU 提供了一种使用多队列来提高网络性能的方法。多队列 virtio-net 通过允许虚拟机客户机虚拟 CPU 并行传输数据包来扩展网络性能。多队列支持在 VM 主机服务器和 VM 客户机双方都需要。

Tip
提示:性能优势

多队列 virtio-net 解决方案在以下情况下最有利

  • 网络流量数据包很大。

  • 虚拟机客户机同时有许多连接处于活动状态,主要在客户机系统之间,或在客户机和主机之间,或在客户机和外部系统之间。

  • 活动队列的数量等于虚拟机客户机中的虚拟 CPU 数量。

Note
注意

虽然多队列 virtio-net 增加了总网络吞吐量,但它增加了 CPU 消耗,因为它使用了虚拟 CPU 的功率。

过程 32.1:如何启用多队列 virtio-net

以下过程列出了使用 qemu-system-ARCH 启用多队列功能的关键步骤。它假定 VM 主机服务器上已设置了具有多队列功能的 tap 网络设备(自内核版本 3.8 起支持)。

  1. qemu-system-ARCH 中,为 tap 设备启用多队列

    -netdev tap,vhost=on,queues=2*N

    其中 N 代表队列对的数量。

  2. qemu-system-ARCH 中,为 virtio-net-pci 设备启用多队列并指定 MSI-X(消息信号中断)向量

    -device virtio-net-pci,mq=on,vectors=2*N+2

    其中 MSI-X 向量数量的公式如下:N 用于 TX(传输)队列,N 用于 RX(接收)队列,一个用于配置目的,一个用于可能的 VQ(向量量化)控制。

  3. 在 VM 客户机中,在相关的网络接口(本例中为 eth0)上启用多队列

    > sudo ethtool -L eth0 combined 2*N

生成的 qemu-system-ARCH 命令行的外观类似于以下示例

qemu-system-x86_64 [...] -netdev tap,id=guest0,queues=8,vhost=on \
-device virtio-net-pci,netdev=guest0,mq=on,vectors=10

请注意,网络设备(guest0)的 id 在两个选项中必须相同。

在运行的 VM 客户机内部,使用 root 权限指定以下命令

> sudo ethtool -L eth0 combined 8

现在客户机系统网络使用了 qemu-system-ARCH hypervisor 的多队列支持。

32.3.4 VFIO:设备的安全直接访问 编辑源

将 PCI 设备直接分配给 VM 客户机(PCI 直通)可避免在性能关键路径中因避免任何模拟而产生的性能问题。VFIO 取代了传统的 KVM PCI 直通设备分配。此功能的前提是 VM 主机服务器配置如 “重要:VFIO 和 SR-IOV 的要求” 中所述。

要通过 VFIO 将 PCI 设备分配给 VM 客户机,您需要找出它属于哪个 IOMMU 组。 IOMMU(连接具有直接内存访问功能的 I/O 总线与主内存的输入/输出内存管理单元)API 支持组的概念。组是一组可以与其他系统中的所有设备隔离的设备。因此,组是 VFIO 使用的所有权单位。

过程 32.2:通过 VFIO 将 PCI 设备分配给 VM 客户机
  1. 识别要分配给客户机的主机 PCI 设备。

    > sudo lspci -nn
    [...]
    00:10.0 Ethernet controller [0200]: Intel Corporation 82576 \
    Virtual Function [8086:10ca] (rev 01)
    [...]

    记下设备 ID(在此示例中为 00:10.0)和供应商 ID(8086:10ca)。

  2. 查找此设备的 IOMMU 组

    > sudo readlink /sys/bus/pci/devices/0000\:00\:10.0/iommu_group
    ../../../kernel/iommu_groups/20

    此设备的 IOMMU 组是 20。现在您可以检查属于同一 IOMMU 组的设备

    > sudo ls -l /sys/bus/pci/devices/0000\:01\:10.0/iommu_group/devices/
    [...] 0000:00:1e.0 -> ../../../../devices/pci0000:00/0000:00:1e.0
    [...] 0000:01:10.0 -> ../../../../devices/pci0000:00/0000:00:1e.0/0000:01:10.0
    [...] 0000:01:10.1 -> ../../../../devices/pci0000:00/0000:00:1e.0/0000:01:10.1
  3. 将设备从设备驱动程序解绑

    > sudo echo "0000:01:10.0" > /sys/bus/pci/devices/0000\:01\:10.0/driver/unbind
  4. 使用步骤 1 中的供应商 ID 将设备绑定到 vfio-pci 驱动程序

    > sudo echo "8086 153a" > /sys/bus/pci/drivers/vfio-pci/new_id

    结果是创建了一个新设备 /dev/vfio/IOMMU_GROUP,在此情况下为 /dev/vfio/20

  5. 更改新创建设备的权限

    > sudo chown qemu.qemu /dev/vfio/DEVICE
  6. 现在运行带有分配的 PCI 设备的 VM 客户机。

    > sudo qemu-system-ARCH [...] -device
         vfio-pci,host=00:10.0,id=ID
Important
重要:不支持热插拔

截至 openSUSE Leap 15.5,通过 VFIO 传递给 VM 客户机的 PCI 设备的熱插拔不支持。

您可以在 /usr/src/linux/Documentation/vfio.txt 文件(需要安装 kernel-source 包)中找到有关 VFIO 驱动程序的更详细信息。

32.3.5 VirtFS:在主机和客户机之间共享目录 编辑源

虚拟机客户机通常运行在单独的计算空间中—它们拥有自己的内存范围、专用 CPU 和文件系统空间。共享 VM 主机服务器文件系统部分的能力通过简化数据交换使虚拟化环境更加灵活。网络文件系统,如 CIFS 和 NFS,一直是共享目录的传统方式。但由于它们不是专门为虚拟化目的设计的,因此存在主要的性能和功能问题。

KVM 引入了一种新的优化方法,称为VirtFS(有时称为文件系统直通)。VirtFS 使用半虚拟化文件系统驱动程序,该驱动程序避免将客户机应用程序的文件系统操作转换为块设备操作,然后再转换为主机文件系统操作。

您通常在以下情况下使用 VirtFS

  • 从多个客户机访问共享目录,或提供客户机到客户机的文件系统访问。

  • 在客户机启动过程中,用作虚拟磁盘的根文件系统,客户机的 RAM 磁盘连接到该文件系统。

  • 在云环境中,从单个主机文件系统为不同的客户提供存储服务。

32.3.5.1 实现 编辑源

在 QEMU 中,VirtFS 的实现通过定义两种设备得到了简化

  • virtio-9p-pci 设备,它在主机和客户机之间传输协议消息和数据。

  • fsdev 设备,它定义了导出文件系统的属性,例如文件系统类型和安全模型。

示例 32.1:使用 VirtFS 导出主机的文件系统
> sudo qemu-system-x86_64 [...] \
-fsdev local,id=exp11,path=/tmp/2,security_model=mapped3 \
-device virtio-9p-pci,fsdev=exp14,mount_tag=v_tmp5

1

要导出的文件系统的标识。

2

要导出的主机上的文件系统路径。

3

要使用的安全模型—mapped 使客户机文件系统模式和权限与主机隔离,而 none 则调用直通安全模型,在该模型中,客户机文件上的权限更改也会反映在主机上。

4

之前使用 -fsdev id= 定义的导出文件系统 ID。

5

稍后在客户机上用于挂载导出文件系统的挂载标签。

这样的导出文件系统可以在客户机上如下挂载

> sudo mount -t 9p -o trans=virtio v_tmp /mnt

其中 v_tmp 是之前使用 -device mount_tag= 定义的挂载标签,而 /mnt 是您想要挂载导出文件系统的挂载点。

32.3.6 KSM:在客户机之间共享内存页 编辑源

内核同页合并(KSM)是一个 Linux 内核功能,它将来自多个运行进程的相同内存页合并为一个内存区域。由于 KVM 客户机作为 Linux 下的进程运行,KSM 为 hypervisor 提供了内存超额分配功能,以更有效地利用内存。因此,如果您需要在内存有限的主机上运行多个虚拟机,KSM 可能会对您有所帮助。

KSM 将其状态信息存储在 /sys/kernel/mm/ksm 目录下的文件中

> ls -1 /sys/kernel/mm/ksm
full_scans
merge_across_nodes
pages_shared
pages_sharing
pages_to_scan
pages_unshared
pages_volatile
run
sleep_millisecs

有关 /sys/kernel/mm/ksm/* 文件含义的更多信息,请参阅 /usr/src/linux/Documentation/vm/ksm.txt(需要安装 kernel-source 包)。

要使用 KSM,请执行以下操作。

  1. 虽然 openSUSE Leap 在内核中包含 KSM 支持,但默认情况下它是禁用的。要启用它,请运行以下命令

    # echo 1 > /sys/kernel/mm/ksm/run
  2. 现在在 KVM 下运行多个 VM 客户机,并检查 pages_sharingpages_shared 文件的内容,例如

    > while [ 1 ]; do cat /sys/kernel/mm/ksm/pages_shared; sleep 1; done
    13522
    13523
    13519
    13518
    13520
    13520
    13528

33 客户机安装 编辑源

基于 libvirt 的工具,例如 virt-managervirt-install,提供了方便的界面来设置和管理虚拟机。它们充当 qemu-system-ARCH 命令的一种包装。但是,也可以直接使用 qemu-system-ARCH,而无需使用基于 libvirt 的工具。

Warning
警告:qemu-system-ARCH 和 libvirt

使用 qemu-system-ARCH 创建的虚拟机对基于 libvirt 的工具不可见。

33.1 使用 qemu-system-ARCH 进行基本安装 编辑源

在以下示例中,将创建一个用于 SUSE Linux Enterprise Server 11 安装的虚拟机。有关命令的详细信息,请参阅相应的 man 页。

如果您还没有要运行在虚拟化环境中的系统的映像,则需要从安装介质创建它。在这种情况下,您需要准备一个硬盘映像,并获取安装介质的映像或介质本身。

使用 qemu-img 创建一个硬盘。

> qemu-img create1 -f raw2 /images/sles/hda3 8G4

1

子命令 create 告诉 qemu-img 创建一个新映像。

2

使用 -f 参数指定磁盘的格式。

3

映像文件的完整路径。

4

映像的大小—本例中为 8 GB。映像创建为稀疏映像文件,当磁盘填充数据时会增长。指定的大小定义了映像文件可以增长到的最大大小。

在创建了至少一个硬盘映像后,您可以使用 qemu-system-ARCH 设置一个启动到安装系统的虚拟机

# qemu-system-x86_64 -name "sles"1-machine accel=kvm -M pc2 -m 7683 \
-smp 24 -boot d5 \
-drive file=/images/sles/hda,if=virtio,index=0,media=disk,format=raw6 \
-drive file=/isos/SLE-15-SP5-Online-ARCH-GM-media1.iso,index=1,media=cdrom7 \
-net nic,model=virtio,macaddr=52:54:00:05:11:118 -net user \
-vga cirrus9 -balloon virtio10

1

显示在窗口标题中的虚拟机名称,并用于 VNC 服务器。此名称必须是唯一的。

2

指定机器类型。使用 qemu-system-ARCH -M ? 显示有效参数列表。pc 是默认的标准 PC

3

虚拟机的最大内存量。

4

定义一个具有两个处理器的 SMP 系统。

5

指定引导顺序。有效值为 ab(软盘 1 和 2)、c(第一块硬盘)、d(第一张 CD-ROM),或 np(从网络适配器 1-3 引导)。默认为 c

6

定义第一个(index=0)硬盘。它以 raw 格式作为半虚拟化(if=virtio)驱动器访问。

7

第二个(index=1)映像驱动器用作 CD-ROM。

8

定义一个具有 MAC 地址 52:54:00:05:11:11 的半虚拟化(model=virtio)网络适配器。请务必指定唯一的 MAC 地址,否则可能会发生网络冲突。

9

指定显卡。如果指定 none,则禁用显卡。

10

定义半虚拟化气球设备,该设备允许动态更改内存量(最多为 -m 参数指定的最大值)。

客户机操作系统安装完成后,您可以启动相关的虚拟机,而无需指定 CD-ROM 设备

# qemu-system-x86_64 -name "sles" -machine type=pc,accel=kvm -m 768 \
-smp 2 -boot c \
-drive file=/images/sles/hda,if=virtio,index=0,media=disk,format=raw \
-net nic,model=virtio,macaddr=52:54:00:05:11:11 \
-vga cirrus -balloon virtio

33.2 使用 qemu-img 管理磁盘映像 编辑源

在上一节(请参阅 第 33.1 节,“使用 qemu-system-ARCH 进行基本安装”)中,我们使用了 qemu-img 命令来创建硬盘映像。但是,您可以使用 qemu-img 进行通用的磁盘映像操作。本节将介绍 qemu-img 子命令,以帮助灵活管理磁盘映像。

33.2.1 qemu-img 调用的一般信息 编辑源

qemu-img 使用子命令(类似于 zypper)来执行特定任务。每个子命令都理解一套不同的选项。某些选项是通用的,被多个子命令使用,而其他选项则对于相关子命令是唯一的。有关支持选项的列表,请参阅 qemu-img 手册页(man 1 qemu-img)。 qemu-img 使用以下通用语法

> qemu-img subcommand [options]

并支持以下子命令

create

在文件系统上创建一个新的磁盘映像。

check

检查现有磁盘映像是否有错误。

compare

检查两个映像是否具有相同的内容。

map

转储映像文件名及其后备文件链的元数据。

amend

修改映像文件名特定于映像格式的选项。

convert

将现有磁盘映像转换为新映像,格式不同。

info

显示有关相关磁盘映像的信息。

snapshot

管理现有磁盘映像的快照。

commit

应用对现有磁盘映像所做的更改。

rebase

基于现有映像创建新基础映像。

resize

增加或减小现有映像的大小。

33.2.2 创建、转换和检查磁盘映像 编辑源

本节介绍如何创建磁盘映像,检查其状况,将磁盘映像从一种格式转换为另一种格式,以及获取有关特定磁盘映像的详细信息。

33.2.2.1 qemu-img create 编辑源

使用 qemu-img create 为您的 VM 客户机操作系统创建一个新的磁盘映像。命令使用以下语法

> qemu-img create -f fmt1 -o options2 fname3 size4

1

目标映像的格式。支持的格式是 rawqcow2

2

某些映像格式支持要在线传递的其他选项。您可以在此处使用 -o 选项指定它们。raw 映像格式仅支持 size 选项,因此可以在命令末尾添加 -o size=8G 而不是添加 size 选项。

3

要创建的目标磁盘映像的路径。

4

目标磁盘映像的大小(如果尚未在命令末尾使用 -o size=<image_size> 选项指定)。映像大小的可选后缀是 K(千字节)、M(兆字节)、G(千兆字节)或 T(太字节)。

要在目录 /images 中创建一个新的磁盘映像 sles.raw,最大大小为 4 GB,请运行以下命令

> qemu-img create -f raw -o size=4G /images/sles.raw
Formatting '/images/sles.raw', fmt=raw size=4294967296

> ls -l /images/sles.raw
-rw-r--r-- 1 tux users 4294967296 Nov 15 15:56 /images/sles.raw

> qemu-img info /images/sles.raw
image: /images/sles11.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 0

如您所见,新创建映像的虚拟大小为 4 GB,但实际报告的磁盘大小为 0,因为尚未向映像写入任何数据。

Tip
提示:Btrfs 文件系统上的 VM 客户机映像

如果您需要在 Btrfs 文件系统上创建磁盘映像,可以使用 nocow=on 来减少 Btrfs 的写时复制功能带来的性能开销

> qemu-img create -o nocow=on test.img 8G

但是,如果您想使用写时复制(例如,用于创建或共享快照),请在不带 nocow 选项的情况下离开命令行。

33.2.2.2 qemu-img convert 编辑源

使用 qemu-img convert 将磁盘映像转换为其他格式。要获取 QEMU 支持的映像格式的完整列表,请运行 qemu-img -h 并查看输出的最后一行。命令使用以下语法

> qemu-img convert -c1 -f fmt2 -O out_fmt3 -o options4 fname5 out_fname6

1

在目标磁盘映像上应用压缩。只有 qcowqcow2 格式支持压缩。

2

源磁盘映像的格式。它通常是自动检测的,因此可以省略。

3

目标磁盘映像的格式。

4

指定与目标映像格式相关的附加选项。使用 -o ? 查看目标映像格式支持的选项列表。

5

要转换的源磁盘映像的路径。

6

转换后的目标磁盘映像的路径。

> qemu-img convert -O vmdk /images/sles.raw \
/images/sles.vmdk

> ls -l /images/
-rw-r--r-- 1 tux users 4294967296 16. lis 10.50 sles.raw
-rw-r--r-- 1 tux users 2574450688 16. lis 14.18 sles.vmdk

要查看与所选目标映像格式相关的选项列表,请运行以下命令(将 vmdk 替换为您的映像格式)

> qemu-img convert -O vmdk /images/sles.raw \
/images/sles.vmdk -o ?
Supported options:
size             Virtual disk size
backing_file     File name of a base image
compat6          VMDK version 6 image
subformat        VMDK flat extent format, can be one of {monolithicSparse \
    (default) | monolithicFlat | twoGbMaxExtentSparse | twoGbMaxExtentFlat}
scsi             SCSI image

33.2.2.3 qemu-img check 编辑源

使用 qemu-img check 检查现有磁盘映像是否有错误。并非所有磁盘映像格式都支持此功能。命令使用以下语法

> qemu-img check -f fmt1 fname2

1

源磁盘映像的格式。它通常是自动检测的,因此可以省略。

2

要检查的源磁盘映像的路径。

如果没有发现错误,命令将不返回任何输出。否则,将显示发现的错误的类型和数量。

> qemu-img check -f qcow2 /images/sles.qcow2
ERROR: invalid cluster offset=0x2af0000
[...]
ERROR: invalid cluster offset=0x34ab0000
378 errors were found on the image.

33.2.2.4 增加现有磁盘映像的大小 编辑源

创建新映像时,必须在创建映像之前指定其最大大小(请参阅 第 33.2.2.1 节,“qemu-img create”)。安装 VM 客户机并使用一段时间后,映像的初始大小可能不再足够。在这种情况下,请添加更多空间。

要将现有磁盘映像的大小增加 2 GB,请使用

> qemu-img resize /images/sles.raw +2GB
Note
注意

您可以使用 rawqcow2 格式调整磁盘映像大小。要调整其他格式的映像大小,请先使用 qemu-img convert 将其转换为支持的格式。

映像现在在最后一个分区之后包含一个 2 GB 的空闲空间。您可以调整现有分区的大小或添加新分区。

33.2.2.5 qcow2 文件格式的高级选项 编辑源

qcow2 是 QEMU 使用的主要磁盘映像格式。它的尺寸按需增长,并且仅在虚拟机需要时才分配磁盘空间。

qcow2 格式的文件以固定大小的单元组织。这些单元称为。从客户机角度看,虚拟磁盘也划分为相同大小的簇。QEMU 默认使用 64 kB 的簇大小,但您可以在创建新映像时指定不同的值

> qemu-img create -f qcow2 -o cluster_size=128K virt_disk.qcow2 4G

qcow2 映像包含一组组织在两级中的表,称为 L1 和 L2 表。每个磁盘映像只有一个 L1 表,而 L2 表可能有很多,具体取决于映像的大小。

为了读写虚拟磁盘数据,QEMU 需要读取其相应的 L2 表以查找相关数据位置。由于每次 I/O 操作都读取表会消耗系统资源,因此 QEMU 会在内存中缓存 L2 表以加速磁盘访问。

33.2.2.5.1 选择正确的缓存大小 编辑源

缓存大小与分配的空间量相关。L2 缓存可以映射以下数量的虚拟磁盘

disk_size = l2_cache_size * cluster_size / 8

使用默认的 64 kB 的簇大小,即

disk_size = l2_cache_size * 8192

因此,为了有一个缓存,它可以使用默认簇大小映射 n GB 的磁盘空间,您需要

l2_cache_size = disk_size_GB * 131072

QEMU 默认使用 1 MB (1048576 字节) 的 L2 缓存。根据上述公式,1 MB 的 L2 缓存可以覆盖 8 GB (1048576 / 131072) 的虚拟磁盘。这意味着,如果您的虚拟磁盘大小 up to 8 GB,默认的 L2 缓存大小可以满足性能要求。对于更大的磁盘,可以通过增加 L2 缓存大小来加快磁盘访问速度。

33.2.2.5.2 配置缓存大小 Edit source

您可以使用 QEMU 命令行上的 -drive 选项来指定缓存大小。或者,通过 QMP 进行通信时,使用 blockdev-add 命令。有关 QMP 的更多信息,请参阅 第 35.11 节, “QMP - QEMU 机器协议”

以下选项配置虚拟客户机的缓存大小

l2-cache-size

L2 表缓存的最大大小。

refcount-cache-size

refcount 块缓存的最大大小。有关 refcount 的更多信息,请参阅 https://raw.githubusercontent.com/qemu/qemu/master/docs/qcow2-cache.txt

cache-size

两个缓存合并的最大大小。

在指定上述选项的值时,请注意以下事项

  • L2 和 refcount 块缓存的大小都需要是群集大小的倍数。

  • 如果您只设置了其中一个选项,QEMU 会自动调整其他选项,使得 L2 缓存比 refcount 缓存大 4 倍。

refcount 缓存的使用频率远低于 L2 缓存,因此可以将其保持较小。

# qemu-system-ARCH [...] \
 -drive file=disk_image.qcow2,l2-cache-size=4194304,refcount-cache-size=262144
33.2.2.5.3 减少内存使用 Edit source

缓存越大,消耗的内存越多。每个 qcow2 文件都有一个独立的 L2 缓存。当使用大量大型磁盘映像时,您可能需要大量的内存。如果向客户机的设置链中添加了 backing 文件(参见 第 33.2.4 节, “有效管理磁盘映像”)和快照(参见 第 33.2.3 节, “使用 qemu-img 管理虚拟机快照”),内存消耗会更严重。

这就是为什么 QEMU 引入了 cache-clean-interval 设置。它定义了一个以秒为单位的时间间隔,在此之后,所有未被访问的缓存条目都将从内存中移除。

以下示例每 10 分钟清除所有未使用的缓存条目

# qemu-system-ARCH [...] -drive file=hd.qcow2,cache-clean-interval=600

如果未设置此选项,则默认值为 0,禁用此功能。

33.2.3 使用 qemu-img 管理虚拟机快照 Edit source

虚拟机快照是虚拟机客户机运行的完整环境的快照。快照包括处理器 (CPU)、内存 (RAM)、设备以及所有可写磁盘的状态。

当您需要将虚拟机保存在特定状态时,快照非常有用。例如,在配置了虚拟化服务器上的网络服务后,您希望以上次保存的状态快速启动虚拟机。或者,您可以在虚拟机关闭后创建快照,以在尝试实验性操作并导致虚拟机客户机不稳定之前创建备份状态。本节介绍后一种情况,而前一种情况在 第 35 章, “使用 QEMU Monitor 进行虚拟机管理” 中进行了描述。

要使用快照,您的虚拟机客户机必须包含至少一个 qcow2 格式的可写硬盘映像。此设备通常是第一个虚拟硬盘。

在交互式 QEMU Monitor 中,使用 savevm 命令创建 虚拟机快照。为了更容易识别特定快照,您可以为其分配一个 tag。有关 QEMU Monitor 的更多信息,请参阅 第 35 章, “使用 QEMU Monitor 进行虚拟机管理”

一旦您的 qcow2 磁盘映像包含已保存的快照,您就可以使用 qemu-img snapshot 命令检查它们。

Warning
警告:关闭虚拟机客户机

请勿在虚拟机运行时使用 qemu-img snapshot 命令创建或删除虚拟机快照。否则,您可能会损坏包含虚拟机状态保存的磁盘映像。

33.2.3.1 列出现有快照 Edit source

使用 qemu-img snapshot -l DISK_IMAGE 查看保存在 disk_image 映像中的所有现有快照列表。即使在虚拟机客户机运行时也可以获取列表。

> qemu-img snapshot -l /images/sles.qcow2
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

虚拟机的当前时钟状态。

33.2.3.2 创建已关闭虚拟机的快照 Edit source

使用 qemu-img snapshot -c SNAPSHOT_TITLE DISK_IMAGE 为先前已关闭的虚拟机的当前状态创建快照。

> qemu-img snapshot -c backup_snapshot /images/sles.qcow2
> qemu-img snapshot -l /images/sles.qcow2
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
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
5         backup_snapshot           0 2013-11-22 14:14:00   00:00:00.000

如果您的虚拟机客户机出现问题,需要恢复已保存快照的状态(在我们示例中为 ID 5),请关闭您的虚拟机客户机并执行以下命令

> qemu-img snapshot -a 5 /images/sles.qcow2

下次您使用 qemu-system-ARCH 运行虚拟机时,它将处于快照号 5 的状态。

Note
注意

qemu-img snapshot -c 命令与 QEMU Monitor 的 savevm 命令(参见 第 35 章, “使用 QEMU Monitor 进行虚拟机管理”)无关。例如,您不能在 QEMU Monitor 中使用 savevm 创建的快照上应用 qemu-img snapshot -a 快照。

33.2.3.3 删除快照 Edit source

使用 qemu-img snapshot -d SNAPSHOT_ID DISK_IMAGE 删除虚拟机旧的或不需要的快照。这会节省 qcow2 磁盘映像内的磁盘空间,因为快照数据占用的空间将被恢复。

> qemu-img snapshot -d 2 /images/sles.qcow2

33.2.4 有效管理磁盘映像 Edit source

想象一个真实的场景:您是一位服务器管理员,负责运行和管理多个虚拟化操作系统。其中一组系统基于一个特定的发行版,而另一组(或多组)则基于该发行版的不同版本,甚至可能基于不同的(可能非 Unix)平台。为了使情况更复杂,基于相同发行版的各个虚拟客户机系统根据部门和部署情况有所不同。文件服务器通常使用与 Web 服务器不同的设置和服务,而两者可能仍然基于 openSUSE

使用 QEMU 可以创建 base 磁盘映像。您可以将它们用作模板虚拟机。这些基础映像可以为您节省大量时间,因为您无需安装同一操作系统多次。

33.2.4.1 基础映像和派生映像 Edit source

首先,像往常一样构建一个磁盘映像并在此映像上安装目标系统。有关更多信息,请参阅 第 33.1 节, “使用 qemu-system-ARCH 进行基本安装”第 33.2.2 节, “创建、转换和检查磁盘映像”。然后,在将第一个映像用作基础映像的同时构建一个新映像。基础映像也称为 backing 文件。构建好新的 derived 映像后,切勿再次启动基础映像,而是启动派生映像。多个派生映像可以同时依赖一个基础映像。因此,更改基础映像可能会损坏依赖关系。在使用派生映像时,QEMU 会将更改写入其中,并且仅读取基础映像。

最好从 recién 安装(如果需要,已注册)且未应用任何补丁、未安装或删除任何其他应用程序的操作系统创建基础映像。稍后,您可以创建另一个基础映像,应用最新的补丁,并基于原始基础映像。

33.2.4.2 创建派生映像 Edit source

Note
注意

虽然您可以使用 raw 格式作为基础映像,但不能将其用于派生映像,因为 raw 格式不支持 backing_file 选项。例如,为派生映像使用 qcow2 格式。

例如,/images/sles_base.raw 是一个包含 recién 安装系统的基础映像。

> qemu-img info /images/sles_base.raw
image: /images/sles_base.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 2.4G

映像的预留大小为 4 GB,实际大小为 2.4 GB,格式为 raw。使用以下命令创建一个派生自 /images/sles_base.raw 基础映像的映像

> qemu-img create -f qcow2 /images/sles_derived.qcow2 \
-o backing_file=/images/sles_base.raw
Formatting '/images/sles_derived.qcow2', fmt=qcow2 size=4294967296 \
backing_file='/images/sles_base.raw' encryption=off cluster_size=0

查看派生映像详情

> qemu-img info /images/sles_derived.qcow2
image: /images/sles_derived.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 140K
cluster_size: 65536
backing file: /images/sles_base.raw \
(actual path: /images/sles_base.raw)

尽管派生映像的预留大小与基础映像的大小(4 GB)相同,但实际大小仅为 140 KB。原因是只保存了在派生映像内的系统中进行的更改。运行派生虚拟机,如果需要,注册它,并应用最新的补丁。在系统中执行任何其他更改,例如删除不需要的或安装新的软件包。然后关闭虚拟机客户机并再次检查其详细信息。

> qemu-img info /images/sles_derived.qcow2
image: /images/sles_derived.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 1.1G
cluster_size: 65536
backing file: /images/sles_base.raw \
(actual path: /images/sles_base.raw)

disk size 值已增长到 1.1 GB,这是与基础映像相比,文件系统上的更改所占用的磁盘空间。

33.2.4.3 重新设置派生映像的基础 Edit source

修改派生映像(应用补丁、安装特定应用程序、更改环境设置等)后,它将达到所需状态。此时,您可以将原始基础映像和派生映像合并,创建一个新的基础映像。

您的原始基础映像(/images/sles_base.raw)包含一个 recién 安装的系统。它可以作为新修改的基础映像的模板,而新映像可以包含与第一个相同的系统,并应用了所有安全和更新补丁,例如。创建此新基础映像后,您也可以将其用作更专业派生映像的模板。新基础映像将独立于原始映像。从派生映像创建基础映像的过程称为 rebasing

> qemu-img convert /images/sles_derived.qcow2 \
-O raw /images/sles_base2.raw

此命令使用 raw 格式创建了新的基础映像 /images/sles_base2.raw

> qemu-img info /images/sles_base2.raw
image: /images/sles11_base2.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 2.8G

新映像比原始基础映像大 0.4 GB。它不使用 backing 文件,并且您可以轻松地基于它创建新的派生映像。这使您可以为您的组织创建复杂的虚拟磁盘映像层次结构,节省大量时间和工作。

33.2.4.4 在 VM Host Server 上挂载映像 Edit source

将虚拟磁盘映像挂载到宿主机上可能很有用。强烈建议阅读 第 18 章, “libguestfs” 并使用专用工具访问虚拟机映像。但是,如果您需要手动执行此操作,请遵循本指南。

Linux 系统可以使用回环设备挂载 raw 磁盘映像的内部分区。第一个示例过程更复杂但更具说明性,而第二个过程则更直接。

过程 33.1: 通过计算分区偏移量挂载磁盘映像
  1. 为要挂载分区的磁盘映像设置一个 loop 设备。

    > losetup /dev/loop0 /images/sles_base.raw
  2. 查找要挂载的分区的 扇区大小 和起始 扇区号

    > fdisk -lu /dev/loop0
    
    Disk /dev/loop0: 4294 MB, 4294967296 bytes
    255 heads, 63 sectors/track, 522 cylinders, total 8388608 sectors
    Units = sectors of 1 * 512 = 5121 bytes
    Disk identifier: 0x000ceca8
    
           Device Boot      Start         End      Blocks   Id  System
    /dev/loop0p1              63     1542239      771088+  82  Linux swap
    /dev/loop0p2   *     15422402    8385929     3421845   83  Linux

    1

    磁盘扇区大小。

    2

    分区的起始扇区。

  3. 计算分区起始偏移量

    sector_size * sector_start = 512 * 1542240 = 789626880

  4. 删除回环设备,并在准备好的目录上挂载磁盘映像内的分区,该分区具有计算出的偏移量。

    > losetup -d /dev/loop0
    > mount -o loop,offset=789626880 \
    /images/sles_base.raw /mnt/sles/
    > ls -l /mnt/sles/
    total 112
    drwxr-xr-x   2 root root  4096 Nov 16 10:02 bin
    drwxr-xr-x   3 root root  4096 Nov 16 10:27 boot
    drwxr-xr-x   5 root root  4096 Nov 16 09:11 dev
    [...]
    drwxrwxrwt  14 root root  4096 Nov 24 09:50 tmp
    drwxr-xr-x  12 root root  4096 Nov 16 09:16 usr
    drwxr-xr-x  15 root root  4096 Nov 16 09:22 var
  5. 将一个或多个文件复制到挂载的分区,完成后将其卸载。

    > cp /etc/X11/xorg.conf /mnt/sles/root/tmp
    > ls -l /mnt/sles/root/tmp
    > umount /mnt/sles/
Warning
警告:不要写入正在使用的映像

切勿以 read-write 模式挂载正在运行的虚拟机的映像分区。这可能会损坏分区并导致整个虚拟机客户机崩溃。

34 使用 qemu-system-ARCH 运行虚拟机 Edit source

准备好虚拟机磁盘映像后(有关磁盘映像的更多信息,请参阅 第 33.2 节, “使用 qemu-img 管理磁盘映像”),就可以启动相关的虚拟机了。 第 33.1 节, “使用 qemu-system-ARCH 进行基本安装” 介绍了安装和运行虚拟机客户机的简单命令。本章将更详细地解释 qemu-system-ARCH 的用法,并展示解决特定任务的方法。有关 qemu-system-ARCH 选项的完整列表,请参阅其手册页(man 1 qemu)。

34.1 基本的 qemu-system-ARCH 调用 Edit source

qemu-system-ARCH 命令使用以下语法

qemu-system-ARCH OPTIONS1 -drive file=DISK_IMAGE2

1

qemu-system-ARCH 理解许多选项。其中大多数选项定义了模拟硬件的参数,而其他选项则影响更一般的模拟器行为。如果您不提供任何选项,将使用默认值,并且您需要提供要运行的磁盘映像的路径。

2

包含要虚拟化的客户机系统的磁盘映像的路径。qemu-system-ARCH 支持多种映像格式。使用 qemu-img --help 列出它们。

Important
重要:AArch64 架构

KVM 支持仅适用于 64 位 ARM 架构 (AArch64)。在 AArch64 架构上运行 QEMU 要求您指定

  • 为 QEMU ARM 虚拟机设计的机器类型,使用 -machine virt-VERSION_NUMBER 选项。

  • 使用 -bios 选项的固件映像文件。

    您也可以通过 -drive 选项指定固件映像文件,例如

    -drive file=/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw,if=pflash,format=raw
    -drive file=/var/lib/libvirt/qemu/nvram/opensuse_VARS.fd,if=pflash,format=raw
  • 使用 VM Host Server 的 CPU,使用 -cpu host 选项(默认是 cortex-15)。

  • 与主机相同的通用中断控制器 (GIC) 版本,使用 -machine gic-version=host 选项(默认是 2)。

  • 如果需要图形模式,则需要 virtio-gpu-pci 类型的图形设备。

例如

> sudo qemu-system-aarch64 [...] \
 -bios /usr/share/qemu/qemu-uefi-aarch64.bin \
 -cpu host \
 -device virtio-gpu-pci \
 -machine virt,accel=kvm,gic-version=host

34.2 通用 qemu-system-ARCH 选项 Edit source

本节介绍通用的 qemu-system-ARCH 选项以及与基本模拟硬件相关的选项,例如虚拟机处理器、内存、模型类型或时间处理方法。

-name NAME_OF_GUEST

指定运行客户机系统的名称。该名称显示在窗口标题中,并用于 VNC 服务器。

-boot OPTIONS

指定启动已定义驱动器的顺序。驱动器用字母表示,其中 ab 代表软盘驱动器 1 和 2,c 代表第一个硬盘驱动器,d 代表第一个 CD-ROM 驱动器,np 代表 Ether-boot 网络适配器。

例如,qemu-system-ARCH [...] -boot order=ndc 首先尝试从网络启动,然后从第一个 CD-ROM 驱动器启动,最后从第一个硬盘驱动器启动。

-pidfile FILENAME

将 QEMU 的进程标识号 (PID) 存储在文件中。如果您从脚本运行 QEMU,这会很有用。

-nodefaults

默认情况下,即使您未在命令行上指定,QEMU 也会创建基本的虚拟设备。此选项会关闭此功能,并且您必须手动指定每个设备,包括图形和网络卡、并行或串行端口,或虚拟控制台。默认情况下,QEMU Monitor 也不会附加。

-daemonize

在 QEMU 进程启动后,将其 守护化。QEMU 在准备好接收其任何设备上的连接后,会从标准输入和标准输出分离。

Note
注意:SeaBIOS BIOS 实现

SeaBIOS 是默认使用的 BIOS。您可以启动 USB 设备、任何驱动器(CD-ROM、软盘或硬盘)。它具有 USB 鼠标和键盘支持,并支持多个 VGA 卡。有关 SeaBIOS 的更多信息,请参阅 SeaBIOS 网站

34.2.1 基本虚拟硬件 Edit source

34.2.1.1 机器类型 Edit source

您可以指定模拟机器的类型。运行 qemu-system-ARCH -M help 来查看支持的机器类型列表。

Note
注意:ISA-PC

机器类型 isapc: ISA-only-PC 不受支持。

34.2.1.2 CPU 模型 Edit source

要指定处理器 (CPU) 模型的类型,请运行 qemu-system-ARCH -cpu MODEL。使用 qemu-system-ARCH -cpu help 查看支持的 CPU 模型列表。

34.2.1.3 其他基本选项 Edit source

以下是启动 qemu 从命令行时最常用的选项列表。要查看所有可用选项,请参阅 qemu-doc 手册页。

-m MEGABYTES

指定虚拟 RAM 大小使用的兆字节数。

-balloon virtio

指定一个半虚拟化设备,用于动态更改分配给虚拟机客户机的虚拟 RAM 量。上限是使用 -m 指定的内存量。

-smp NUMBER_OF_CPUS

指定要模拟的 CPU 数量。QEMU 在 PC 平台上支持最多 255 个 CPU(使用 KVM 加速时最多 64 个)。此选项还接受其他与 CPU 相关的参数,例如 sockets 的数量、每个套接字 cores 的数量,或每个核心 threads 的数量。

以下是工作正常的 qemu-system-ARCH 命令行的示例

> sudo qemu-system-x86_64 \
 -name "SLES 15.5" \
 -M pc-i440fx-2.7 -m 512 \
 -machine accel=kvm -cpu kvm64 -smp 2 \
 -drive format=raw,file=/images/sles.raw
QEMU window with SLES as VM Guest
图 34.1: 带有 SLES 作为虚拟机客户机的 QEMU 窗口
-no-acpi

禁用 ACPI 支持。

-S

QEMU 以 CPU 停止状态启动。要启动 CPU,请在 QEMU Monitor 中输入 c。有关更多信息,请参阅 第 35 章, “使用 QEMU Monitor 进行虚拟机管理”

34.2.2 存储和读取虚拟设备配置 Edit source

-readconfig CFG_FILE

每次要运行虚拟机客户机时,qemu-system-ARCH 可以从之前使用 -writeconfig 保存或手动编辑的文件中读取设备配置,而不是每次都在命令行上输入设备配置选项。

-writeconfig CFG_FILE

将当前虚拟机的设备配置转储到一个文本文件。之后可以与 -readconfig 选项一起重复使用。

> sudo qemu-system-x86_64 -name "SLES 15.5" \
 -machine accel=kvm -M pc-i440fx-2.7 -m 512 -cpu kvm64 \
 -smp 2 /images/sles.raw -writeconfig /images/sles.cfg
(exited)
> cat /images/sles.cfg
# qemu config file

[drive]
  index = "0"
  media = "disk"
  file = "/images/sles_base.raw"

这样,您可以有效地以一种井井有条的方式管理虚拟机设备的配置。

34.2.3 客户机实时时钟 Edit source

-rtc OPTIONS

指定在虚拟机客户机内部处理 RTC 的方式。默认情况下,客户机的时钟派生自宿主机系统。因此,建议宿主机系统时钟与准确的外部时钟同步(例如,通过 NTP 服务)。

如果您需要将虚拟机客户机时钟与宿主机时钟隔离,请指定 clock=vm 而不是默认的 clock=host

您还可以使用 base 选项指定虚拟机客户机时钟的初始时间

> sudo qemu-system-x86_64 [...] -rtc clock=vm,base=2010-12-03T01:02:00

除了时间戳,您还可以指定 utclocaltime。前者指示虚拟机客户机从当前 UTC 值(协调世界时,参见 http://en.wikipedia.org/wiki/UTC)开始,后者则应用本地时间设置。

34.3 在 QEMU 中使用设备 Edit source

QEMU 虚拟机模拟运行虚拟机客户机所需的所有设备。QEMU 支持多种类型的网络卡、块设备(硬盘和可移动驱动器)、USB 设备、字符设备(串行和并行端口)或多媒体设备(图形卡和声卡)等。本节介绍配置多种支持设备类型的选项。

Tip
提示

如果您的设备(例如 -drive)需要特殊驱动程序和驱动程序属性,请使用 -device 选项指定它们,并使用 drive= 子选项进行识别。例如

> sudo qemu-system-x86_64 [...] -drive if=none,id=drive0,format=raw \
-device virtio-blk-pci,drive=drive0,scsi=off ...

要获取有关可用驱动程序及其属性的帮助,请使用 -device ?-device DRIVER,?

34.3.1 块设备 Edit source

块设备对虚拟机至关重要。这些是固定或可移动的存储介质,称为 drives。连接的硬盘之一通常用于存储要虚拟化的客户机操作系统。

虚拟机驱动器使用 -drive 定义。此选项包含许多子选项,其中一些在本节中进行了描述。有关完整列表,请参阅手册页(man 1 qemu)。

用于 -drive 选项的子选项
file=image_fname

指定要与此驱动器一起使用的磁盘映像的路径。如果未指定,则假定为空(可移动)驱动器。

if=drive_interface

指定驱动器连接到的接口类型。目前 SUSE 只支持 floppyscsiidevirtiovirtio 定义了一个半虚拟化磁盘驱动程序。默认值为 ide

index=index_of_connector

指定驱动器连接到的磁盘接口(请参阅 if 选项)上连接器的索引号。如果未指定,则索引会自动递增。

media=type

指定媒体类型。可以是 disk(用于硬盘)或 cdrom(用于可移动 CD-ROM 驱动器)。

format=img_fmt

指定连接的磁盘映像的格式。如果未指定,则自动检测格式。目前,SUSE 支持 rawqcow2 格式。

cache=method

指定驱动器的缓存方法。可能的值包括 unsafewritethroughwritebackdirectsyncnone。为了在使用 qcow2 映像格式时提高性能,请选择 writebacknone 会禁用宿主机页面缓存,因此是最安全的选择。图像文件的默认值为 writeback。有关更多信息,请参阅 第 16 章, “磁盘缓存模式”

Tip
提示

为了简化块设备的定义,QEMU 理解几种快捷方式,您在输入 qemu-system-ARCH 命令时可能会觉得它们很方便。

您可以使用

> sudo qemu-system-x86_64 -cdrom /images/cdrom.iso

而不是

> sudo qemu-system-x86_64 -drive format=raw,file=/images/cdrom.iso,index=2,media=cdrom

> sudo qemu-system-x86_64 -hda /images/imagei1.raw -hdb /images/image2.raw -hdc \
/images/image3.raw -hdd /images/image4.raw

而不是

> sudo qemu-system-x86_64 -drive format=raw,file=/images/image1.raw,index=0,media=disk \
-drive format=raw,file=/images/image2.raw,index=1,media=disk \
-drive format=raw,file=/images/image3.raw,index=2,media=disk \
-drive format=raw,file=/images/image4.raw,index=3,media=disk
Tip
提示:使用宿主机驱动器而不是映像

作为磁盘映像(请参阅 第 33.2 节, “使用 qemu-img 管理磁盘映像”)的替代方法,您还可以使用现有的 VM Host Server 磁盘,将它们连接为驱动器,并从 VM Guest 访问它们。直接使用宿主机磁盘设备,而不是磁盘映像文件名。

要访问宿主机 CD-ROM 驱动器,请使用

> sudo qemu-system-x86_64 [...] -drive file=/dev/cdrom,media=cdrom

要访问宿主机硬盘,请使用

> sudo qemu-system-x86_64 [...] -drive file=/dev/hdb,media=disk

虚拟机客户机使用的宿主机驱动器不得被 VM Host Server 或另一个 VM Guest 同时访问。

34.3.1.1 释放未使用的客户机磁盘空间 Edit source

稀疏映像文件是一种磁盘映像文件,当用户向其中添加数据时,它会增长,只占用其中存储的数据量。例如,如果您将 1 GB 数据复制到稀疏磁盘映像中,其大小将增长 1 GB。如果您随后删除例如 500 MB 的数据,映像大小默认不会按预期减小。

因此,在 KVM 命令行上引入了 discard=on 选项。它告诉 hypervisor 在从稀疏客户机映像删除数据后自动释放 holes。请注意,此选项仅对 if=scsi 驱动器接口有效。

> sudo qemu-system-x86_64 [...] -drive format=img_format,file=/path/to/file.img,if=scsi,discard=on
Important
重要:支持状态

if=scsi 不受支持。此接口不映射到 virtio-scsi,而是映射到 lsi SCSI adapter

34.3.1.2 IOThreads Edit source

IOThreads 是 virtio 设备专用的事件循环线程,用于执行 I/O 请求,以提高可伸缩性,特别是在具有使用大量磁盘设备的 SMP 虚拟机客户机的 SMP VM Host Server 上。IOThreads 不使用 QEMU 的主事件循环进行 I/O 处理,而是允许将 I/O 工作分散到多个 CPU 上,并在正确配置时提高延迟。

IOThreads 通过定义 IOThread 对象来启用。然后,virtio 设备可以使用这些对象进行 I/O 事件循环。许多 virtio 设备可以使用单个 IOThread 对象,或者可以配置 virtio 设备和 IOThread 对象为 1:1 映射。以下示例创建了一个 ID 为 iothread0 的单个 IOThread,然后该线程用作两个 virtio-blk 设备的事件循环。

> sudo qemu-system-x86_64 [...] -object iothread,id=iothread0\
-drive if=none,id=drive0,cache=none,aio=native,\
format=raw,file=filename -device virtio-blk-pci,drive=drive0,scsi=off,\
iothread=iothread0 -drive if=none,id=drive1,cache=none,aio=native,\
format=raw,file=filename -device virtio-blk-pci,drive=drive1,scsi=off,\
iothread=iothread0 [...]

以下 QEMU 命令行示例说明了 1:1 virtio 设备到 IOThread 的映射

> sudo qemu-system-x86_64 [...] -object iothread,id=iothread0\
-object iothread,id=iothread1 -drive if=none,id=drive0,cache=none,aio=native,\
format=raw,file=filename -device virtio-blk-pci,drive=drive0,scsi=off,\
iothread=iothread0 -drive if=none,id=drive1,cache=none,aio=native,\
format=raw,file=filename -device virtio-blk-pci,drive=drive1,scsi=off,\
    iothread=iothread1 [...]

34.3.1.3 virtio-blk 的基于 Bio 的 I/O 路径 Edit source

为了提高 I/O 密集型应用程序的性能,在内核版本 3.7 中为 virtio-blk 接口引入了一条新的 I/O 路径。这个基于 Bio 的块设备驱动程序跳过了 I/O 调度程序,从而缩短了客户机的 I/O 路径并降低了延迟。它对于 SSD 磁盘等高速存储设备特别有用。

该驱动程序默认禁用。要使用它,请执行以下操作

  1. virtio_blk.use_bio=1 添加到客户机的内核命令行。您可以通过 YaST › System › Boot Loader 来实现。

    您也可以通过编辑 /etc/default/grub,找到包含 GRUB_CMDLINE_LINUX_DEFAULT= 的行,然后在末尾添加内核参数。然后运行 grub2-mkconfig >/boot/grub2/grub.cfg 更新 grub2 启动菜单。

  2. 使用新的内核命令行激活的客户机重启。

Tip
提示:慢速设备上的 Bio-based 驱动程序

Bio-based virtio-blk 驱动程序对旋转硬盘等慢速设备没有帮助。原因是调度带来的好处大于缩短的 Bio 路径所提供的优势。请勿在慢速设备上使用 Bio-based 驱动程序。

34.3.1.4 直接访问 iSCSI 资源 Edit source

QEMU 现在已与 libiscsi 集成。这允许 QEMU 直接访问 iSCSI 资源并将其用作虚拟机块设备。此功能不需要任何宿主机 iSCSI 启动器配置,这对于基于 libvirt iSCSI 的存储池设置是必需的。相反,它通过用户空间库 libiscsi 将客户机存储接口直接连接到 iSCSI 目标 LUN。基于 iSCSI 的磁盘设备也可以在 libvirt XML 配置中指定。

Note
注意:RAW 映像格式

此功能仅在使用 RAW 映像格式时可用,因为 iSCSI 协议存在某些技术限制。

以下是用于 iSCSI 连接的 QEMU 命令行界面。

Note
注意:virt-manager 限制

libiscsi 基于的存储配置尚未由 virt-manager 接口公开,而是通过直接编辑客户机 XML 进行配置。这种访问基于 iSCSI 存储的新方法需要在命令行中完成。

> sudo qemu-system-x86_64 -machine accel=kvm \
  -drive file=iscsi://192.168.100.1:3260/iqn.2016-08.com.example:314605ab-a88e-49af-b4eb-664808a3443b/0,\
  format=raw,if=none,id=mydrive,cache=none \
  -device ide-hd,bus=ide.0,unit=0,drive=mydrive ...

这是使用协议基于的 iSCSI 的客户机域 XML 的示例片段

<devices>
...
  <disk type='network' device='disk'>
    <driver name='qemu' type='raw'/>
    <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/2'>
      <host name='example.com' port='3260'/>
    </source>
    <auth username='myuser'>
      <secret type='iscsi' usage='libvirtiscsi'/>
    </auth>
    <target dev='vda' bus='virtio'/>
  </disk>
</devices>

与 virt-manager 设置的基于宿主机的 iSCSI 启动器的示例进行对比

<devices>
...
  <disk type='block' device='disk'>
    <driver name='qemu' type='raw' cache='none' io='native'/>
    <source dev='/dev/disk/by-path/scsi-0:0:0:0'/>
    <target dev='hda' bus='ide'/>
    <address type='drive' controller='0' bus='0' target='0' unit='0'/>
  </disk>
  <controller type='ide' index='0'>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
             function='0x1'/>
  </controller>
</devices>

34.3.1.5 将 RADOS 块设备与 QEMU 配合使用 Edit source

RADOS 块设备 (RBD) 将数据存储在 Ceph 集群中。它们支持快照、复制和数据一致性。您可以像使用其他块设备一样,在 KVM 管理的虚拟机客户机中使用 RBD。

34.3.2 图形设备和显示选项 Edit source

本节介绍影响模拟显卡类型以及虚拟机客户机图形输出显示方式的 QEMU 选项。

34.3.2.1 定义显卡 Edit source

QEMU 使用 -vga 来定义用于显示虚拟机客户机图形输出的显卡。-vga 选项支持以下值

none

在虚拟机客户机上禁用显卡(不模拟显卡)。您仍然可以通过串行控制台访问正在运行的虚拟机客户机。

std

模拟标准的 VESA 2.0 VBE 显卡。如果您打算在虚拟机客户机上使用高分辨率显示,请使用它。

qxl

QXL 是一种半虚拟化显卡。它兼容 VGA(包括 VESA 2.0 VBE 支持)。在使用 spice 视频协议时,建议使用 qxl

virtio

半虚拟化 VGA 显卡。

34.3.2.2 显示选项 Edit source

以下选项影响虚拟机客户机图形输出的显示方式。

-display gtk

在 GTK 窗口中显示视频输出。此界面提供了在运行时配置和控制虚拟机的 UI 元素。

-display sdl

通过 SDL 在单独的图形窗口中显示视频输出。有关更多信息,请参阅 SDL 文档。

-spice option[,option[,...]]

启用 spice 远程桌面协议。

-display vnc

有关更多信息,请参阅 第 34.5 节, “使用 VNC 查看虚拟机客户机”

-nographic

禁用 QEMU 的图形输出。模拟的串行端口将重定向到控制台。

使用 -nographic 启动虚拟机后,在虚拟控制台中按 CtrlA H 查看其他有用快捷键的列表,例如,用于在控制台和 QEMU Monitor 之间切换。

> sudo qemu-system-x86_64 -hda /images/sles_base.raw -nographic

C-a h    print this help
C-a x    exit emulator
C-a s    save disk data back to file (if -snapshot)
C-a t    toggle console timestamps
C-a b    send break (magic sysrq)
C-a c    switch between console and monitor
C-a C-a  sends C-a
(pressed C-a c)

QEMU 2.3.1 monitor - type 'help' for more information
(qemu)
-no-frame

禁用 QEMU 窗口的装饰。便于专用桌面工作区。

-full-screen

以全屏模式启动 QEMU 图形输出。

-no-quit

禁用 QEMU 窗口的关闭按钮,并防止其被强制关闭。

-alt-grab, -ctrl-grab

默认情况下,QEMU 窗口在按下 CtrlAlt 后会释放 captured 的鼠标。您可以将按键组合更改为 CtrlAltShift-alt-grab),或右侧 Ctrl 键(-ctrl-grab)。

34.3.3 USB 设备 Edit source

有两种方法可以创建虚拟机客户机在 KVM 中可用的 USB 设备:您可以模拟虚拟机客户机内的 USB 设备,或者将现有的宿主机 USB 设备分配给虚拟机客户机。要使用 QEMU 中的 USB 设备,您首先需要使用 -usb 选项启用通用 USB 驱动程序。然后,您可以使用 -usbdevice 选项指定单个设备。

34.3.3.1 模拟虚拟机客户机中的 USB 设备 Edit source

SUSE 目前支持以下类型的 USB 设备:diskhostserialbraillenetmousetablet

用于 -usbdevice 选项的 USB 设备类型
disk

模拟基于文件的海量存储设备。可选的 format 选项比自动检测格式更常用。

> sudo qemu-system-x86_64 [...] -usbdevice
        disk:format=raw:/virt/usb_disk.raw
host

传递宿主机设备(由 bus.addr 标识)。

serial

串行转换器到宿主机字符设备。

braille

使用 BrlAPI 模拟盲文设备以显示盲文输出。

net

模拟支持 CDC 以太网和 RNDIS 协议的网络适配器。

mouse

模拟虚拟 USB 鼠标。此选项会覆盖默认的 PS/2 鼠标模拟。以下示例显示了使用 qemu-system-ARCH [...] -usbdevice mouse 启动的虚拟机客户机的鼠标硬件状态。

> sudo hwinfo --mouse
20: USB 00.0: 10503 USB Mouse
[Created at usb.122]
UDI: /org/freedesktop/Hal/devices/usb_device_627_1_1_if0
[...]
Hardware Class: mouse
Model: "Adomax QEMU USB Mouse"
Hotplug: USB
Vendor: usb 0x0627 "Adomax Technology Co., Ltd"
Device: usb 0x0001 "QEMU USB Mouse"
[...]
tablet

模拟使用绝对坐标的指针设备(例如触摸屏)。此选项会覆盖默认的 PS/2 鼠标模拟。平板设备在通过 VNC 协议查看虚拟机客户机时很有用。有关更多信息,请参阅 第 34.5 节, “使用 VNC 查看虚拟机客户机”

34.3.4 字符设备 Edit source

使用 -chardev 创建一个新的字符设备。该选项使用以下通用语法

qemu-system-x86_64 [...] -chardev BACKEND_TYPE,id=ID_STRING

其中 BACKEND_TYPE 可以是 nullsocketudpmsmousevcfilepipeconsoleserialptystdiobraillettyparport。所有字符设备都必须有一个唯一的标识字符串,最长为 127 个字符。它用于在其他相关指令中标识设备。有关所有后端子选项的完整描述,请参阅手册页(man 1 qemu)。下面简要描述了可用的 back-ends

null

创建一个空设备,该设备不输出任何数据并丢弃接收到的任何数据。

stdio

连接到 QEMU 的标准输入和标准输出。

socket

创建一个双向流套接字。如果指定了 PATH,则创建一个 Unix 套接字

> sudo qemu-system-x86_64 [...] -chardev \
socket,id=unix_socket1,path=/tmp/unix_socket1,server

SERVER 子选项指定套接字是监听套接字。

如果指定了 PORT,则创建一个 TCP 套接字

> sudo qemu-system-x86_64 [...] -chardev \
socket,id=tcp_socket1,host=localhost,port=7777,server,nowait

命令在端口 7777 上创建一个本地监听(server)TCP 套接字。QEMU 不会阻塞等待客户端连接到监听端口(nowait)。

udp

通过 UDP 协议将虚拟机客户机的所有网络流量发送到远程主机。

> sudo qemu-system-x86_64 [...] \
-chardev udp,id=udp_fwd,host=mercury.example.com,port=7777

命令在远程主机 mercury.example.com 上绑定端口 7777,并将虚拟机客户机网络流量发送到那里。

vc

创建一个新的 QEMU 文本控制台。您可以选择指定虚拟控制台的尺寸

> sudo qemu-system-x86_64 [...] -chardev vc,id=vc1,width=640,height=480 \
-mon chardev=vc1

命令创建一个名为 vc1 的新虚拟控制台,并指定其大小,然后将其连接到 QEMU Monitor。

file

将虚拟机客户机的所有流量记录到 VM Host Server 上的文件。需要 path,如果不存在,则会自动创建。

> sudo qemu-system-x86_64 [...] \
-chardev file,id=qemu_log1,path=/var/log/qemu/guest1.log

默认情况下,QEMU 会为串行和并行端口创建一组字符设备,以及一个用于 QEMU Monitor 的特殊控制台。但是,您可以创建自己的字符设备并将其用于上述目的。以下选项可能对您有帮助

-serial CHAR_DEV

将虚拟机客户机的虚拟串行端口重定向到 VM Host Server 上的字符设备 CHAR_DEV。默认情况下,在图形模式下它是虚拟控制台(vc),在非图形模式下是 stdio-serial 支持许多子选项。有关完整列表,请参阅手册页(man 1 qemu)。

您最多可以模拟四个串行端口。使用 -serial none 禁用所有串行端口。

-parallel DEVICE

将虚拟机客户机的并行端口重定向到 DEVICE。此选项支持与 -serial 相同的设备。

Tip
提示

openSUSE Leap 作为 VM Host Server 时,您可以直接使用硬件并行端口设备 /dev/parportN,其中 N 是端口号。

您最多可以模拟三个并行端口。使用 -parallel none 禁用所有并行端口。

-monitor CHAR_DEV

将 QEMU Monitor 重定向到 VM Host Server 上的字符设备 CHAR_DEV。此选项支持与 -serial 相同的设备。默认情况下,在图形模式下它是虚拟控制台(vc),在非图形模式下是 stdio

有关所有可用字符设备后端类型的完整列表,请参阅手册页(man 1 qemu)。

34.4 QEMU 中的网络 Edit source

使用 -netdev 选项结合 -device 来为您的虚拟机客户机定义特定类型的网络和网卡。 -netdev 选项的语法是

-netdev type[,prop[=value][,...]]

目前,SUSE 支持以下网络类型:userbridgetap。有关 -netdev 子选项的完整列表,请参阅手册页(man 1 qemu)。

支持的 -netdev 子选项
bridge

使用指定的网络辅助程序配置 TAP 接口并将其连接到指定的 VLAN。有关更多信息,请参阅 第 34.4.3 节, “桥接网络”

user

指定用户模式网络。有关更多信息,请参阅 第 34.4.2 节, “用户模式网络”

tap

指定桥接或路由网络。有关更多信息,请参阅 第 34.4.3 节, “桥接网络”

34.4.1 定义网卡 Edit source

使用 -netdev 和相关的 -device 选项来添加新的模拟网卡

> sudo qemu-system-x86_64 [...] \
-netdev tap1,id=hostnet0 \
-device virtio-net-pci2,netdev=hostnet0,vlan=13,\
macaddr=00:16:35:AF:94:4B4,name=ncard1

1

指定网络设备类型。

2

指定网卡型号。使用 qemu-system-ARCH -device help 并搜索 Network devices: 部分,以获取您的平台上 QEMU 支持的所有网卡型号列表。

目前,SUSE 支持 rtl8139e1000 及其变体 e1000-82540eme1000-82544gce1000-82545em,以及 virtio-net-pci。要查看特定驱动程序的选项列表,请添加 help 作为驱动程序选项

> sudo qemu-system-x86_64 -device e1000,help
e1000.mac=macaddr
e1000.vlan=vlan
e1000.netdev=netdev
e1000.bootindex=int32
e1000.autonegotiation=on/off
e1000.mitigation=on/off
e1000.addr=pci-devfn
e1000.romfile=str
e1000.rombar=uint32
e1000.multifunction=on/off
e1000.command_serr_enable=on/off

3

连接到 VLAN 号 1。您可以指定自己的号码,它主要用于标识目的。如果省略此子选项,QEMU 将使用默认值 0。

4

指定网卡的 MAC 地址。它是一个唯一标识符,建议您始终指定它。如果没有指定,QEMU 会提供自己的默认 MAC 地址,并可能在相关 VLAN 中产生 MAC 地址冲突。

34.4.2 用户模式网络 Edit source

The -netdev user option instructs QEMU to use user-mode networking. This is the default if no networking mode is selected. Therefore, these command lines are equivalent

> sudo qemu-system-x86_64 -hda /images/sles_base.raw
> sudo qemu-system-x86_64 -hda /images/sles_base.raw -netdev user,id=hostnet0

这种模式对于允许虚拟机客户机访问外部网络资源(如 Internet)很有用。默认情况下,不允许任何传入流量,因此虚拟机客户机对网络上的其他计算机不可见。此网络模式不需要管理员权限。用户模式也适用于在虚拟机客户机上从 VM Host Server 上的本地目录进行网络启动。

虚拟机客户机从虚拟 DHCP 服务器分配 IP 地址。VM Host Server(DHCP 服务器)可通过 10.0.2.2 访问,而 IP 地址分配范围从 10.0.2.15 开始。您可以使用 ssh 连接到 10.0.2.2 上的 VM Host Server,并使用 scp 在两者之间复制文件。

34.4.2.1 命令行示例 Edit source

本节展示了如何使用 QEMU 设置用户模式网络的几个示例。

示例 34.1: 受限的用户模式网络
> sudo qemu-system-x86_64 [...] \
-netdev user1,id=hostnet0 \
-device virtio-net-pci,netdev=hostnet0,vlan=12,name=user_net13,restrict=yes4

1

指定用户模式网络。

2

连接到 VLAN 号 1。如果省略,则默认为 0。

3

指定网络堆栈的可读名称。在 QEMU Monitor 中识别时很有用。

4

隔离虚拟机客户机。然后它无法与 VM Host Server 通信,也没有网络数据包路由到外部网络。

示例 34.2: 具有自定义 IP 范围的用户模式网络
> sudo qemu-system-x86_64 [...] \
-netdev user,id=hostnet0 \
-device virtio-net-pci,netdev=hostnet0,net=10.2.0.0/81,host=10.2.0.62,\
dhcpstart=10.2.0.203,hostname=tux_kvm_guest4

1

指定虚拟机客户机看到的网络 IP 地址以及可选的子网掩码。默认为 10.0.2.0/8。

2

指定虚拟机客户机看到的 VM Host Server IP 地址。默认为 10.0.2.2。

3

指定内置 DHCP 服务器可以分配给虚拟机客户机的 16 个 IP 地址中的第一个。默认为 10.0.2.15。

4

指定内置 DHCP 服务器分配给虚拟机客户机的宿主机名。

示例 34.3: 具有网络启动和 TFTP 的用户模式网络
> sudo qemu-system-x86_64 [...] \
-netdev user,id=hostnet0 \
-device virtio-net-pci,netdev=hostnet0,tftp=/images/tftp_dir1,\
bootfile=/images/boot/pxelinux.02

1

激活内置的 TFTP(一种具有基本 FTP 功能的文件传输协议)服务器。指定目录中的文件对虚拟机客户机可见,作为 TFTP 服务器的根。

2

将指定文件广播为 BOOTP(一种提供 IP 地址和启动映像网络位置的网络协议,常用于无盘工作站)文件。与 tftp 一起使用时,虚拟机客户机可以通过网络从宿主机上的本地目录启动。

示例 34.4: 具有宿主机端口转发的用户模式网络
> sudo qemu-system-x86_64 [...] \
-netdev user,id=hostnet0 \
-device virtio-net-pci,netdev=hostnet0,hostfwd=tcp::2222-:22

将宿主机上的端口 2222 的传入 TCP 连接转发到虚拟机客户机上的端口 22(SSH)。如果虚拟机客户机上运行了 sshd,请键入

> ssh qemu_host -p 2222

其中 qemu_host 是宿主机的名称或 IP 地址,以获得来自虚拟机客户机的 SSH 提示。

34.4.3 桥接网络 Edit source

使用 -netdev tap 选项,QEMU 通过将宿主机 TAP 网络设备连接到虚拟机客户机指定的 VLAN 来创建网络桥。然后,其网络接口对网络其余部分可见。此方法默认不工作,需要显式指定。

首先,创建一个网络桥并将 VM Host Server 的物理网络接口(例如 eth0)添加到其中

  1. 启动 YaST 控制中心,然后选择 System › Network Settings

  2. Hardware Dialog 窗口中,单击 Add,然后从 Device Type 下拉框中选择 Bridge。单击 Next

  3. 选择您是否需要动态或静态分配的 IP 地址,并在适用时填写相关网络设置。

  4. Bridged Devices 窗格中,选择要添加到桥接的以太网设备。

    单击 Next。当询问是否适配已配置设备时,单击 Continue

  5. 单击 OK 应用更改。检查桥是否已创建

    > bridge link
    2: eth0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 \
     state forwarding priority 32 cost 100

34.4.3.1 手动连接到桥接 Edit source

使用以下示例脚本将虚拟机客户机连接到新创建的桥接接口 br0。脚本中的多个命令通过 sudo 机制运行,因为它们需要 root 权限。

Tip
提示:所需软件

要管理网络桥,您需要安装 tunctl 包。

#!/bin/bash
bridge=br01
tap=$(sudo tunctl -u $(whoami) -b)2
sudo ip link set $tap up3
sleep 1s4
sudo ip link add name $bridge type bridge
sudo ip link set $bridge up
sudo ip link set $tap master $bridge5
qemu-system-x86_64 -machine accel=kvm -m 512 -hda /images/sles_base.raw \
 -netdev tap,id=hostnet0 \
 -device virtio-net-pci,netdev=hostnet0,vlan=0,macaddr=00:16:35:AF:94:4B,\
 ifname=$tap6,script=no7,downscript=no
sudo ip link set $tap nomaster8
sudo ip link set $tap down9
sudo tunctl -d $tap10

1

桥接设备的名称。

2

准备一个新的 TAP 设备并将其分配给运行脚本的用户。TAP 设备是虚拟网络设备,常用于虚拟化和仿真设置。

3

启动新创建的 TAP 网络接口。

4

暂停 1 秒钟,以确保新的 TAP 网络接口确实已启动。

5

将新的 TAP 设备添加到网络桥 br0

6

ifname= 子选项指定用于桥接的 TAP 网络接口的名称。

7

qemu-system-ARCH 连接到网络桥之前,它会检查 scriptdownscript 的值。如果它在 VM Host Server 文件系统中找到指定的脚本,它会在连接到网络桥之前运行 script,并在退出网络环境后运行 downscript。您可以使用这些脚本来设置和拆除桥接接口。默认情况下,会检查 /etc/qemu-ifup/etc/qemu-ifdown。如果指定了 script=nodownscript=no,则脚本执行被禁用,您需要手动处理。

8

将 TAP 接口从网络桥 br0 中删除。

9

将 TAP 设备的状态设置为 down

10

拆除 TAP 设备。

34.4.3.2 使用 qemu-bridge-helper 连接到桥接 Edit source

通过网络桥将虚拟机客户机连接到网络的另一种方法是通过 qemu-bridge-helper 辅助程序。它会为您配置 TAP 接口,并将其连接到指定的桥接。默认的辅助可执行文件是 /usr/lib/qemu-bridge-helper。辅助可执行文件是 setuid root,它只能由虚拟化组(kvm)的成员执行。因此,qemu-system-ARCH 命令本身不需要以 root 权限运行。

指定网络桥时会自动调用辅助程序

qemu-system-x86_64 [...] \
 -netdev bridge,id=hostnet0,vlan=0,br=br0 \
 -device virtio-net-pci,netdev=hostnet0

您可以指定自己的自定义辅助脚本,该脚本负责 TAP 设备的(去)配置,使用 helper=/path/to/your/helper 选项。

qemu-system-x86_64 [...] \
 -netdev bridge,id=hostnet0,vlan=0,br=br0,helper=/path/to/bridge-helper \
 -device virtio-net-pci,netdev=hostnet0
Tip
提示

要定义对 qemu-bridge-helper 的访问权限,请检查 /etc/qemu/bridge.conf 文件。例如,以下指令

allow br0

允许 qemu-system-ARCH 命令将其虚拟机客户机连接到网络桥 br0

34.5 使用 VNC 查看虚拟机客户机 Edit source

默认情况下,QEMU 使用 GTK(一个跨平台工具包库)窗口来显示虚拟机客户机的图形输出。通过指定 -vnc 选项,您可以让 QEMU 在指定的 VNC 显示器上监听,并将图形输出重定向到 VNC 会话。

Tip
提示

通过 VNC 会话使用 QEMU 虚拟机时,使用 -usbdevice tablet 选项很有用。

此外,如果您需要使用不同于默认 en-us 的键盘布局,请使用 -k 选项指定它。

-vnc 的第一个子选项必须是 display 值。-vnc 选项支持以下显示规范

host:display

仅接受来自 host 在显示号 display 上的连接。VNC 会话正在运行的 TCP 端口通常是 5900 + display 号。如果您不指定 host,则接受来自任何主机的连接。

unix:path

VNC 服务器在 Unix 域套接字上监听连接。path 选项指定相关 Unix 套接字的位置。

none

VNC 服务器功能已初始化,但服务器本身尚未启动。您稍后可以使用 QEMU Monitor 启动 VNC 服务器。有关更多信息,请参阅 第 35 章, “使用 QEMU Monitor 进行虚拟机管理”

在显示值之后,可以有一个或多个由逗号分隔的选项标志。有效的选项是

reverse

通过 reverse 连接连接到正在监听的 VNC 客户端。

websocket

打开一个额外的 TCP 监听端口,专门用于 VNC Websocket 连接。默认情况下, Websocket 端口是 5700+display。

password

要求使用基于密码的身份验证进行客户端连接。

tls

要求客户端在使用 TLS 时与 VNC 服务器通信。

x509=/path/to/certificate/dir

如果指定了 TLS,则有效。要求使用 x509 凭证来协商 TLS 会话。

x509verify=/path/to/certificate/dir

如果指定了 TLS,则有效。要求使用 x509 凭证来协商 TLS 会话。

sasl

要求客户端使用 SASL 进行 VNC 服务器的身份验证。

acl

为 x509 客户端证书和 SASL 方的检查打开访问控制列表。

lossy

启用有损压缩方法(gradient、JPEG 等)。

非自适应

禁用自适应编码。自适应编码默认启用。

share=[allow-exclusive|force-shared|ignore]

设置显示共享策略。

Note
注意

有关显示选项的更多详细信息,请参阅 qemu-doc man 页。

VNC 使用示例

tux > sudo qemu-system-x86_64 [...] -vnc :5
# (on the client:)
wilber > vncviewer venus:5 &
QEMU VNC session
图 34.2: QEMU VNC 会话

34.5.1 安全的 VNC 连接 Edit source

默认的 VNC 服务器设置不使用任何形式的身份验证。在前面的示例中,任何用户都可以从网络上的任何主机连接并查看 QEMU VNC 会话。

您可以将几种安全级别应用于 VNC 客户端/服务器连接。您可以选择使用密码保护您的连接、使用 x509 证书、使用 SASL 身份验证,甚至在一个 QEMU 命令中组合多种身份验证方法。

有关在 VM Host Server 和客户端上配置 x509 证书的更多信息,请参阅 第 11.3.2 节,“使用 x509 证书进行远程 TLS/SSL 连接(qemu+tlsxen+tls)”第 11.3.2.3 节,“配置客户端并测试设置”

Remmina VNC 查看器支持高级身份验证机制。在此示例中,我们假设服务器 x509 证书 ca-cert.pemserver-cert.pemserver-key.pem 位于主机上的 /etc/pki/qemu 目录中。客户端证书可以放置在任何自定义目录中,因为 Remmina 在连接启动时会请求其路径。

示例 34.5: 密码身份验证
qemu-system-x86_64 [...] -vnc :5,password -monitor stdio

在 VNC 显示号 5(对应端口 5905)上启动 VM Guest 图形输出。password 子选项初始化了一个简单的基于密码的身份验证方法。默认情况下没有设置密码,您需要使用 QEMU monitor 中的 change vnc password 命令设置一个。

QEMU 2.3.1 monitor - type 'help' for more information
(qemu) change vnc password
Password: ****

您需要在此处使用 -monitor stdio 选项,因为如果没有重定向其输入/输出,您将无法管理 QEMU monitor。

Authentication dialog in Remmina
图 34.3: Remmina 中的身份验证对话框
示例 34.6: x509 证书身份验证

QEMU VNC 服务器可以使用 TLS 加密进行会话,并使用 x509 证书进行身份验证。服务器请求客户端提供证书,并根据 CA 证书进行验证。如果您的公司提供内部证书颁发机构,请使用此身份验证类型。

qemu-system-x86_64 [...] -vnc :5,tls,x509verify=/etc/pki/qemu
示例 34.7: x509 证书和密码身份验证

您可以将密码身份验证与 TLS 加密和 x509 证书身份验证结合使用,以创建两层身份验证模型。运行以下命令后,请记住在 QEMU monitor 中设置密码。

qemu-system-x86_64 [...] -vnc :5,password,tls,x509verify=/etc/pki/qemu \
-monitor stdio
示例 34.8: SASL 身份验证

简单身份验证和安全层 (SASL) 是 Internet 协议中身份验证和数据安全的框架。它集成了多种身份验证机制,如 PAM、Kerberos、LDAP 等。SASL 保留自己的用户数据库,因此连接的用户帐户不需要存在于 VM Host Server 上。

出于安全原因,建议您将 SASL 身份验证与 TLS 加密和 x509 证书结合使用。

qemu-system-x86_64 [...] -vnc :5,tls,x509,sasl -monitor stdio

35 使用 QEMU monitor 进行虚拟机管理 Edit source

当虚拟机由 qemu-system-ARCH 命令调用时(例如 qemu-system-x86_64),会提供一个 monitor 控制台用于进行用户交互。使用 monitor 控制台中的命令,可以检查运行的操作系统、更改可移动介质、截屏或录音,并控制虚拟机的其他方面。

Note
注意

以下各节列出了选定的有用 QEMU monitor 命令及其用途。要获取完整列表,请在 QEMU monitor 命令行中输入 help

35.1 访问 monitor 控制台 Edit source

Tip
提示:libvirt 没有 monitor 控制台

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

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

# virsh qemu-monitor-command COMMAND

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

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

35.2 获取有关客户机系统的信息 Edit source

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

显示 balloon 设备信息。

info qtree

显示设备树。

info qdm

显示 qdev 设备模型列表。

info roms

显示 ROM。

info migrate_cache_size

显示当前的迁移 xbzrle(基于 Xor 的零长度编码)缓存大小。

info migrate_capabilities

显示多个迁移功能的状态,例如 xbzrle 压缩。

info mtree

显示 VM Guest 内存层次结构。

info trace-events

显示可用的 trace-events 及其状态。

35.3 更改 VNC 密码 Edit source

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

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

35.4 管理设备 Edit source

要在客户机运行时添加新磁盘(热插拔),请使用 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 monitor 命令行中输入 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 控制键盘和鼠标 Edit source

必要时可以使用 monitor 控制台模拟键盘和鼠标输入。例如,如果您的图形用户界面以低级别拦截某些组合键(例如 X Window System 中的 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 更改可用内存 Edit source

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

要获取 monitor 控制台中 balloon 设备的信息,并确定设备是否已启用,请使用 info balloon 命令。

(qemu) info balloon

如果 balloon 设备已启用,请使用 balloon MEMORY_IN_MB 命令设置请求的内存量。

(qemu) balloon 400

35.7 转储虚拟机内存 Edit source

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

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 上,hw 可以与 i 格式一起指定,以分别选择 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 上,hw 可以与 i 格式一起指定,以分别选择 16 位或 32 位代码指令大小。

35.8 管理虚拟机快照 Edit source

SUSE 尚未正式支持在 QEMU monitor 中管理快照。本节中的信息可能在特定情况下有所帮助。

虚拟机快照是对整个虚拟机的快照,包括 CPU、RAM 的状态以及所有可写磁盘的内容。要使用虚拟机快照,您必须至少有一个使用 qcow2 磁盘映像格式的不可移动且可写的块设备。

快照在您需要将虚拟机保存在特定状态时非常有用。例如,在配置了虚拟化服务器上的网络服务后,您可能希望快速启动虚拟机以恢复到上次保存的状态。您也可以在虚拟机关闭后创建快照,以便在尝试一些实验性操作并可能导致 VM Guest 不稳定之前创建备份状态。本节介绍前一种情况,后一种情况在 第 33.2.3 节,“使用 qemu-img 管理虚拟机快照” 中介绍。

以下命令可用于在 QEMU monitor 中管理快照:

savevmNAME

在标记 NAME 下创建一个新的虚拟机快照,或替换现有的快照。

loadvmNAME

加载标记为 NAME 的虚拟机快照。

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 暂停和恢复虚拟机执行 Edit source

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

stop

暂停虚拟机执行。

cont

恢复虚拟机执行。

system_reset

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

system_powerdown

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

qquit

立即终止 QEMU。

35.10 实时迁移 Edit source

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

实时迁移的要求

  • 来自 第 10.7.1 节,“迁移要求” 的所有要求都适用。

  • 实时迁移仅可能在具有相同 CPU 功能的 VM Host Server 之间进行。

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

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

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

Important
重要:支持状态

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

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

实时迁移过程包含以下步骤:

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

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

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

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

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

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

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

35.11 QMP - QEMU 机器协议 Edit source

QMP 是一个基于 JSON 的协议,它允许应用程序(如 libvirt)与运行的 QEMU 实例进行通信。您可以通过几种方式使用 QMP 命令访问 QEMU monitor。

35.11.1 通过标准输入/输出访问 QMP Edit source

使用 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 Edit source

您可以将 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": [
        ]
    }
}

您可以同时创建多个 monitor 接口。以下示例创建一个 HMP 实例(人类 monitor,理解“正常”QEMU monitor 命令)在标准输入/输出上,以及一个 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 Edit source

使用 -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 Edit source

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

> 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"

第 VI 部分 故障排除 Edit source

36 集成帮助和软件包文档

虚拟化包提供了管理虚拟化主机许多方面的命令。不可能或不期望记住这些命令支持的所有选项。Xen 或 KVM 主机的基本安装包括命令行选项的手册页和集成帮助。文档子包提供了基本安装之外的附加内容……

37 收集系统信息和日志

在某些情况下,可能需要从自定义日志记录或调试配置生成日志来确定问题的原因。

36 集成帮助和包文档 Edit source

虚拟化包提供了管理虚拟化主机许多方面的命令。不可能或不期望记住这些命令支持的所有选项。Xen 或 KVM 主机的基本安装包括命令行选项的手册页和集成帮助。文档子包提供了基本安装之外的附加内容。

命令行选项的手册页

大多数命令都包含手册页,它提供了有关命令的详细信息,描述了任何选项,并在某些情况下提供了命令用法示例。例如,要查看 virt-install 命令的手册,请键入:

> man virt-install
命令行选项的集成帮助

命令还包括集成帮助,提供更紧凑和面向主题的文档。例如,要查看 virt-install 命令的简要描述,请键入:

> virt-install --help

还可以使用集成帮助查看特定选项的详细信息。例如,要查看 disk 选项支持的子选项,请键入:

> virt-install --disk help
文档子包

许多虚拟化包在其文档子包中提供附加内容。例如,libvirt-doc 包包含 http://libvirt.org 上可用的所有文档,以及演示 libvirt C API 用法的示例代码。使用 rpm 命令查看文档子包的内容。例如,要查看 libvirt-doc 的内容:

rpm -ql libvirt-doc

37 收集系统信息和日志 Edit source

在某些情况下,可能需要从自定义日志记录或调试配置生成日志来确定问题的原因。

37.1 libvirt 日志控件 Edit source

libvirt 为库和守护进程提供日志记录功能。日志功能的行为由调整日志级别、过滤器和输出设置来控制。

日志级别

libvirt 日志消息分为四个优先级级别:DEBUG、INFO、WARNING 和 ERROR。DEBUG 级别非常详细,能够在短时间内生成大量信息。日志消息的量会随着 INFO、WARNING 和 ERROR 日志级别的升高而逐渐减少。ERROR 是默认的日志级别。

日志过滤器

日志过滤器提供了一种仅记录与特定组件和日志级别匹配的消息的方法。日志过滤器允许收集特定组件的详细 DEBUG 日志消息,但只收集系统中其余部分的 ERROR 级别日志消息。默认情况下,不定义任何日志过滤器。

日志输出

日志输出允许指定过滤后的日志消息发送到何处。消息可以发送到文件、进程的标准错误流或 journald。默认情况下,过滤后的日志消息会发送到 journald。

有关 libvirt 日志控件的更多详细信息,请参阅 https://libvirt.org/logging.html

默认的 libvirt 安装将日志级别设置为 ERROR,不定义日志过滤器,并将日志输出设置为 journald。可以使用 journalctl 命令查看来自 libvirt 守护进程的日志消息。

# journalctl --unit libvirtd

默认的日志功能设置对于正常操作来说已经足够,并且为 libvirt 的应用程序和用户提供了有用的消息,但内部问题通常需要 DEBUG 级别的消息。例如,考虑 libvirt 和 QEMU monitor 之间交互中可能存在的 bug。在这种情况下,我们只需要查看 libvirt 和 QEMU 之间通信的调试消息。以下示例创建一个日志过滤器,用于选择来自 QEMU 驱动程序的调试消息,并将它们发送到名为 /tmp/libvirtd.log 的文件。

   log_filters="1:qemu.qemu_monitor_json"
   log_outputs="1:file:/tmp/libvirtd.log"

libvirt 守护进程的日志控件可以在 /etc/libvirt/libvirtd.conf 中找到。在对配置文件进行任何更改后,必须重新启动守护进程。

# systemctl restart libvirtd.service

词汇表 Edit source

通用

创建虚拟机向导

YaST 和虚拟机管理器中可用的一个软件程序,它提供了一个图形界面,引导您完成创建虚拟机的步骤。它也可以通过在主机环境的命令提示符下键入 virt-install 来以文本模式运行。

Dom0

此术语用于 Xen 环境,指的是虚拟机。主机操作系统是在特权域中运行的虚拟机,可以称为 Dom0。主机上的所有其他虚拟机都在非特权域中运行,并可称为 domain U。

硬件辅助

Intel* 和 AMD* 提供硬件辅助虚拟化技术。这减少了 VM IN/OUT(更少的 VM 陷阱)的频率,因为软件是开销的主要来源,并提高了效率(由硬件执行)。此外,这还减少了内存占用,提供了更好的资源控制,并允许安全地分配特定的 I/O 设备。

主机环境

允许与主机计算机环境交互的桌面或命令行环境。它提供命令行环境,还可以包括图形桌面,如 GNOME 或 IceWM。主机环境作为一种特殊类型的虚拟机运行,它拥有控制和管理其他虚拟机的特权。其他常用术语包括 Dom0、特权域和主机操作系统。

Hypervisor

协调虚拟机与底层物理计算机硬件之间低级别交互的软件。

KVM

请参阅 第 4 章,“KVM 虚拟化简介”

半虚拟化帧缓冲

驱动视频显示的视频输出设备,其内存缓冲区包含半虚拟化模式下运行的虚拟机显示的完整帧数据。

VHS

虚拟化主机服务器

运行 SUSE 虚拟化平台软件的物理计算机。虚拟化环境包括 hypervisor、主机环境、虚拟机以及相关的工具、命令和配置文件。其他常用术语包括 host、Host Computer、Host Machine (HM)、Virtual Server (VS)、Virtual Machine Host (VMH) 和 VM Host Server (VHS)。

VirtFS

VirtFS 是一种新的半虚拟化文件系统接口,旨在改进 KVM 环境中的直通技术。它基于 VirtIO 框架。

虚拟化

在虚拟机上运行的客户机操作系统或应用程序。

虚拟机

能够托管客户机操作系统及相关应用程序的虚拟化 PC 环境 (VM)。也可以称为 VM Guest。

虚拟机管理器

提供用于创建和管理虚拟机的图形用户界面的软件程序。

Xen

请参阅 第 3 章,“Xen 虚拟化简介”

xl

一组用于 Xen 的命令,允许管理员从主机计算机的命令行管理虚拟机。它取代了已弃用的 xm 工具集。

CPU

CPU 限制

虚拟 CPU 限制允许您将 vCPU 容量设置为物理 CPU 容量的 1–100%。

CPU 热插拔

CPU 热插拔用于描述在不关闭系统的情况下更换/添加/移除 CPU 的功能。

CPU 超额分配

虚拟 CPU 超额分配是能够为虚拟机分配比实际物理 CPU 数量更多的虚拟 CPU。此过程不会提高系统的整体性能,但可能对测试目的有用。

CPU 绑定

处理器亲和性或 CPU 绑定允许将进程或线程绑定和解除绑定到中央处理单元 (CPU) 或一组 CPU。

网络

桥接网络

一种网络连接类型,允许虚拟机在外围网络上被识别为一个独立于其主机计算机且与之无关的唯一标识。

空桥

一种没有物理网络设备或由主机提供的虚拟网络设备类型的网络桥。这允许虚拟机与同一主机上的其他虚拟机通信,但不能与主机或外围网络通信。

外部网络

主机内部网络环境之外的网络。

内部网络

一种网络配置,将虚拟机限制在它们的主机环境中。

本地桥

一种网络桥,具有虚拟网络设备但没有由主机提供的物理网络设备。这允许虚拟机与主机上的主机和其他虚拟机通信。虚拟机可以通过主机在外围网络上通信。

网络地址转换 (NAT)

一种网络连接类型,允许虚拟机使用主机的 IP 地址和 MAC 地址。

无主机桥

一种网络桥,具有物理网络设备但没有由主机提供的虚拟网络设备。这允许虚拟机在外围网络上通信,但不能与主机通信。这允许您将虚拟机网络通信与主机环境分离。

传统桥

一种网络桥,同时具有物理网络设备和由主机提供的虚拟网络设备。

存储

AHCI

高级主机控制器接口 (AHCI) 是 Intel* 定义的一项技术标准,它以非实现特定的方式指定串行 ATA (SATA) 主机总线适配器的操作。

块设备

数据存储设备,如 CD-ROM 驱动器或磁盘驱动器,它们以块的形式移动数据。分区和卷也被视为块设备。

基于文件的虚拟磁盘

基于文件的虚拟磁盘,也称为磁盘映像文件。

原始磁盘

一种在单个字节级别访问磁盘上的数据的方法,而不是通过其文件系统。

稀疏映像文件

一种磁盘映像文件,它不保留其全部磁盘空间,而是在写入数据时扩展。

xvda

赋予半虚拟化机器上第一个虚拟磁盘的驱动器名称。

缩略语

ACPI

高级配置和电源接口 (ACPI) 规范提供了一个开放标准,用于操作系统进行设备配置和电源管理。

AER

高级错误报告

AER 是 PCI Express 规范提供的一种功能,它允许报告 PCI 错误并从某些错误中恢复。

APIC

高级可编程中断控制器 (APIC) 是一系列中断控制器。

BDF

总线:设备:功能

用于简洁描述 PCI 和 PCIe 设备的符号。

CG

控制组

限制、计费和隔离资源使用(CPU、内存、磁盘 I/O 等)的功能。

EDF

最早截止日期优先

此调度程序以直观的方式提供加权 CPU 共享,并使用实时算法来确保时间保证。

EPT

扩展页表

虚拟化环境中的性能接近原生环境。然而,虚拟化确实会产生一些开销。这些开销来自 CPU、MMU 和 I/O 设备的虚拟化。在一些较新的 x86 处理器中,AMD 和 Intel 已开始提供硬件扩展来帮助弥合这一性能差距。2006 年,两家供应商都推出了第一代 x86 虚拟化硬件支持,名为 AMD-Virtualization (AMD-V) 和 Intel® VT-x 技术。最近,Intel 推出了其第二代硬件支持,该支持集成了 MMU 虚拟化,称为扩展页表 (EPT)。与使用影子分页进行 MMU 虚拟化相比,EPT 启用的系统可以提高性能。EPT 会增加某些工作负载的内存访问延迟。通过有效使用客户机和 hypervisor 中的大页面可以降低此成本。

FLASK

Flux 高级安全内核

Xen 通过一个名为 FLASK 的模块实现了一种强制访问控制,该模块使用同名安全架构。

HAP

高保证平台

HAP 结合硬件和软件技术来提高工作站和网络安全性。

HVM

硬件虚拟机(Xen 通常如此称呼)。

IOMMU

输入/输出内存管理单元

IOMMU(AMD* 技术)是一个内存管理单元(MMU),它将支持直接内存访问 (DMA) 的 I/O 总线连接到主内存。

KSM

内核相同页面合并

KSM 允许在客户机之间自动共享相同的内存页面以节省主机内存。如果 VM Host Server 上启用了 KSM,KVM 将进行优化以使用 KSM。

MMU

内存管理单元

是计算机操作系统中负责处理 CPU 请求的内存访问的硬件组件。其功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、缓存控制、总线仲裁以及在更简单的计算机体系结构(特别是 8 位系统)中进行内存切换。

PAE

物理地址扩展

32 位 x86 操作系统使用物理地址扩展 (PAE) 模式来寻址超过 4 GB 的物理内存。在 PAE 模式下,页表项 (PTE) 为 64 位。

PCID

进程上下文标识符

这是逻辑处理器缓存多个线性地址空间信息的机制,因此处理器在软件切换到不同的线性地址空间时可以保留缓存信息。INVPCID 指令用于细粒度的 TLB 刷新,这对内核有益。

PCIe

外围组件互连 Express

PCIe 的设计是为了取代旧的 PCI、PCI-X 和 AGP 总线标准。PCIe 具有许多改进,包括更高的最大系统总线吞吐量、更低的 I/O 引脚数和更小的物理占地面积。此外,它还具有更详细的错误检测和报告机制(AER)以及原生的热插拔功能。它还向后兼容 PCI。

PSE 和 PSE36

页面大小扩展

PSE 指的是 x86 处理器的一项功能,它允许页面大小大于传统的 4 KiB。PSE-36 功能提供了除正常的 10 位之外的另外 4 位,这些位用于指向大页面的页目录条目中。这允许大页面位于 36 位地址空间中。

PT

页表

页表是计算机操作系统中虚拟内存系统用来存储虚拟地址和物理地址之间映射的数据结构。虚拟地址是访问进程独有的。物理地址是硬件(RAM)独有的。

QXL

QXL 是用于虚拟化环境的 cirrus VGA 帧缓冲 (8M) 驱动程序。

RVI 或 NPT

快速虚拟化索引、嵌套页表

AMD 第二代硬件辅助虚拟化技术,用于处理器内存管理单元(MMU)。

SATA

串行 ATA

SATA 是一种计算机总线接口,它将主机总线适配器连接到大容量存储设备,如硬盘和光驱。

基于 Seccomp2 的沙箱

沙箱环境,只允许预先确定的系统调用,以增加对恶意行为的保护。

SMEP

监督模式执行保护

这可以防止 Xen hypervisor 执行用户模式页面,从而大大增加了许多应用程序到 hypervisor 的漏洞的难度。

SPICE

独立计算环境的简单协议

SXP

SXP 文件是 Xen 配置文件。

TCG

Tiny 代码生成器

指令被模拟而不是由 CPU 执行。

THP

透明大页面

这允许 CPU 使用大于默认 4 KB 的页面来寻址内存。这有助于减少内存消耗和 CPU 缓存使用。如果 VM Host Server 上启用了 THP(通过 madvise 和机会性方法),KVM 会进行优化以使用 THP。

TLB

翻译后备缓冲器

TLB 是内存管理硬件用于提高虚拟地址转换速度的缓存。所有当前的桌面、笔记本和服务器处理器都使用 TLB 来映射虚拟和物理地址空间,并且几乎所有使用虚拟内存的硬件都包含 TLB。

VCPU

调度实体,包含虚拟化 CPU 的每个状态。

VDI

虚拟桌面基础设施

VFIO

自内核 v3.6 起;一种从用户空间访问 PCI 设备的新方法,称为 VFIO。

VHS

虚拟化主机服务器

VMCS

虚拟机控制结构

VMX 非根操作和 VMX 转换由称为虚拟机控制结构 (VMCS) 的数据结构控制。对 VMCS 的访问是通过处理器状态的组件(称为 VMCS 指针,每个逻辑处理器一个)管理的。VMCS 指针的值是 VMCS 的 64 位地址。VMCS 指针使用 VMPTRST 和 VMPTRLD 指令进行读写。 VMM 使用 VMREAD、VMWRITE 和 VMCLEAR 指令配置 VMCS。 VMM 可以为它支持的每个虚拟机使用不同的 VMCS。对于具有多个逻辑处理器(虚拟处理器)的虚拟机,VMM 可以为每个虚拟处理器使用不同的 VMCS。

VMDq

虚拟机设备队列

存在多队列网络适配器,它们在硬件级别支持多个 VM,通过 VM 的 IP 地址将单独的数据包队列与不同的托管 VM 相关联。

VMM

虚拟机监视器 (Hypervisor)

当处理器遇到 Hypervisor(VMM)感兴趣的指令或事件时,它会从客户机模式退出到 VMM。VMM 以原生速度的一小部分模拟指令或其他事件,然后返回到客户机模式。从客户机模式到 VMM 以及返回的转换是高延迟操作,在此期间客户机执行完全停止。

VM root

VMM 将在 VMX root 操作中运行,而客户机软件将在 VMX 非根操作中运行。 VMX root 操作和 VMX 非根操作之间的转换称为 VMX 转换。

VMX

虚拟机扩展

VPID

对软件控制 TLB 的新支持(VPID 通过少量 VMM 开发工作改进了 TLB 性能)。

VT-d

定向 I/O 虚拟化技术

类似于 IOMMUIntel*

vTPM

通过可信计算为客户机建立端到端完整性的组件。

配置 NVIDIA 卡的 GPU 直通

A.1 简介 Edit source

本文档描述了如何将主机上的 NVIDIA GPU 图形卡分配给虚拟化客户机。

A.2 先决条件 Edit source

  • GPU 直通仅在 AMD64/Intel 64 架构上支持。

  • 本文档基于 V100/T1000 NVIDIA 卡,仅用于 GPU 计算目的。

  • 验证您使用的是 NVIDIA Tesla 产品——Maxwell、Pascal 或 Volta。

  • 要管理主机系统,您需要在主机上有一个额外的显示卡,可以在配置 GPU 直通时使用,或者需要一个可用的 SSH 环境。

A.3 配置主机 Edit source

A.3.1 验证主机环境 Edit source

  1. 验证主机是否支持 VT-d 技术,并且该技术已在固件设置中启用。

    > dmesg | grep -e "Directed I/O"
    [   12.819760] DMAR: Intel(R) Virtualization Technology for Directed I/O

    如果 VT-d 未在固件中启用,请启用它并重启主机。

  2. 验证主机是否有一个额外的 GPU 或 VGA 卡。

    > lspci | grep -i "vga"
    07:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. \
      MGA G200e [Pilot] ServerEngines (SEP1) (rev 05)

    对于 Tesla V100 卡

    > lspci | grep -i nvidia
    03:00.0 3D controller: NVIDIA Corporation GV100 [Tesla V100 PCIe] (rev a1)

    对于 T1000 Mobile(可在 Dell 5540 上找到)

    > lspci | grep -i nvidia
    01:00.0 3D controller: NVIDIA Corporation TU117GLM [Quadro T1000 Mobile] (rev a1)

A.3.2 启用 IOMMU Edit source

IOMMU 默认禁用。您需要在启动时在 /etc/default/grub 配置文件中启用它。

  1. 对于基于 Intel 的主机

    GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt rd.driver.pre=vfio-pci"

    对于基于 AMD 的主机

    GRUB_CMDLINE_LINUX="iommu=pt amd_iommu=on rd.driver.pre=vfio-pci"
  2. 保存修改后的 /etc/default/grub 文件后,重新生成主 GRUB 2 配置文件 /boot/grub2/grub.cfg

    > sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 重启主机并验证 IOMMU 是否已启用。

    > dmesg |  grep -e DMAR -e IOMMU

A.3.3 黑名单 Nouveau 驱动程序 Edit source

要将 NVIDIA 卡分配给 VM Guest,我们需要阻止主机操作系统加载 NVIDIA GPU 的内置 nouveau 驱动程序。创建文件 /etc/modprobe.d/60-blacklist-nouveau.conf 并包含以下内容:

blacklist nouveau

A.3.4 配置 VFIO 并隔离用于直通的 GPU Edit source

  1. 查找卡的供应商和型号 ID。使用 A.3.1 节,“验证主机环境” 中确定的总线号,例如 03:00.0

    > lspci -nn | grep 03:00.0
    03:00.0 3D controller [0302]: NVIDIA Corporation GV100 [Tesla V100 PCIe] [10de:1db4] (rev a1)
  2. 创建文件 /etc/modprobe.d/vfio.conf 并包含以下内容:

    options vfio-pci ids=10de:1db4
    Note
    注意

    验证您的卡是否需要额外的 ids= 参数。对于某些卡,您还必须指定音频设备,因此设备 ID 也必须添加到列表中,否则您将无法使用该卡。

A.3.5 加载 VFIO 驱动程序 Edit source

您可以通过三种方式加载 VFIO 驱动程序。

A.3.5.1 将驱动程序包含在 initrd 文件中 Edit source

  1. 创建文件 /etc/dracut.conf.d/gpu-passthrough.conf 并添加以下内容(注意前导空格):

    add_drivers+=" vfio vfio_iommu_type1 vfio_pci vfio_virqfd"
  2. 重新生成 initrd 文件。

    > sudo dracut --force /boot/initrd $(uname -r)

A.3.5.2 将驱动程序添加到自动加载模块列表 Edit source

创建文件 /etc/modules-load.d/vfio-pci.conf 并添加以下内容:

vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel

A.3.5.3 手动加载驱动程序 Edit source

要在运行时手动加载驱动程序,请执行以下命令:

> sudo modprobe vfio-pci

A.3.6 禁用 Microsoft Windows 客户机的 MSR Edit source

对于 Microsoft Windows 客户机,我们建议禁用 MSR(模型特定寄存器)以避免客户机崩溃。创建文件 /etc/modprobe.d/kvm.conf 并添加以下内容:

options kvm ignore_msrs=1

A.3.7 安装UEFI固件 Edit source

为了实现正确的GPU直通功能,主机需要使用UEFI固件启动(即,不使用传统BIOS启动序列)。如果尚未安装,请安装qemu-ovmf软件包。

> sudo zypper install qemu-ovmf

A.3.8 重新启动主机 Edit source

为了使上述步骤中的大部分更改生效,您需要重新启动主机。

> sudo shutdown -r now

A.4 配置客户机 Edit source

本节介绍如何配置客户机虚拟机,使其能够使用主机的NVIDIA GPU。使用Virtual Machine Manager或virt-install安装客户机VM。更多详细信息请参见第9章“客户机安装”

A.4.1 客户机配置要求 Edit source

在客户机VM安装期间,选择在安装前自定义配置并配置以下设备:

  • 如果可能,请使用Q35芯片组。

  • 使用UEFI固件安装客户机VM。

  • 添加以下模拟设备:

    图形:Spice或VNC

    设备:qxl、VGA或Virtio

    更多信息请参见第13.6节“视频”

  • 将主机PCI设备(本例中为03:00.0)添加到客户机。更多信息请参见第13.12节“将主机PCI设备分配给VM客户机”

  • 为了获得最佳性能,我们建议为网卡和存储使用virtio驱动程序。

A.4.2 安装显卡驱动 Edit source

A.4.2.1 Linux客户机 Edit source

Procedure A.1: 基于RPM的发行版
  1. http://www.nvidia.com/download/driverResults.aspx/131159/en-us下载驱动程序RPM软件包。

  2. 安装下载的RPM软件包。

    > sudo rpm -i nvidia-diag-driver-local-repo-sles123-390.30-1.0-1.x86_64.rpm
  3. 刷新存储库并安装cuda-drivers。此步骤对于非SUSE发行版有所不同。

    > sudo zypper refresh && zypper install cuda-drivers
  4. 重新启动客户机VM。

    > sudo shutdown -r now
Procedure A.2: 通用安装程序
  1. 由于安装程序需要编译NVIDIA驱动模块,请安装gcc-c++kernel-devel软件包。

  2. 在客户机上禁用安全启动,因为NVIDIA的驱动模块未签名。在SUSE发行版上,您可以使用YaST GRUB 2模块禁用安全启动。更多信息请参见参考》一书,第14章“UEFI(统一可扩展固件接口)”,第14.1.1节“在openSUSE Leap上的实现”

  3. https://www.nvidia.com/Download/index.aspx?lang=en-us下载驱动程序安装脚本,使其可执行并运行它以完成驱动程序安装。

    > chmod +x NVIDIA-Linux-x86_64-460.73.01.run
    > sudo ./NVIDIA-Linux-x86_64-460.73.01.run
  4. https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=SLES&target_version=15&target_type=rpmlocal下载CUDA驱动程序,并按照屏幕上的说明进行安装。

Note
注意:显示问题

安装NVIDIA驱动程序后,Virtual Machine Manager显示将丢失与客户机操作系统的连接。要访问客户机VM,您必须通过ssh登录,切换到控制台界面,或在客户机中安装专用VNC服务器。为避免屏幕闪烁,请停止并禁用显示管理器。

> sudo systemctl stop display-manager && systemctl disable display-manager
Procedure A.3: 测试Linux驱动程序安装
  1. 将目录更改为CUDA示例模板。

    > cd /usr/local/cuda-9.1/samples/0_Simple/simpleTemplates
  2. 编译并运行simpleTemplates文件。

    > make && ./simpleTemplates
    runTest<float,32>
    GPU Device 0: "Tesla V100-PCIE-16GB" with compute capability 7.0
    CUDA device [Tesla V100-PCIE-16GB] has 80 Multi-Processors
    Processing time: 495.006000 (ms)
    Compare OK
    runTest<int,64>
    GPU Device 0: "Tesla V100-PCIE-16GB" with compute capability 7.0
    CUDA device [Tesla V100-PCIE-16GB] has 80 Multi-Processors
    Processing time: 0.203000 (ms)
    Compare OK
    [simpleTemplates] -> Test Results: 0 Failures

A.4.2.2 Microsoft Windows客户机 Edit source

Important
重要提示

在安装NVIDIA驱动程序之前,您需要通过在客户机的libvirt定义中使用<hidden state='on'/>指令来隐藏Hypervisor,例如:

<features>
 <acpi/>
 <apic/>
 <kvm>
  <hidden state='on'/>
 </kvm>
</features>
  1. https://www.nvidia.com/Download/index.aspx下载并安装NVIDIA驱动程序。

  2. https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64下载并安装CUDA工具包。

  3. 在客户机上,可以在Program Files\Nvidia GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite目录中找到几个NVIDIA演示示例。

打印此页面