---
url: /courses/virtualization-tech/12-esxi-pve-platform-lab/index.md
---
# 企业级虚拟化平台全景对比与 PVE 嵌套虚拟化部署实战

在实际企业 IT 运维与云计算工程实践中，工程师不仅需要掌握单台 Linux 宿主机上的 KVM 命令行管理，更需要具备跨越主流企业级虚拟化平台（开源 KVM、Proxmox VE 以及商业标杆 VMware ESXi）的宏观架构视野与落地交付能力。

本课聚焦企业级虚拟化核心架构与工程落地：带你掌握控制平面与数据平面的解耦抗抖动机理，在宿主机上开启硬件嵌套虚拟化（Nested Virtualization），掌握跨平台虚拟磁盘转码与元数据解析；并在课尾的拓展实训中，完整探索 Proxmox VE（PVE）计算节点的部署与日常核心使用。

## 一、 企业级虚拟化平台架构解耦与三平台全景对比

掌握单机运维与集群管理的本质区别，是理解现代虚拟化系统控制面与数据面解耦规律的关键前提。

### 1.1 单机运维边界与多节点集中管控诉求

单台宿主机环境下，管理员直接通过本地终端管理虚拟机。但当物理机规模扩展至数十台乃至上千台时，分散的单机模式将迅速面临可见性、一致性与容灾调度的瓶颈：

| 运维维度 | 单宿主机模式 (Single-Host) | 企业级集中管理集群 (Clustered Platform) |
| :--- | :--- | :--- |
| **全局资产可见性** | 管理员需逐台登录不同宿主机执行查询，缺乏全局视角 | 集中管理控制台实时展现全局物理节点、虚拟机、资源池的 CPU/内存拓扑与容量水位 |
| **权限与安全审计** | 共享 root 账户或 sudo 权限，无法划分细粒度职责边界 | 具备统一 RBAC（基于角色的访问控制），按租户、资源池及数据中心实施精准鉴权与合规审计 |
| **任务与事务追踪** | 长耗时任务输出绑定当前本地会话，断连后难以追踪状态 | 具备全局异步任务追踪引擎（如 PVE UPID 或 vCenter Task ID），支持分布式审计与回溯 |
| **动态调度与容灾** | 宿主机硬件故障断电，宿存虚拟机处于完全瘫痪状态 | 具备 HA（高可用）机制感知宕机并在存活节点重建拉起，通过 DRS 实施动态削峰填谷 |
| **网络与存储抽象** | 各主机各自维护本地 Bridge 与目录池，同名网络互不相通 | 统一定义分布式交换机（vDS）或 SDN Zone，依赖共享存储（NFS/iSCSI/Ceph）保障迁移一致性 |

### 1.2 控制面与数据面解耦的底层隔离机理

在现代虚拟化架构设计中，“控制面（Control Plane）”与“数据面（Data Plane）”的严格解耦是保障业务高可用性的核心基石：

1. **控制面（Control Plane）职责**：负责 API 接收解析、安全鉴权、虚拟机生命周期状态编排（启动/关机/迁移指令下发）、虚拟硬件拓扑定义（XML/VMX 元数据维护）与指标监控采集。其典型代表进程包括 KVM 的 `libvirtd`、PVE 的 `pvedaemon/pveproxy` 以及 VMware ESXi 的 `hostd/vpxa`。
2. **数据面（Data Plane）职责**：负责虚拟机实际指令的物理硬件直接执行（Intel VT-x / AMD-V CPU 硬件辅助虚拟化）、内存地址翻译（EPT/NPT 嵌套页表直接映射）以及网络包与存储块设备的实际二层转发与物理落盘。其核心载体为 Linux 内核与 QEMU 进程，或 VMware VMkernel。
3. **架构解耦的工程意义**：控制面发生异常崩溃、进程假死或管理服务重启维护时，**虚拟机的底层数据面不受任何中断影响**。虚拟 CPU 依然正常调度、网络流量依然在内核虚拟网桥上线速转发、持久化存储 I/O 依然稳定落盘。这意味着“管理界面无法打开”绝不等于“虚拟机业务已经宕机”。

### 1.3 KVM、PVE 与 VMware ESXi 架构栈纵深对比

| 架构层级 | 1. KVM / Libvirt 原生技术栈 | 2. Proxmox VE (PVE) 开源集成平台 | 3. VMware ESXi / vSphere 商业平台 |
| :--- | :--- | :--- | :--- |
| **平台定位与类型** | Type-2（基于通用 Linux 内核模块） | Type-2（基于 Debian PVE 深度调优内核） | Type-1（专有裸机微内核 VMkernel） |
| **用户与管理接口** | `virsh` CLI、`virt-manager`、Libvirt SDK | ExtJS Web UI（默认 8006 端口）、PVE REST API | vSphere Client (HTML5)、Host Client、PowerCLI |
| **节点管理代理** | `libvirtd` 服务守护进程（UNIX Socket 监听） | `pvedaemon` + `pveproxy` 双守护进程 | `hostd`（单机）+ `vpxa`（vCenter 纳管代理） |
| **集群编排架构** | 无原生集群，需上层 OpenStack/Kubevirt 整合 | 内置 Masterless 对等集群（Corosync + pmxcfs） | 强中心化集群（vCenter Server Appliance / VCSA） |
| **工作负载引擎** | QEMU / KVM 硬件虚拟化 | QEMU / KVM 虚机 + LXC 系统容器双引擎 | VMware VMX 虚拟机监视器 |
| **主流存储支持** | 本地目录池、qcow2、RAW、NFS、iSCSI | ZFS、Ceph RBD、LVM-Thin、NFS、Proxmox Backup | VMFS-6、vSAN 分布式存储、NFS、VVOL |

### 1.4 三大平台架构流转与调用流水线动态演示

通过下方交互动画，切换观察 KVM、PVE 与 ESXi 在系统各层级中的真实构造差异，并点击「演示调用流水线」观察请求信号如何在不同架构中穿透：

### 1.5 实训任务一：探查与验证虚拟化控制面服务及业务连续性

#### 适用场景与实训价值

在生产运维中，经常会遇到管理服务升级、配置热重载或管理控制台假死的情况。初入职场的运维工程师容易在管理界面打不开时误以为“系统死机了”而盲目重启物理服务器，从而引发生产事故。通过本次实训，你将亲自探查控制面服务的底层工作机制，并现场验证管理服务停止时虚拟机业务依然零中断的解耦规律。

#### 步骤 1：探查 libvirtd 守护进程状态与通信套接字

探查宿主机 `libvirtd` 守护进程的工作状态，核验其本地 UNIX 监听套接字（`libvirt-sock`）与进程属性。客户端工具（如 `virsh`）正是通过向该套接字发送 RPC 请求，实现对虚拟化资源的统一调度。

```bash
# 【宿主机终端 Host】检查 libvirtd 守护进程状态
sudo systemctl status libvirtd --no-pager

# 【宿主机终端 Host】查看 libvirt 本地 RPC 通信套接字路径与权限
ls -l /run/libvirt/libvirt-sock
```

执行后，终端将返回守护进程运行状态与套接字详情。参考回显如下：

```text
● libvirtd.service - Virtualization daemon
     Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; preset: enabled)
     Active: active (running) since Thu 2026-09-10 09:00:00 CST; 2h ago
TriggeredBy: ● libvirtd.socket
             ● libvirtd-ro.socket
             ● libvirtd-admin.socket
       Docs: man:libvirtd(8)
             https://libvirt.org
   Main PID: 1245 (libvirtd)
      Tasks: 19 (limit: 32768)
     Memory: 48.5M
        CPU: 1.250s
     CGroup: /system.slice/libvirtd.service
             └─1245 /usr/sbin/libvirtd --timeout 120

srwxrwx--- 1 root libvirt 0 Sep 10 09:00 /run/libvirt/libvirt-sock
```

**命令输出核心字段深度解析**：

1. `Active: active (running)`：证明虚拟化管理控制面守护进程处于常驻运行状态；
2. `TriggeredBy: libvirtd.socket`：说明现代 Linux 采用套接字激活（Socket Activation）机制管理虚拟化守护进程，有客户端连接请求时即时唤醒；
3. `srwxrwx---` 中的 `s`：表明 `/run/libvirt/libvirt-sock` 是一个 UNIX Domain Socket（本地进程间通信套接字），属组为 `libvirt`，属于该组的用户无需 sudo 即可执行日常查询。

#### 步骤 2：采集宿主机物理硬件拓扑基线

使用 `virsh nodeinfo` 与 `virsh nodememstats` 采集宿主机的 CPU 架构、核心数、线程数及物理内存分布，获取平台资源管理基线。

```bash
# 【宿主机终端 Host】获取宿主机物理计算拓扑全景
virsh nodeinfo

# 【宿主机终端 Host】探查物理宿主机内存总量与分配状态
virsh nodememstats
```

执行后，终端将返回节点硬件信息。参考回显如下：

```text
# virsh nodeinfo 输出
CPU model:           x86_64
CPUs:                4
CPU frequency:       2400 MHz
CPU socket(s):       1
Core(s) per socket:  4
Thread(s) per core:  1
NUMA cell(s):        1
Memory size:         16384000 KiB

# virsh nodememstats 输出
total  :             16384000 KiB
free   :             11520000 KiB
buffers:               320000 KiB
cached :              2450000 KiB
```

**命令输出核心字段深度解析**：

1. `CPUs: 4` 与 `Core(s) per socket: 4`：表示当前宿主机具备 4 颗物理核心，单插槽（Socket），单核心 1 线程；
2. `NUMA cell(s): 1`：表示单 NUMA 节点架构，所有 CPU 核心共享同一块物理内存寻址总线，不存在跨插槽访问延迟；
3. `Memory size: 16384000 KiB` 与 `free: 11520000 KiB`：表明宿主机总物理内存约为 16GB，当前空闲可用内存充沛。

#### 步骤 3：模拟控制面服务中断并验证虚拟机业务零中断

启动虚拟机 `svr01`，查询其分配到的真实 IP 地址（例如 `192.168.122.100`）；随后主动停止 `libvirtd` 守护进程，并在控制面关闭期间执行 ping 连通性测试，实证数据面业务不受影响。

```bash
# 【宿主机终端 Host】启动虚拟机 svr01
virsh start svr01

# 【宿主机终端 Host】查询虚拟机分配到的 IP 地址
virsh domifaddr svr01
```

执行后，终端将返回启动与 IP 分配结果。参考回显如下：

```text
Domain 'svr01' started

 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:12:34:56    ipv4         192.168.122.100/24
```

获取到真实 IP（此处示例为 `192.168.122.100`）后，在终端执行控制面停止与抗抖动测试：

```bash
# 【宿主机终端 Host】1. 模拟管理控制面故障：主动停止 libvirtd 守护进程
sudo systemctl stop libvirtd

# 【宿主机终端 Host】2. 验证管理客户端报错 (控制面已瘫痪)
virsh list --all

# 【宿主机终端 Host】3. 探测虚拟机业务网络连通性 (将 192.168.122.100 替换为你查到的真实 IP)
ping -c 3 192.168.122.100

# 【宿主机终端 Host】4. 恢复管理控制面服务并核验恢复状态
sudo systemctl start libvirtd
virsh list --all
```

执行后，终端将返回测试结果。参考回显如下：

```text
error: failed to connect to the hypervisor
error: Failed to connect socket to '/run/libvirt/libvirt-sock': No such file or directory

PING 192.168.122.100 (192.168.122.100) 56(84) bytes of data.
64 bytes from 192.168.122.100: icmp_seq=1 ttl=64 time=0.450 ms
64 bytes from 192.168.122.100: icmp_seq=2 ttl=64 time=0.392 ms
64 bytes from 192.168.122.100: icmp_seq=3 ttl=64 time=0.410 ms

--- 192.168.122.100 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2048ms
rtt min/avg/max/mdev = 0.392/0.417/0.450/0.024 ms

 Id   Name    State
-----------------------
 1    svr01   running
```

::: tip 生产环境抗抖动启示
在生产环境中，当 `libvirtd`、`pveproxy` 或 `vCenter` 升级维护或异常崩溃时，切勿恐慌性直接重启物理宿主机。因为虚拟机的业务进程仍在内核数据面稳定运行，盲目重启物理主机会导致原本正常的生产业务遭遇非预期中断。
:::

## 二、 嵌套虚拟化（Nested Virtualization）机理与宿主穿透配置

在公有云研发、多租户测试平台以及现代私有云实训中，工程师常常需要在虚拟机内部继续运行一套完整的虚拟化平台（例如在 KVM 虚机内运行 Proxmox VE 或 Kubernetes KubeVirt）。这就是**嵌套虚拟化（Nested Virtualization）**。

### 2.1 嵌套虚拟化三层层级模型（L0 / L1 / L2）

嵌套虚拟化体系将计算环境划分为严密的三层结构：

| 层级标识 | 角色名称 | 对应实体与工作机制 |
| :--- | :--- | :--- |
| **L0（Level 0）** | 物理宿主机 (Bare-Metal Host) | 真实的物理服务器硬件，运行 Linux 物理内核与物理 CPU（Intel VT-x / AMD-V），负责开启嵌套参数开关（`nested=1`） |
| **L1（Level 1）** | 虚拟 Hypervisor 节点 (Guest Hypervisor) | 运行在 L0 之上的第一层虚拟机（如 Proxmox VE、ESXi），通过 CPU 直通（`--cpu host-passthrough`）获得硬件虚拟化指令扩展能力 |
| **L2（Level 2）** | 嵌套虚拟机 / 容器 (Nested Guest) | 运行在 L1 虚拟平台内部的最终业务虚拟机，其特权指令由 L1 捕获后穿透至 L0 物理 CPU 直接硬件执行，获得接近裸机的性能 |

### 2.2 嵌套虚拟化穿透与 PVE 工作流动态交互

通过下方交互组件，动态观察 L0 ➔ L1 ➔ L2 嵌套虚拟化硬件指令穿透过程，并切换体验 Proxmox VE 核心管理工作流：

### 2.3 实训任务二：宿主机嵌套虚拟化开启与硬件指令穿透验证

#### 适用场景与实训价值

在企业实际工作中，搭建私有云验证集群、测试多节点高可用或构建云原生实验平台时，为每个开发人员单独采购物理服务器成本过高。工程师通过在现有的 Linux 宿主机上开启嵌套虚拟化，便可在单台机器上随心所欲地开出多台能够运行 Hypervisor 的虚拟节点。

#### 步骤 1：探测物理 CPU 虚拟化指令扩展与厂商模块

使用 `lscpu` 探查宿主机 CPU 架构与虚拟化支持特性：

```bash
# 【宿主机终端 Host】查看 CPU 虚拟化特性标志
lscpu
```

执行后，终端将返回 CPU 特性信息。参考回显如下：

```text
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         39 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  4
Vendor ID:               GenuineIntel
Model name:              Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
Virtualization features: 
  Virtualization:        VT-x
  Hypervisor vendor:     KVM
```

**命令输出核心字段深度解析**：

1. `Vendor ID: GenuineIntel`：表明当前 CPU 为 Intel 处理器（对应内核模块 `kvm_intel`；若为 `AuthenticAMD` 则对应 `kvm_amd`）；
2. `Virtualization: VT-x`：表明物理 CPU 已在主板 BIOS 中开启硬件辅助虚拟化技术。

#### 步骤 2：检查并开启内核嵌套虚拟化模块参数

读取当前宿主机内核模块中的嵌套虚拟化参数 `nested`。若返回 `N` 或 `0`，则需要动态重新加载模块并固化配置文件。

```bash
# 【宿主机终端 Host】读取 Intel 嵌套虚拟化开启状态
cat /sys/module/kvm_intel/parameters/nested
```

执行后，终端返回当前状态：

* 若返回 `Y` 或 `1`：表示嵌套虚拟化已开启；
* 若返回 `N` 或 `0`：需执行下方步骤开启并固化。

```bash
# 【宿主机终端 Host】1. 确保所有虚拟机处于关机状态后，重新加载带 nested=1 参数的内核模块
sudo modprobe -r kvm_intel
sudo modprobe kvm_intel nested=1

# 【宿主机终端 Host】2. 将配置固化至 modprobe 配置目录，确保宿主机重启后依然生效
echo "options kvm_intel nested=1" | sudo tee /etc/modprobe.d/kvm.conf

# 【宿主机终端 Host】3. 重新核验嵌套参数
cat /sys/module/kvm_intel/parameters/nested
```

执行后，终端返回结果。参考回显如下：

```text
Y
```

回显为 `Y`，证明宿主机内核已成功就绪，具备向虚拟机透传硬件虚拟化指令的能力。

## 三、 跨平台虚拟磁盘格式转码与元数据解析实战

在跨平台运维与平台迁移中，不同 Hypervisor 对底层虚拟磁盘的存储格式与元数据定义完全不同。掌握底层镜像转码是每一位云计算运维工程师的基本功。

### 3.1 QCOW2 与 VMware monolithicFlat VMDK 存储结构对比

* **KVM 原生 QCOW2 格式**：采用二级页表（L1/L2 Table）管理稀疏分配与写时复制（CoW），单文件内封装动态扩容与快照链；
* **VMware monolithicFlat VMDK 格式**：采用“双文件规范”，由一个人类可读的轻量文本描述头（`.vmdk`，记录扇区几何参数、控制器类型与 CID 链），配合一个未压缩的线性扁平数据卷（`-flat.vmdk`）共同组成。

| 存储维度 | KVM 原生 QCOW2 | VMware monolithicFlat VMDK |
| :--- | :--- | :--- |
| **文件组成结构** | 单个二进制文件（带 QCOW2 文件头与簇索引） | 双文件结构（`.vmdk` 文本描述符 + `-flat.vmdk` 裸数据块） |
| **元数据可读性** | 专有二进制结构，需借助 `qemu-img` 命令行解析 | 文本描述符人类可读，可直接使用 `cat`/`nano` 查看与修改 |
| **总线协议声明** | 由 libvirt 虚拟机 XML 元数据外部声明 | 直接在 `.vmdk` 内部 `ddb.adapterType` 字段固化声明 |
| **目标平台兼容性** | KVM、Proxmox VE、OpenStack 原生支持 | VMware ESXi、VMware Workstation、PVE 导入支持 |

### 3.2 实训任务三：将 QCOW2 磁盘转码为 VMDK 规范并解析描述符

#### 适用场景与实训价值

当企业需要将自建 KVM/libvirt 平台上的业务虚拟机（如 `svr01`）导出并交付给 VMware ESXi 环境或第三方测试平台时，直接发送 `.qcow2` 文件会导致对方平台报“无法识别磁盘格式”。通过本次实训，你将在宿主机上使用 `qemu-img` 完成底层格式转码，并深入解析 VMware 磁盘描述符的底层几何参数。

#### 步骤 1：创建导出目录并执行格式转码

在宿主机上创建专用的导出目录 `/var/lib/libvirt/v2v-export`，确保虚拟机 `svr01` 处于关机状态，使用 `qemu-img convert` 命令将 `svr01.qcow2` 转码为 VMware `monolithicFlat` 格式：

```bash
# 【宿主机终端 Host】1. 创建导出目录并配置属主权限
sudo mkdir -p /var/lib/libvirt/v2v-export
sudo chown $(whoami):$(whoami) /var/lib/libvirt/v2v-export

# 【宿主机终端 Host】2. 确认源虚拟机已关机
virsh domstate svr01

# 【宿主机终端 Host】3. 执行磁盘格式转码
qemu-img convert -p -f qcow2 -O vmdk \
  -o subformat=monolithicFlat,adapter_type=lsilogic \
  /var/lib/libvirt/images/svr01.qcow2 \
  /var/lib/libvirt/v2v-export/svr01.vmdk
```

执行后，终端展示转码进度条。参考回显如下：

```text
shut off
    (100.00/100%)
```

**关键参数深度解析**：

* `-p`：显示转码百分比进度条（Progress）；
* `-f qcow2`：显式指定源磁盘镜像格式为 QCOW2；
* `-O vmdk`：指定输出目标磁盘格式为 VMware VMDK；
* `-o subformat=monolithicFlat`：指定子格式为单体平坦模式，生成描述符与 flat 数据块；
* `-o adapter_type=lsilogic`：预置 VMware 标准 LSI Logic SCSI 适配器总线类型。

#### 步骤 2：查看生成文件并深入解析 VMDK 文本描述符

查看导出目录中的生成文件，并使用 `cat` 探查生成的 `.vmdk` 描述符内部结构：

```bash
# 【宿主机终端 Host】查看生成的文件列表与大小
ls -lh /var/lib/libvirt/v2v-export/

# 【宿主机终端 Host】探查 VMDK 文本描述符核心内容
cat /var/lib/libvirt/v2v-export/svr01.vmdk
```

执行后，终端将返回文件列表与描述符内容。参考回显如下：

```text
# ls -lh 输出
-rw-r--r-- 1 gabrlie gabrlie  520 Sep 10 10:30 svr01.vmdk
-rw-r--r-- 1 gabrlie gabrlie  20G Sep 10 10:30 svr01-flat.vmdk

# cat svr01.vmdk 输出
# Disk DescriptorFile
version=1
CID=7d3a9b1c
parentCID=ffffffff
createType="monolithicFlat"

# Extent description
RW 41943040 FLAT "svr01-flat.vmdk" 0

# The Disk Data Base 
#DDB

ddb.virtualHWVersion = "6"
ddb.geometry.cylinders = "2610"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.adapterType = "lsilogic"
```

**描述符核心字段深度解析**：

1. `createType="monolithicFlat"`：声明本磁盘采用描述符与平坦数据块分离的架构；
2. `RW 41943040 FLAT "svr01-flat.vmdk" 0`：定义扇区总数为 41943040（即 20GB），数据物理指向同目录下的 `svr01-flat.vmdk`，起始偏移量为 0；
3. `CID=7d3a9b1c` 与 `parentCID=ffffffff`：内容标识符（Content ID），`ffffffff` 表明这是一个独立的基础磁盘，不存在父级快照链；
4. `ddb.adapterType = "lsilogic"`：告知 Hypervisor 虚拟机引导时采用 LSI Logic SCSI 存储总线协议加载该磁盘。

#### 步骤 3：使用 qemu-img info 校验转码镜像元数据

```bash
# 【宿主机终端 Host】全面核验 VMDK 镜像技术规格
qemu-img info /var/lib/libvirt/v2v-export/svr01.vmdk
```

执行后，终端返回转码后的镜像信息。参考回显如下：

```text
image: /var/lib/libvirt/v2v-export/svr01.vmdk
file format: vmdk
virtual size: 20 GiB (21474836480 bytes)
disk size: 4.0 KiB
Format specific information:
    cid: 2100984604
    parent cid: 4294967295
    create type: monolithicFlat
    extents:
        [0]:
            virtual size: 21474836480
            filename: /var/lib/libvirt/v2v-export/svr01-flat.vmdk
            format: FLAT
```

::: tip 生产迁移交付准则
向 VMware 或第三方平台交付该虚拟磁盘时，**必须将 `svr01.vmdk`（描述符）与 `svr01-flat.vmdk`（数据卷）成对传输**。若仅传输数据卷，目标平台将因缺少描述头而无法挂载识别。
:::

## 四、 拓展实训：Proxmox VE 虚拟节点部署与平台核心使用指南

::: note 进阶拓展说明
本节为**进阶实训参考流程**。由于在个人电脑上运行嵌套 PVE 节点需要较充沛的物理内存（推荐 8GB 以上），且依赖 PVE 系统镜像，因此本节内容**不计入必交作业截图**。重点在于理解真实生产中 PVE 的部署参数规范与日常平台核心使用逻辑。
:::

```text
┌────────────────────────────────────────────────────────────────────────┐
│ 宿主机 KVM (L0 Host)                                                   │
│   └─ virt-install --cpu host-passthrough                              │
│       └─ PVE 虚拟机 pve-node01 (L1 Hypervisor, IP: 192.168.122.50)     │
│           ├─ Web 8006 控制台 (pveproxy / pvedaemon)                    │
│           ├─ 存储池划分 (local 目录池 vs local-lvm 细粒度块池)         │
│           ├─ KVM 全虚拟化虚机 (VM 100: web-svr01)                      │
│           └─ LXC 系统轻量容器 (CT 200: app-ct01 / 共享宿主内核)        │
└────────────────────────────────────────────────────────────────────────┘
```

### 4.1 PVE 虚拟节点规格设计与 CPU 直通准则

在 KVM 上创建 PVE 虚拟机时，最核心的参数是 **CPU 模式必须指定为 `host-passthrough`（或 `host`）**。

| 参数项 | 推荐配置 | 生产工程考量 |
| :--- | :--- | :--- |
| **虚拟机名称** | `pve-node01` | 遵循企业数据中心节点命名规范 |
| **vCPU 与 CPU 模式** | `2 vCPU`, `--cpu host-passthrough` | **绝对关键项**：将物理 CPU 的全部指令集（含 VMX/SVM 硬件标志）100% 直通进入 PVE |
| **内存容量** | `4096 MB (4 GB)` | PVE 底层运行 Debian、Corosync 与 pvedaemon，4GB 内存可保障系统守护进程稳定 |
| **磁盘存储** | `32 GB qcow2` (存储池 default) | 存放 PVE 系统镜像、ISO 缓存与本地虚拟卷，支持精简置备与写时复制 |
| **虚拟网络** | `bridge=virbr0` (NAT 模型) | 接入 libvirt default 虚拟交换机，便于分配独立 IP 并通过 Web 控制台访问 |

### 4.2 PVE 节点部署全流程与服务验证

1. **在 KVM 上创建并启动 PVE 虚拟节点**：
   ```bash
   # 【宿主机终端 Host】使用 CPU 硬件直通模式创建 PVE 节点
   sudo virt-install \
     --name pve-node01 \
     --ram 4096 \
     --vcpus 2 \
     --cpu host-passthrough \
     --disk path=/var/lib/libvirt/images/pve-node01.qcow2,size=32,format=qcow2,bus=virtio \
     --network network=default,model=virtio \
     --graphics none \
     --os-variant debian12 \
     --import \
     --noautoconsole
   ```
   ::: tip 安装模式说明
   * **预装镜像导入（快速）**：若实验环境中具备已初始化的 PVE 8.x 镜像，使用 `--import` 秒级导入启动；
   * **官方 ISO 安装**：若使用 Proxmox VE 官方 ISO，替换为 `--cdrom /path/to/proxmox-ve_8.x.iso` 并开启 VNC 控制台。在安装向导中设置 FQDN 主机名为 `pve-node01.lab.local`，IP 分配为 `192.168.122.50/24`，网关为 `192.168.122.1`。
     :::
2. **探查 IP 并通过 SSH 登录 PVE 节点**：
   ```bash
   # 【宿主机终端 Host】查询 PVE 节点 IP 地址
   virsh domifaddr pve-node01
   # 【宿主机终端 Host】登录 PVE 节点 (替换为查到的实际 IP)
   ssh root@192.168.122.50
   ```
3. **验证 PVE 核心服务与硬件虚拟化透传**：
   ```bash
   # 【PVE 节点终端 PVE】查看 PVE 详细组件版本
   pveversion -v

   # 【PVE 节点终端 PVE】探查 Web 控制台监听的 8006 端口
   ss -tulpn

   # 【PVE 节点终端 PVE】核验 CPU 硬件虚拟化标志是否成功穿透
   lscpu
   ```
   `pveversion -v` 正常输出各组件版本，`ss -tulpn` 显示 `0.0.0.0:8006` 处于监听，且 `lscpu` 包含 `Virtualization: VT-x`，表明 PVE 虚拟节点部署成功。

### 4.3 Proxmox VE 平台核心日常使用实操

#### 1. Web 控制台访问与界面概览

在宿主机浏览器中输入 `https://192.168.122.50:8006`（将 IP 替换为实际节点 IP），接受自签名证书警告即可打开 PVE 企业级控制台：

* **用户名**：`root`
* **Realm（认证域）**：选择 `Linux PAM standard authentication`
* **语言**：可选择 `Chinese (Simplified)`

#### 2. 存储池模型与资源规划

PVE 默认开箱提供两套不同用途的本地存储池：

* **`local` 存储池（Directory 目录存储，挂载于 `/var/lib/vz`）**：存放 ISO 安装镜像、LXC 容器模板与全量备份包；
* **`local-lvm` 存储池（LVM-Thin 细粒度块存储）**：基于精简置备卷，专门存放虚拟机和容器的虚拟磁盘镜像（RAW 格式），支持高速 I/O 与秒级快照。

```bash
# 【PVE 节点终端 PVE】查询当前节点全部存储池状态与容量
pvesm status
```

#### 3. KVM 虚拟机的创建与运行

除了 Web UI 界面向导外，管理员常使用 PVE 原生工具 `qm` 执行脚本化创建：

```bash
# 【PVE 节点终端 PVE】1. 创建虚拟机骨架 (VMID 100，2048MB 内存，2 核心，绑定网桥 vmbr0)
qm create 100 \
  --name web-svr01 \
  --memory 2048 \
  --cores 2 \
  --net0 virtio,bridge=vmbr0 \
  --ostype l26

# 【PVE 节点终端 PVE】2. 在 local-lvm 存储池中为虚拟机分配 10GB VirtIO-SCSI 磁盘
qm set 100 \
  --scsihw virtio-scsi-pci \
  --scsi0 local-lvm:10,bootorder=1

# 【PVE 节点终端 PVE】3. 启动虚拟机并查看列表
qm start 100
qm list
```

#### 4. LXC 系统容器的秒级轻量交付

LXC 容器共享宿主机内核，无虚拟化硬件翻译损耗，内存底噪仅数十 MB，启动仅需 1 秒：

```bash
# 【PVE 节点终端 PVE】1. 使用 Ubuntu 模板创建 LXC 系统容器 (CT ID 200，512MB 内存，1 核心，8GB 根分区)
pct create 200 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
  --hostname app-ct01 \
  --memory 512 \
  --cores 1 \
  --rootfs local-lvm:8 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp \
  --unprivileged 1 \
  --password

# 【PVE 节点终端 PVE】2. 秒级启动容器并登入终端
pct start 200
pct enter 200
```

#### 5. 虚拟机快照与原生备份实操

```bash
# 【PVE 节点终端 PVE】1. 为虚拟机 100 创建运行中快照
qm snapshot 100 snap-baseline --description "初次配置基线快照"

# 【PVE 节点终端 PVE】2. 将虚拟机 100 以 snapshot 模式在线备份压缩至 local 存储池
vzdump 100 --storage local --mode snapshot --compress zstd
```

备份完成后，归档包将自动保存于 `/var/lib/vz/dump/` 目录中，支持一键在任意 PVE 节点异地重建恢复。

## 五、 企业级虚拟化与平台运维 7 层常见问题排错矩阵

在实际生产运维中，遇到嵌套虚拟化不生效、控制台端口无法连接或容器创建异常时，可依据下表快速定位并排查：

| 故障编号 | 故障现象描述 | 底层诱因深度剖析 | 快速诊断命令 | 标准修复方案 |
| :--- | :--- | :--- | :--- | :--- |
| **ERR-01** | `cat /sys/module/kvm_intel/parameters/nested` 返回 `N` | 宿主机内核模块未开启嵌套参数，或 BIOS 中禁用了 VT-x/AMD-V | `sudo modprobe -r kvm_intel` | 检查 BIOS 虚拟化开关，并在 `/etc/modprobe.d/kvm.conf` 中配置 `options kvm_intel nested=1` 重新加载模块 |
| **ERR-02** | `virt-install` 部署虚机报错 `KVM is not available` | 宿主机 `/dev/kvm` 权限异常或 CPU 模式未设置为 `host-passthrough` | `ls -l /dev/kvm``virsh dumpxml svr01` | 确保当前用户在 `kvm`/`libvirt` 用户组中；检查 XML 中 `<cpu mode='host-passthrough'/>` |
| **ERR-03** | 虚拟机内部执行 `lscpu` 无 `VT-x` 虚拟化标志 | 虚拟机创建时采用了默认的虚拟通用 CPU（如 QEMU64），未透传硬件特性 | `virsh vcpuinfo svr01` | 编辑虚拟机配置，将 CPU 模型更改为 `host-passthrough` 并重启虚拟机 |
| **ERR-04** | 浏览器访问 `https://<PVE_IP>:8006` 提示连接被拒绝 | PVE 核心代理服务 `pveproxy` 未启动，或宿主机防火墙阻断了 8006 端口 | `ssh root@<PVE_IP> "systemctl status pveproxy"` | 在 PVE 内部执行 `systemctl restart pveproxy`，并确认宿主机允许 8006 TCP 端口通行 |
| **ERR-05** | `qemu-img convert` 报错 `No space left on device` | 宿主机导出目录所在分区磁盘空间不足，无法容纳转码解压后的平坦磁盘卷 | `df -h /var/lib/libvirt/v2v-export` | 清理宿主机磁盘无用镜像或挂载大容量外部存储目录 |
| **ERR-06** | 宿主机停止 `libvirtd` 后 `virsh` 报错 `Failed to connect` | `libvirtd` 守护进程已停止，本地 UNIX Socket 文件被释放 | `systemctl status libvirtd` | 属于正常预期现象，证明控制面中断；执行 `sudo systemctl start libvirtd` 即可恢复 |
| **ERR-07** | VMDK 描述符文件丢失导致目标平台无法识别磁盘 | 跨平台拷贝时仅携带了 `-flat.vmdk` 数据卷，遗漏了关键的 `.vmdk` 文本描述头 | `ls -l /var/lib/libvirt/v2v-export/` | 跨平台拷贝时必须同时携带 `.vmdk` 与 `-flat.vmdk` 两个文件 |

## 六、 课程实训交付与验收凭证清单

完成本课实训后，请将以下 **3 张核心关键截图** 保存并提交至个人学习档案目录（全部基于宿主机终端即可 100% 独立完成）：

| 凭证序号 | 验收内容 | 关键命令与参考回显特征 | 截图重点要求 |
| :---: | :--- | :--- | :--- |
| **截图 1** | **控制面与数据面解耦验证** | 宿主机主动执行 `sudo systemctl stop libvirtd`在 `virsh` 报错期间持续 `ping 192.168.122.100` 3 次全部连通 | 需完整截取终端中 `virsh` 报错信息与 `ping` 0% packet loss 连通回显 |
| **截图 2** | **宿主机嵌套虚拟化就绪** | 终端执行 `cat /sys/module/kvm_intel/parameters/nested`回显：`Y` | 需完整截取终端执行命令及返回的 `Y` 标志 |
| **截图 3** | **跨平台 VMDK 转码与描述符验证** | 终端执行 `cat /var/lib/libvirt/v2v-export/svr01.vmdk` 与 `qemu-img info`回显：展示 `monolithicFlat`、`lsilogic` 及 20GB 大小 | 需截取描述符文件内容及 `qemu-img info` 校验输出 |
