---
url: /courses/virtualization-tech/05-windows-kvm-virtio/index.md
---
# 第 5 课 Windows 来做客

> 里程碑 `V4`｜Windows 11、UEFI/OVMF 固件、vTPM 2.0 与 VirtIO 驱动｜理论 2 学时 + 实训 2 学时（180 分钟）

![学生为星舟实训云的 Windows 来宾核对启动固件、虚拟安全芯片与驱动介质](./assets/04/windows-guest-illustration.png)

::: tip 项目目标
在前两课中，你已经能够熟练使用 virt-manager 创建命令行模式的 Ubuntu Server 虚拟机。本课你将为“星舟实训云”交付一台带 GUI 图形桌面的 Windows 11 虚拟机 `win01`。
通过本课的学习与实训，你将掌握：

1. **启动固件与安全芯片原理**：理解 Legacy BIOS 与 UEFI/OVMF 固件的区别，掌握虚拟 TPM 2.0（vTPM）与宿主 `swtpm` 进程的作用；
2. **VirtIO 驱动体系**：理解为什么 Windows 安装器默认看不到 KVM 虚拟磁盘，掌握 `viostor` 存储驱动与 `NetKVM` 网卡驱动的加载机制；
3. **双 ISO 安装实操**：学会使用 virt-manager 配置 Q35 芯片组、UEFI 固件、vTPM 2.0 与双 ISO 光驱，在安装阶段成功加载驱动并完成 Windows 交付。
   :::

## 5.1 启动固件与安全芯片：UEFI 与 vTPM 2.0 原理

在给虚拟机安装 Windows 11 时，系统对虚拟硬件提出了比 Linux 更高的安全要求，其中最关键的就是 **UEFI 启动固件** 与 **TPM 2.0 安全芯片**。

### 1. Legacy BIOS vs UEFI 固件

硬件启动固件是计算机开机后运行的第一段程序，负责初始化硬件并引导操作系统。

| 特性维度 | Legacy BIOS（传统固件） | UEFI 固件（本课选择 OVMF） |
| --- | --- | --- |
| **磁盘分区支持** | 仅支持 MBR 分区（最大支持 2TB 磁盘） | **支持 GPT 分区**（支持 >2TB 磁盘与无限主分区） |
| **运行模式** | 16 位实模式（寻址空间极小，启动慢） | **32/64 位保护模式**（启动快、支持图形化） |
| **配置存储** | 存储在主板 CMOS 中 | **存储在 NVRAM 变量（.fd 文件）中** |
| **安全机制** | 无防篡改校验 | **支持 Secure Boot（安全启动）** |
| **Windows 11 兼容** | ✖ 不支持 | **✔ 官方强制要求** |

在 KVM/QEMU 虚拟化环境中，用来为虚拟机提供 UEFI 固件的开源实现叫做 **OVMF**（Open Virtual Machine Firmware）。OVMF 会在宿主机上生成一个 `.fd` 存储文件，专门保存该虚拟机的 UEFI 配置与安全启动密钥。

### 2. vTPM 2.0 与 swtpm 机制

**TPM**（Trusted Platform Module，受信任平台模块）是一颗专用的硬件安全芯片，用于保管加密密钥、防篡改哈希以及支持 BitLocker 磁盘加密。微软将 TPM 2.0 作为 Windows 11 的强制硬件门槛。

在 KVM 中，虚拟机并没有物理 TPM 芯片，它是如何满足这个要求的？

* **`swtpm`（软件 TPM 模拟器）**：当你在宿主机安装了 `swtpm` 包后，libvirt 会在宿主机后台为 `win01` 拉起一个独立的 `swtpm` 守护进程；
* **CRB 模型**：QEMU 模拟 Q35 主板上的 Command Response Buffer（CRB）硬件接口，将 `swtpm` 提供的 TPM 2.0 能力透传给 `win01`；
* **独立安全性**：每个虚拟机都有自己专属的模拟 TPM 状态文件，互不干扰，也不会直接读取宿主机的真实硬件密钥。

::: tip 直观理解这三个核心概念
结合生活常识，我们可以直观理解这三者的对应关系：

* **`swtpm` 守护进程**：相当于在宿主机后台默默运行的一个“小助手程序”，专门替 `win01` 假装在主板上焊接了一颗真实的物理加密芯片；
* **CRB 模型 (Command Response Buffer)**：相当于宿主机与虚拟机之间建立的一条专用的“安全加密命令传真管道”，用来传送密码校验请求；
* **.fd NVRAM 变量文件**：相当于虚拟机的“固件档案卡”，里面记录着虚拟主板的 UEFI 启动选项和安全启动密钥。
  :::

下面的架构动画展示了从宿主 `swtpm` 进程到 Windows 11 安全引导的初始化链路：

## 5.2 为什么 Windows 需要 VirtIO 驱动 ISO

如果在 virt-manager 中为 Windows 虚拟机分配了 VirtIO 磁盘，在安装时常常会遇到“看不到任何可安装磁盘”的情况。这是为什么？

### 1. 全虚拟化模拟 vs VirtIO 半虚拟化

* **全虚拟化模拟（如 IDE / SATA 硬盘、e1000 网卡）**：QEMU 完全用软件去模仿老旧物理硬件的行为。优点是 Windows 安装包内置了这些老旧设备的通用驱动，能直接识别；缺点是每次磁盘读写都会产生大量 CPU 损耗，性能很低。
* **Virtio 半虚拟化（`viostor` 存储、`NetKVM` 网卡）**：专门为虚拟化优化的高效驱动。Windows 安装包默认**并没有内置** KVM 团队开发的 VirtIO 驱动程序。

```text
+-----------------------------------------------------------------------------------+
| Windows 安装器 (Setup)                                                             |
|                                                                                   |
|  [内置驱动库] ---> 包含 IDE / SATA 驱动  ==================> 识别传统模拟硬盘      |
|  [未内置驱动] ---> 缺少 VirtIO Block 驱动 ================> 无法识别 VirtIO 64GB 磁盘 |
|                                                                                   |
|  [解决方法]   ---> 挂载 virtio-win.iso ➔ 手动加载 viostor ➔ 64GB 磁盘成功出现!       |
+-----------------------------------------------------------------------------------+
```

### 2. VirtIO-Win 驱动包拆解

为了让 Windows 能使用 VirtIO 设备，红帽与 KVM 开源社区提供了官方的 **VirtIO-Win 驱动 ISO 镜像**（`virtio-win.iso`）。这个 ISO 中包含了以下核心驱动：

| 驱动目录名 | 驱动名称 | 对应虚拟硬件 | 作用阶段 |
| --- | --- | --- | --- |
| **`viostor`** | VirtIO Block Driver | VirtIO 块存储磁盘 | **系统安装阶段（必须加载）** |
| **`vioscsi`** | VirtIO SCSI Driver | VirtIO SCSI 控制器磁盘 | 系统安装阶段（若磁盘选了 SCSI） |
| **`NetKVM`** | VirtIO Network Driver | VirtIO 虚拟网卡 | 系统安装完成后（开启网络） |
| **`qxldod`** | QXL/Virtio Display | Virtio 虚拟显卡 | 系统安装完成后（提升图形性能） |
| **`guest-agent`**| QEMU Guest Agent | 串口管理代理 | 系统安装完成后（支持 guest-ping） |

### 3. 双 ISO 挂载原理

在安装 `win01` 时，我们需要在 `virt-manager` 中同时挂载两个虚拟光驱（CD-ROM）：

1. **第一光驱**：挂载 `Windows 11 安装 ISO`（用于引导安装程序）；
2. **第二光驱**：挂载 `virtio-win.iso`（用于在安装过程中读取 `viostor` 存储驱动）。

下面的动态演示展示了加载 `viostor` 驱动使磁盘出现的完整过程：

## 5.3 创建 win01 虚拟机

### 1. 虚拟机配置参数表

在打开 `virt-manager` 之前，先明确本次创建的虚拟机参数：

| 参数名称 | 配置值 | 配置说明与选择理由 |
| --- | --- | --- |
| **虚拟机名称** | `win01` | 保持课程统一命名规范 |
| **vCPU 核心数** | `2` vCPU | 满足 Windows 11 最低双核要求 |
| **内存容量** | `4096` MiB (4GB) | 满足 Windows 11 最低 4GB 内存要求 |
| **虚拟磁盘** | **QCOW2**，容量 `64` GB，总线 **VirtIO** | 满足 Windows 11 最低 64GB 存储要求，QCOW2 按需增长 |
| **芯片组 (Chipset)**| **Q35** | 现代 PCIe 主板架构，支持 UEFI 与 TPM 2.0 |
| **启动固件** | **UEFI / OVMF** | 必须选择 UEFI 固件（支持 Secure Boot） |
| **安全芯片** | **TPM 2.0**（Model: **CRB**，Backend: **Emulated**） | 开启模拟 TPM 2.0 安全芯片 |
| **虚拟网卡** | `default` NAT 网络（设备模型 **Virtio**） | 共享宿主网络连接外网 |
| **存储驱动介质** | 挂载第二个 CD-ROM（文件为 `virtio-win.iso`） | 用于提供 `viostor` 与 `NetKVM` 驱动 |

### 2. 准备工作：安装软件包与获取 VirtIO ISO

在宿主机终端中执行以下命令，确保宿主系统已安装 UEFI 固件、TPM 模拟器及 VirtIO 驱动镜像：

```bash
# 1. 安装 OVMF 固件、swtpm 模拟器与 virtio-win 驱动包
sudo apt update
sudo apt install -y ovmf swtpm swtpm-tools virtio-win
```

::: tip 镜像文件安装路径与备用下载

* **默认安装路径**：安装 `virtio-win` 软件包后，驱动 ISO 会保存在宿主机的 `/usr/share/virtio-win/virtio-win.iso`。
* **备用下载方式**：如果你的 Linux 发行版仓库中没有 `virtio-win` 软件包，可在终端直接使用 `wget` 下载官方最新构建镜像到本地：
  ```bash
  # 备用命令：直接下载官方 VirtIO ISO 镜像到当前目录
  wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso
  ```

:::

### 3. 获取 Windows 11 安装 ISO

请确认宿主机上已准备好 Windows 11 的官方 ISO 镜像文件（如从 [微软官网 Windows 11 下载页](https://www.microsoft.com/zh-cn/software-download/windows11) 获取）。

### 4. 在 virt-manager 中创建 win01

按照以下步骤完成创建：

::: steps

1. **新建虚拟机**：打开 `virt-manager`，点击“新建虚拟机”，选择“本地安装介质 (ISO)”。
2. **选择 Windows ISO**：浏览选择准备好的 Windows 11 安装 ISO 镜像。
3. **配置 CPU 与内存**：内存填 `4096` MiB，CPU 填 `2`。
4. **创建虚拟磁盘**：选择自定义存储，容量填 `64` GB。
5. **自定义配置**：名称填 `win01`，勾选 **“安装前自定义配置”**。
6. **配置芯片组与固件**：
   * 在 **Overview** 中，将 Machine 选为 `Q35`；
   * 将 Firmware 选为 `UEFI x86_64` (如 `OVMF_CODE.fd`)。
7. **配置磁盘总线**：点击“Disk 1”，将 Disk bus 改为 **VirtIO**。
8. **添加 TPM 安全芯片**：点击左下角“添加硬件” ➔ 选择 `TPM` ➔ Model 选 `CRB`，Version 选 `2.0` ➔ 点击完成。
9. **挂载 VirtIO 驱动 ISO**：
   * 点击“添加硬件” ➔ 选择 `Storage` ➔ Device 选 `CDROM bus`；
   * 浏览选择宿主机上的 `virtio-win.iso` 文件（选择 `/usr/share/virtio-win/virtio-win.iso` 或刚才下载的绝对路径）；
   * 点击完成。
10. **开始安装**：点击左上方“开始安装”。

:::

## 5.4 安装 Windows 并加载 VirtIO 存储驱动

启动虚拟机后，按以下步骤完成 Windows 安装：

::: steps

1. **从光盘引导**：看到 `Press any key to boot from CD or DVD...` 时，迅速在窗口内按任意键进入安装程序。
2. **进入安装向导**：选择语言与输入法，点击“现在安装”。在密钥输入界面选择“我没有产品密钥”，选择对应的系统版本。
3. **加载 VirtIO 存储驱动**：
   * 进入“你想将 Windows 安装在哪里？”页面，此时界面提示 **“未找到任何驱动程序”**（磁盘列表为空）；
   * 点击左下角 **“加载驱动程序 (Load Driver)”** ➔ 点击 **“浏览”**；
   * 在弹出的树状目录中找到挂载的 VirtIO 驱动光盘（通常为 `D:` 或 `E:` 盘）；
   * 展开目录路径：`viostor` ➔ `w11` ➔ `amd64`，点击确定；
   * 列表中出现 `Red Hat VirtIO SCSI controller` 驱动，点击“下一步”。
4. **确认 64GB 磁盘出现**：驱动加载完成后，界面成功刷出 **“驱动器 0 未分配的空间 (64.0 GB)”**。点击“下一步”开始安装。
5. **完成首次设置**：等待文件解压并自动重启，按向导提示完成区域与本地账号配置，进入 Windows 11 桌面。

:::

::: tip 驱动名称注意事项：为什么选择 viostor 目录后刷出的名称叫 SCSI controller？
很多同学在选中 `viostor\w11\amd64` 确定后，看到列表中刷出的驱动名字叫 **“Red Hat VirtIO SCSI controller”**，会怀疑自己是不是选错成了 SCSI 驱动目录。

**请放心，这是完全正常的！** 这是红帽官方为 VirtIO Block 块存储驱动在 Windows 安装包里注册的标准显示名称。看到它出现说明你选择的目录 **100% 正确**，直接点击“下一步”即可，千万不要误以为选错而退回重选！
:::

## 5.5 安装来宾增强驱动与网卡配置

进入 Windows 11 桌面后，你会发现此时网卡驱动尚未安装（无网络连接）。我们需要运行 VirtIO 光盘中的整合安装包。

::: steps

1. **打开 VirtIO 光盘**：在 Windows 中打开“此电脑”，找到挂载的 `virtio-win` 光盘驱动器。
2. **运行整合安装程序**：双击运行光盘根目录下的 `virtio-win-guest-tools.exe`。
3. **完成一键安装**：按向导提示勾选所有驱动（包含 NetKVM 网卡驱动、QXL 显卡驱动与 QEMU Guest Agent），点击 Install 完成安装。
4. **验证设备与网络**：
   * 右键“此电脑” ➔ 选择“管理” ➔ 打开“设备管理器”；
   * 确认“网络适配器”下显示为 `Red Hat VirtIO Ethernet Adapter` 且无黄感叹号；
   * 确认系统已成功获取 `default` NAT 网络 IP 并可以正常上网。

:::

## 5.6 常见问题排错矩阵

在创建和安装 `win01` 时，若遇到问题请对照下表排查：

| 故障现象 | 可能的原因分析 | 最小排查命令 / 检查方法 | 解决办法 |
| --- | --- | --- | --- |
| **提示“这台电脑无法运行 Windows 11”** | 未配置 UEFI 固件或未开启 TPM 2.0 | 打开虚拟机硬件详情，检查 Display、Firmware 与 TPM 节点 | 确认 Firmware 选了 UEFI，且添加了 TPM 2.0 (CRB) |
| **安装界面磁盘列表为空** | 磁盘总线设为 VirtIO 但未加载 `viostor` 驱动 | 检查是否挂载了 `virtio-win.iso` 并点击“加载驱动程序” | 浏览 VirtIO ISO 的 `viostor\w11\amd64` 目录加载驱动 |
| **加载驱动时提示找不到兼容驱动** | 选错了驱动目录（如选成了 x86 或其他 OS 目录） | 确认浏览路径是否包含 `amd64` 架构层级 | 确认选择的是 `viostor` 目录下的 `w11`（或对应的 Windows 版本）➔ `amd64` 子目录 |
| **安装完成后重启又重新进入安装界面** | virt-manager 启动顺序中 CD-ROM 排在第一位 | 在 virt-manager 的 Boot Options 中检查启动顺位 | 关机后在 Boot Options 中将 Virtual Disk 调整为第一启动项，或弹出安装 ISO |
| **进入桌面后没有网络连接** | VirtIO 网卡驱动（NetKVM）未安装 | 打开“设备管理器”检查网络适配器是否有黄色感叹号 | 打开 VirtIO ISO 光盘，运行 `virtio-win-guest-tools.exe` 完成网卡驱动安装 |

## 5.7 提交内容

完成本课实训后，请提交以下 **4 张包含清晰结果的截图** 作为验收证据：

| 截图文件名 | 内容要求 | 核心验收点与命令说明 |
| --- | --- | --- |
| `01-virt-manager-win01.png` | `virt-manager` 硬件配置详情截图 | 展示 `win01` 的 2 vCPU/4GB、Q35 芯片组、UEFI 固件与 TPM 2.0 |
| `02-windows-select-driver.png` | Windows 安装器加载驱动截图 | 展示加载 `viostor` 驱动后成功刷出 64GB 虚拟磁盘的画面 |
| `03-windows-desktop-tpm.png` | Windows 11 桌面与 TPM 检查截图 | 进入桌面后打开 PowerShell 执行 `Get-Tpm`，显示 `TpmPresent: True` |
| `04-win01-host-status.png` | 宿主机 `virsh` 运行状态截图 | 宿主终端执行 `virsh list` 与 `virsh domifaddr win01` 正常输出 |

::: tip 验收命令拆解与说明

* **`virsh list`**：查询宿主机当前处于运行状态的虚拟机列表，确认 `win01` 处于 running 状态；
* **`virsh domifaddr win01`**（Domain Interface Address）：查询 `win01` 虚拟机的网卡 IP 地址。
  * *注意*：如果在刚完成系统安装、尚未在 Windows 内运行 `virtio-win-guest-tools.exe` 安装 `NetKVM` 网卡驱动前执行该命令，界面可能查不到 IP，这是正常现象。安装完网卡驱动并连通网络后，即可成功输出 IP。
    :::

## 本章小结

* **UEFI 与 vTPM 2.0 机制**：OVMF 为 KVM 提供了标准的 UEFI 固件，`swtpm` 守护进程通过 CRB 接口为虚拟机提供了独立的模拟 TPM 2.0 芯片，满足了 Windows 11 的安全引导门槛。
* **VirtIO 驱动加载**：Windows 默认缺乏 VirtIO 驱动，通过挂载 `virtio-win.iso` 并加载 `viostor` 驱动，解决了系统安装阶段找不到磁盘的问题；进入桌面后运行 `virtio-win-guest-tools.exe` 完成了 `NetKVM` 网卡驱动的部署。
* **高性能半虚拟化**：相比传统的 IDE/SATA 模拟，使用 VirtIO 驱动能大幅提升 Windows 虚拟机的磁盘读写与网络吞吐性能。

在下一课中，我们将离开图形界面，学习如何使用 `virsh` 命令行工具与 `virt-install` 脚本来高效管理虚拟机的全生命周期。
