概述

存储虚拟化在 vSphere 中的核心地位

存储是虚拟化基础设施的三大核心资源之一(计算、存储、网络),在企业级 vSphere 环境中,存储系统的设计直接决定了虚拟机的性能、可用性和可管理性。与物理服务器时代不同,虚拟化环境中的存储面临更为复杂的需求:多个虚拟机共享同一存储资源池、需要支持在线迁移(vMotion)、高可用(HA)集群、快照和克隆等高级功能。

VMware vSphere 提供了丰富的存储虚拟化能力,涵盖从本地存储到 SAN/NAS、从传统 HDD 到全闪存阵列、从块存储到对象存储的完整解决方案。本篇文章将深入探讨 ESXi 存储管理的核心技术:VMFS(Virtual Machine File System)、网络附加存储(NFS/iSCSI)集成,以及 VMware 的超融合解决方案 vSAN。

为什么存储管理如此重要

在虚拟化环境中,存储往往是性能瓶颈的第一来源。根据 VMware 的最佳实践分析,超过 60% 的虚拟机性能问题最终可以追溯到存储子系统的配置不当或资源争用。正确的存储规划可以带来以下收益:

  1. 性能提升:合理的存储架构设计可以将应用的 I/O 延迟从数十毫秒降低到亚毫秒级别
  2. 容量优化:通过精简置备(Thin Provisioning)、去重(Deduplication)和压缩技术,存储利用率可以从传统 30-40% 提升到 70-90%
  3. 运维简化:集中化的存储管理和自动化策略降低了日常运维复杂度
  4. 业务连续性:VMFS 集群文件系统和共享存储为 vSphere HA、FT、DRS 等高级功能奠定基础

存储架构全景

一个完整的 vSphere 存储栈由以下层次组成:

TEXT
+-----------------------------------------------------+
|                  虚拟机工作负载                         |
+-----------------------------------------------------+
|                   虚拟磁盘 (VMDK)                       |
+-----------------------------------------------------+
|               VMFS / NFS / vSAN                       |
+-----------------------------------------------------+
|              存储协议层 (FC/iSCSI/NFS/SMB)             |
+-----------------------------------------------------+
|      物理存储 (DAS/SAN/NAS/本地磁盘/SDD)                |
+-----------------------------------------------------+
  • 上层:虚拟机通过虚拟 SCSI 控制器访问 VMDK 虚拟磁盘文件
  • 中间层:VMFS 提供集群文件系统功能,NFS 提供 NAS 访问,vSAN 提供分布式存储
  • 协议层:FC(光纤通道)、iSCSI(IP-SAN)、NFS(网络文件系统)、SMB/CIFS
  • 物理层:DAS(直接附加存储)、SAN(存储区域网络)、NAS(网络附加存储)、本地磁盘、SSD

存储类型对比

图中将 VMFS、NFS、iSCSI/FC 和 vSAN 放在同一张对比表里。选择存储方案时不能只看容量,还要同时考虑共享能力、网络依赖、路径冗余、扩展方式和排障证据。

存储类型 协议 典型延迟 适用场景 优点 缺点
本地存储 SATA/SAS/NVMe <1ms 测试/开发、vSAN 低延迟、低成本 无共享、单点故障
FC-SAN 光纤通道 1-5ms 核心生产、数据库 高性能、成熟稳定 成本高、管理复杂
iSCSI-SAN iSCSI over IP 2-10ms 通用生产 成本低、IP 网络统一 依赖网络质量
NFS NFS v3/v4.1 2-10ms 通用生产、VDI 简单易用、配置灵活 依赖网络
vSAN 本地 NVMe/SAS <1ms 超融合、ROBO 简化架构、弹性扩展 节点绑定

学习目标

通过本篇学习,读者将能够:

  1. 深入理解 VMFS 文件系统的架构、版本特性和高级管理操作
  2. 掌握 ESXi 对接 iSCSI/NFS 外部存储的完整配置流程
  3. 学习和配置 vSAN 超融合存储集群
  4. 掌握存储性能监控和故障排查方法
  5. 了解存储多路径(MPIO)和负载均衡策略
  6. 掌握存储 I/O 控制(SIOC)和存储 DRS 的使用

核心概念

VMFS 文件系统深度解析

VMFS 架构与设计原理

VMware VMFS(Virtual Machine File System)是 vSphere 平台的核心存储组件,它是一个高性能的集群文件系统,专门设计用于存储虚拟机文件(VMDK、VMX、日志文件等)。VMFS 的集群特性允许多个 ESXi 主机同时读写同一个 VMFS 卷(Datastore),通过分布式锁机制确保数据一致性。

VMFS 的核心架构基于以下设计原则:

集群感知锁机制: VMFS 使用 SCSI-3 Persistent Reservation(PR)和 ATS(Atomic Test and Set)机制来实现分布式锁定。当 ESXi 主机需要访问 VMFS 卷上的某个文件时,它会通过存储设备发送锁定请求。锁定的粒度是文件级别而非整个卷级别,这意味着多个主机可以同时访问同一个 VMFS 卷上的不同文件。

文件块分配: VMFS 使用块级分配策略,文件以子块(Sub-Block,通常 8KB-64KB)、块(Block,1MB)和扩展块(Extended Block)的层次结构组织。对于小文件(如 VMX 配置文件),VMFS 使用子块分配,减少空间浪费。对于大文件(如 VMDK 虚拟磁盘),VMFS 使用 1MB 块分配,优化大 I/O 性能。

热扩展支持: VMFS 卷可以在线扩展,无需卸载或重新格式化。当需要更多存储空间时,可以向 VMFS 数据存储添加新的存储设备或扩展 LUN 大小,操作对运行的虚拟机完全透明。

VMFS 版本演进与特性对比

特性 VMFS 3 VMFS 5 VMFS 6
引入版本 ESX 3.x ESXi 5.0 ESXi 6.5
最大块大小 8MB 1MB (固定) 1MB (可调)
最大 VMDK 大小 2TB 62TB 62TB+
最大卷大小 64TB 64TB 64TB
子块大小 64KB 8KB-64KB 1KB-64KB
512e 支持 是 (高级)
ATS 增强 部分 完全支持
SPBM 支持 基本 原生集成
原子测试与设置 有限 增强
精简置备回收 手动 手动 自动 UNMAP

VMFS 6 关键增强

  1. 增强的子块分配:VMFS 6 引入了更小的子块粒度(1KB),对于存储大量小文件(如容器层、链接克隆的差异盘)的场景,显著减少了空间浪费。

  2. 自动精简置备回收(UNMAP):VMFS 6 支持自动的 UNMAP 操作。当虚拟机删除文件或释放磁盘空间时,VMFS 6 自动向底层存储设备发出 UNMAP 命令,回收未使用的存储空间。这解决了 VMFS 5 中精简虚拟磁盘空间不断膨胀的问题。

  3. 512e 原生支持:VMFS 6 原生支持 512e(512字节模拟)存储设备,优化了与现代存储阵列的兼容性和性能。

  4. SPBM 深度集成:存储策略的强制执行贯穿整个 VMFS 6 栈,从卷创建到虚拟机部署的每个步骤都与存储策略无缝集成。

VMDK 虚拟磁盘格式

VMDK(Virtual Machine Disk)是 VMware 的虚拟磁盘文件格式,存储在 VMFS 数据存储上。VMDK 支持两种主要置备类型:

厚置备延迟置零(Lazy Zeroed Thick / Eager Zeroed Thick)

  • Lazy Zeroed Thick:创建时分配完整的磁盘空间,但不会立即将块归零。首次写入时执行归零操作。

    • 优点:创建速度快(秒级)
    • 缺点:首次写入性能略低(需要先归零)
    • 适用场景:非关键型工作负载、测试环境
  • Eager Zeroed Thick:创建时分配完整空间并立即将所有块归零。

    • 优点:任何时候写入性能一致,支持 Fault Tolerance(FT)
    • 缺点:创建时间长(取决于磁盘大小)
    • 适用场景:需要 FT 保护的虚拟机、对性能一致性要求高的应用

精简置备(Thin Provisioning)

  • 按需分配空间,VMDK 文件大小等于实际写入的数据量。
  • 优点:节省存储空间(实际部署中节省 30-60% 空间)
  • 缺点:可能出现过量分配(Overcommitment),需监控实际使用量
  • 适用场景:开发和测试环境、桌面虚拟化(VDI)

对比分析

TEXT
+------------+----------+----------------+------------+------------+
|  置备类型   | 初始大小  | 创建速度        | 性能       | 适用场景    |
+------------+----------+----------------+------------+------------+
| Lazy Zeroed| 完整分配  | 快             | 首次写入慢  | 通用生产    |
| Eager Zero | 完整分配  | 慢(需归零)    | 一致性好    | FT/关键业务 |
| Thin       | 按需分配  | 极快            | 写入略有开销 | 开发测试    |
+------------+----------+----------------+------------+------------+

VMFS 锁机制详解

VMFS 使用多层锁机制确保集群环境中数据的一致性:

1. 物理锁(SCSI Reservation): 当某个 ESXi 主机需要对整个 VMFS 卷进行元数据操作(如创建/删除文件、扩展卷)时,会通过 SCSI-3 PR 机制锁定卷。此锁定对整个卷施加,其他主机的元数据操作将会等待。

2. 逻辑锁(文件级锁): VMFS 支持更细粒度的文件级锁,允许多个主机同时读写不同的文件。锁使用 SCSI ATS(Atomic Test and Set)命令实现,比 SCSI Reservation 更加轻量级,不会影响其他主机的正常 I/O。

3. 心跳检测: 每个挂载 VMFS 卷的 ESXi 主机定期(默认每 10 秒)更新其心跳信息,向 VMFS 卷写入自己的 Heartbeat 区域。如果某个主机关闭或崩溃,其他主机通过检测心跳超时(通常 40-60 秒无心跳)来判断该主机已离线,然后清理其持有的锁。

了解锁机制对于排查存储故障至关重要。常见的锁超时问题包括:

  • SCSI Reservation 冲突导致 10-30 秒的 I/O 暂停
  • 主机崩溃后锁清理延迟
  • 存储阵列复制过程中的锁状态同步问题

外部存储协议:iSCSI 与 NFS

iSCSI 架构与原理

iSCSI(Internet Small Computer System Interface)是通过 TCP/IP 网络传输 SCSI 命令和数据的协议。它将 SAN 的功能扩展到 IP 网络,允许 ESXi 主机通过标准以太网连接到远程存储设备(iSCSI 目标)。

核心组件

  1. Initiator(发起端):ESXi 主机上的 iSCSI 适配器,负责发起 SCSI 命令和传输数据
  2. Target(目标端):存储设备上的 iSCSI 服务,接收和处理 SCSI 命令
  3. IQN(iSCSI Qualified Name):每个 iSCSI 节点的唯一标识符,格式如 iqn.2026-05.com.storage:target1
  4. Portal(门户):目标的网络端点(IP:Port 组合),默认端口 3260
  5. Session(会话):发起端和目标之间的逻辑连接,可包含多个 TCP 连接用于冗余

ESXi 中的 iSCSI 实现方式

实现类型 描述 性能 特点
软件 iSCSI(Software iSCSI) ESXi 内置的软件发起端,使用标准网卡 中等 低成本、无需专用硬件、依赖 CPU
硬件 iSCSI(依赖 NIC) 使用具有 iSCSI 卸载能力的普通网卡 减少 CPU 使用、需要兼容网卡
硬件 iSCSI(HBA) 专用 iSCSI HBA 卡 最高 完全卸载、最佳性能、成本高

NFS 架构与原理

NFS(Network File System)是一种分布式文件系统协议,允许 ESXi 主机通过网络挂载远程文件系统作为数据存储。VMware 支持 NFS v3 和 NFS v4.1 协议。

NFS v3 vs NFS v4.1

特性 NFS v3 NFS v4.1
协议层次 无状态 有状态
锁定机制 独立锁管理(NLM) 内置锁(内嵌)
Kerberos 认证 有限 原生支持
多路径 不支持原生 支持 Session Trunking
性能 成熟稳定 有状态开销略高
兼容性 几乎所有 NAS 设备 较新设备支持

NFS 在虚拟化中的最佳实践

  • 始终使用硬挂载(Hard Mount)以确保虚拟机不会被 I/O 错误永久阻塞
  • 设置适当的超时值(通常 30-60 秒)
  • 对于 NFS v3,确保 NAS 设备支持 NLM(Network Lock Manager)
  • 对于 NFS v4.1,启用 Session Trunking 以提高吞吐量

vSAN 超融合架构

vSAN 设计原理

VMware vSAN(Virtual Storage Area Network)是 VMware 的软件定义存储(SDS)解决方案,它将 ESXi 主机的本地磁盘聚合成一个分布式共享存储池。vSAN 是超融合基础设施(HCI)的核心组件,将计算和存储融合在同一组服务器中。

vSAN 的核心概念

磁盘组(Disk Group): 每个参与 vSAN 的 ESXi 主机可以包含 1-5 个磁盘组。每个磁盘组由一个缓存设备(通常为 NVMe 或 SSD,提供读写缓存)和 1-7 个容量设备(HDD 或大容量 SSD)组成。一个主机支持最多 5 个磁盘组,每个磁盘组最多 7 个容量磁盘。

TEXT
                   ESXi 主机 (vSAN 节点)
+------------------------------------------------+
|  磁盘组 1                      磁盘组 2         |
|  +----------+  +----------+   +----------+     |
|  | 缓存设备  |  | 容量设备  |   | 缓存设备  |     |
|  | NVMe 400G|  | HDD 4TB  |   | SSD 800G |     |
|  +----------+  | HDD 4TB  |   +----------+     |
|                | HDD 4TB  |                     |
|                +----------+                     |
+------------------------------------------------+

存储策略(Storage Policy): vSAN 使用存储策略来控制虚拟机数据的放置和保护级别。策略基于几个关键参数:

  • FTT(Failures to Tolerate):可以容忍的故障数,决定了副本数(副本数 = FTT + 1)

    • FTT=1:3 个副本(或 RAID-5/6 的纠删码),可容忍 1 个主机/磁盘故障
    • FTT=2:5 个副本(或 RAID-6 纠删码),可容忍 2 个主机/磁盘故障
  • Stripe Width(条带宽度):每个对象的条带数,值越大性能越好但消耗更多资源

  • Object Space Reservation(预留空间):类似厚置备的比例

  • Force Provisioning(强制置备):即使资源不足也允许部署

存储类型(Storage Type)

策略类型 FTT 最小主机数 空间效率
RAID-1 (镜像) 1 3 33% (3 副本)
RAID-1 (镜像) 2 5 20% (5 副本)
RAID-5 纠删码 1 4 75%
RAID-6 纠删码 2 6 ~67%

vSAN 组件与对象模型

vSAN 采用对象存储模型。每个 VMDK 文件、VM 配置文件和快照差异盘都被视为一个对象(Object)。对象的组件分布在集群内的不同主机上,实现数据保护和负载均衡。

对象类型

  • VM Home Object:包含 VM 的配置文件(VMX、NVRAM、日志等)
  • VMDK Object:虚拟磁盘文件
  • Swap Object:虚拟机交换文件
  • Memory Object:虚拟机挂起时的内存快照

组件(Component): 每个对象由多个组件组成,这些组件分布在不同的 ESXi 主机和磁盘上。例如,一个 FTT=1 的 VMDK 对象包含:

  • 1 个主副本(RAID-1 副本 A)
  • 1 个从副本(RAID-1 副本 B)
  • 1 个见证组件(Witness,用于仲裁)

见证组件只有元数据,占用极小空间(通常 2MB),用于在主机故障时提供仲裁。

数据放置过程: 当虚拟机被部署到 vSAN 数据存储上时:

  1. vCenter 根据 VM 的存储策略计算对象的放置方案
  2. 对象的组件被分布到不同的主机上(确保满足 FTT 要求)
  3. 写入数据时,同步复制到所有副本(RAID-1 模式)或写入数据和校验码(EC 模式)
  4. 读取时优先从最近/最优的副本获取数据

存储多路径(MPIO)

MPIO 的工作原理

存储多路径(Multipath I/O)是 ESXi 的一项重要功能,它允许主机通过多个物理路径访问同一个存储 LUN,提供路径冗余和负载均衡能力。

路径类型

协议 典型路径数 冗余机制
光纤通道 (FC) 2-8 双 HBA、双 FC 交换机
iSCSI 2-8 双网卡、双 IP 网络
SAS 2-4 双控制器、SAS 线缆

路径策略(Path Selection Policy, PSP)

策略 描述 适用场景
VMW_PSP_FIXED 固定路径,默认使用指定路径,故障时切换到备用路径 FC-SAN、简单环境
VMW_PSP_MRU 使用最近使用(Most Recently Used)的路径 主动-被动阵列
VMW_PSP_RR 轮询(Round Robin),在所有活动路径间分配 I/O 主动-主动阵列、最佳性能

SATP(Storage Array Type Plugin)

SATP 是 ESXi 存储栈中的另一层次,负责处理特定存储阵列的特性。vSphere 预置了大量主流存储阵列的 SATP:

TEXT
常见 SATP 列表:
- VMW_SATP_ALUA: 支持 ALUA(非对称逻辑单元访问)的阵列
- VMW_SATP_SYMM: 对称存储阵列(如 Dell EMC 部分型号)
- VMW_SATP_CX: NetApp 存储系统
- VMW_SATP_INTERNALL: 本地内部存储
- VMW_SATP_DEFAULT_AA: 默认的主动-主动阵列

ALUA(Asymmetric Logical Unit Access)

ALUA 是一种存储阵列优化技术,允许 ESXi 识别存储控制器的工作模式。支持的阵列可以告诉 ESXi 哪个路径是最优路径(经过活动控制器)和次优路径(经过备用控制器):

TEXT
+-------------------+          +-------------------+
|  ESXi 主机        |          |  ESXi 主机         |
|  HBA 0    HBA 1   |          |  HBA 0    HBA 1    |
+---+--------+------+          +---+--------+------+
    |        |                      |        |
+---+--------+------+          +---+--------+------+
| FC Switch A        |          | FC Switch B       |
+---+--------+------+          +---+--------+------+
    |        |                      |        |
+---+--------+----------------------+--------+------+
| 存储控制器 A(活动)   |  存储控制器 B(备用)   |
|  LUN 1(最优通过A)    |  LUN 1(次优通过B)      |
+------------------------+-------------------------+

通过 ALUA,ESXi 能够智能地将 I/O 导向最优路径,同时在最优路径故障时自动切换到次优路径。

存储 I/O 控制(SIOC)

SIOC(Storage I/O Control)是 vSphere 集群级别的一项高级功能,用于在虚拟机之间公平分配存储 I/O 资源,防止某个虚拟机占用过多 I/O 带宽而影响其他虚拟机的性能。

工作原理

  1. SIOC 在 vCenter 集群级别启用(需要 Enterprise Plus 许可)
  2. SIOC 监控数据存储的 I/O 延迟
  3. 当延迟超过预设阈值时(默认 30ms),SIOC 开始对虚拟机的 I/O 进行排队和调度
  4. SIOC 使用虚拟机上的存储 I/O 份额(Shares)和限制(Limit)来确定每个虚拟机的 I/O 优先级

关键参数

  • 延迟阈值(Latency Threshold):触发 SIOC 的存储延迟值(毫秒)
  • 虚拟机存储份额:相对 I/O 优先级(低=500、正常=1000、高=2000)
  • 存储 I/O 限制:最大 IOPS 限制

SIOC 特别适合 FC-SAN 和 iSCSI 共享存储环境,但在本地存储上效果有限。

实战操作

实验环境准备

拓扑结构

本实验环境以 VMware Workstation Pro 17 为基础平台,在两台 ESXi 虚拟机中嵌套部署存储实验环境。

TEXT
+----------------------------------------------------------------+
|                   物理宿主操作系统                                |
|            (VMware Workstation Pro 17.5 / Fusion 13)            |
|                                                                 |
|  +-------------------+  +-------------------+                    |
|  | ESXi-01           |  | ESXi-02           |                    |
|  | 管理: 192.168.1.10|  | 管理: 192.168.1.11|                    |
|  | VM Network        |  | VM Network        |                    |
|  | 存储网: 10.0.1.10 |  | 存储网: 10.0.1.11 |                    |
|  +--------+----------+  +--------+----------+                    |
|           |                       |                              |
|           +-----------+-----------+                              |
|                       |                                          |
|            +----------+----------+                               |
|            | vCenter Server      |                               |
|            | 192.168.1.20        |                               |
|            | SSO: vsphere.local  |                               |
|            +----------+----------+                               |
|                       |                                          |
|  +--------------------+--------------------+                      |
|  |                                         |                    |
|  +-------------------+  +-------------------+                    |
|  | NAS 存储           |  | iSCSI 目标         |                   |
|  | (NFS)             |  | (Openfiler/SCST)   |                   |
|  | 192.168.1.30      |  | 192.168.1.31       |                   |
|  +-------------------+  +-------------------+                    |
|                                                                 |
|  ESXi-01 本地磁盘: 2×100GB HDD (模拟), 1×50GB SSD (缓存)         |
|  ESXi-02 本地磁盘: 2×100GB HDD (模拟), 1×50GB SSD (缓存)         |
+----------------------------------------------------------------+

网络规划

网络 VLAN 网段 用途
管理网络 VLAN 10 192.168.1.0/24 ESXi 管理、vCenter
VM 网络 VLAN 20 192.168.20.0/24 虚拟机业务
存储网络 VLAN 30 10.0.1.0/24 iSCSI/NFS 存储流量
vMotion 网络 VLAN 40 10.0.2.0/24 vMotion 迁移

前提条件

  1. ESXi 8.0 Update 3 已安装在 2 台及以上主机上
  2. vCenter Server 8.0 已部署并配置
  3. 存储设备(NAS/iSCSI 目标)已准备就绪
  4. ESXi 主机已添加到 vCenter 并形成集群
  5. ESXi SSH 服务已启用用于远程命令行操作

实战一:创建和管理 VMFS 数据存储

创建 VMFS 数据存储

场景 1:基于本地磁盘创建 VMFS 6 数据存储

通过 vSphere Client 操作:

  1. 登录 vSphere Client (https://192.168.1.20/ui)
  2. 导航到 ESXi-01 → 配置 → 存储 → 新建数据存储
  3. 选择 "创建 VMFS 数据存储"
  4. 指定数据存储名称:datastore-local-01
  5. 选择物理磁盘设备(如:Local VMware Disk)
  6. 选择 VMFS 版本:VMFS 6
  7. 分区方案:使用全部可用空间
  8. 指定块大小(Block Size):默认 1MB
  9. 完成创建

通过命令行(ESXi Shell/SSH)创建:

bash
# 1. 查看所有可用的磁盘设备
esxcli storage core device list | grep -E "Display Name|Device"

# 2. 查看特定磁盘的详细信息
esxcli storage core device list -d naa.xxxxxxxxxxxxxxxx

# 3. 使用 vmkfstools 创建 VMFS 6 数据存储
# 语法: vmkfstools -C vmfs6 -S <datastore_name> <device_path>
vmkfstools -C vmfs6 -S datastore-local-01 /dev/disks/naa.xxxxxxxxxxxxxxxx

# 输出示例:
# Creating vmfs6 filesystem on "naa.xxxxxxxxxxxxxxxx" with blockSize 1048576, \
# unmapGranularity 1048576, capacity "100.0 GB", volume label "datastore-local-01".

# 4. 验证 VMFS 数据存储已挂载
df -h | grep datastore

# 输出示例:
# /vmfs/volumes/datastore-local-01   100.0G   32.0M   99.9G    0% /vmfs/volumes/datastore-local-01

扩展 VMFS 数据存储

场景 2:数据存储空间不足时在线扩展

bash
# 1. 假设原始的 LUN 从 100GB 扩展到 200GB
# 首先需要存储端扩展 LUN 大小

# 2. 在 ESXi 上重新扫描存储适配器以检测新的容量
esxcli storage core adapter rescan --all

# 3. 查看扩展后的设备容量
esxcli storage core device list -d naa.xxxxxxxxxxxxxxxx

# 4. 使用 vmkfstools 扩展 VMFS 卷
vmkfstools -X 200G /vmfs/volumes/datastore-local-01
# 或扩展到全部可用空间(推荐):
vmkfstools --growfs /vmfs/volumes/datastore-local-01

# 5. 验证扩展结果
df -h | grep datastore-local-01
# 应显示从 100G 变为 200G

通过 vSphere Client 扩展

  1. 导航到数据存储 → datastore-local-01 → 操作 → 属性
  2. 点击 "增加"(Increase)
  3. 选择可用的新空间或手动输入扩展大小
  4. 点击确定完成扩展

使用 VMFS 高级功能

场景 3:启用精简置备回收(UNMAP)

VMFS 6 默认启用自动 UNMAP,但也可以手动触发:

bash
# 查看 UNMAP 状态
esxcli storage filesystem list | grep vmfs

# 手动触发 UNMAP(VMFS 6)
esxcli storage vmfs unmap -l datastore-local-01 -n 100

# 参数说明:
# -l: 数据存储标签或 UUID
# -n: 每次回收的最大块数(默认 100,越大回收越快但 I/O 影响越大)

# 针对 VMFS 5 的 UNMAP(需手动执行)
esxcli storage vmfs unmap -l datastore-local-01 --reclaim-unit=vmfs5 -n 100

# 查看 UNMAP 进度
esxcli storage vmfs unmap-status list

实战二:配置 iSCSI 存储连接

配置软件 iSCSI 适配器

步骤 1:启用软件 iSCSI 适配器

通过 vSphere Client:

  1. 选择 ESXi-01 → 配置 → 存储适配器 → 添加软件 iSCSI 适配器
  2. 点击 "确认" 启用

通过命令行:

bash
# 启用软件 iSCSI 适配器
esxcli iscsi software set --enabled=true

# 确认适配器已创建
esxcli iscsi adapter list
# 输出示例:
# Adapter     Driver      State   UID                   Description
# ----------  ----------  ------  --------------------  --------------------
# vmhba64     iscsi_sw    online  iscsi.vmhba64         iSCSI Software Adapter

# 查看适配器详细信息
esxcli iscsi adapter get --adapter=vmhba64

步骤 2:配置 iSCSI 发起程序名称(IQN)

bash
# 查看当前 IQN
esxcli iscsi adapter get --adapter=vmhba64 | grep iqn

# 设置自定义 IQN(可选,默认为自动生成)
esxcli iscsi adapter set --adapter=vmhba64 \
  --name="iqn.2026-05.local.vmware:esxi-01"

# 输出示例:
# Setting iqn name succeeded for adapter vmhba64

步骤 3:添加 iSCSI 目标门户和发现地址

bash
# 添加 iSCSI 目标门户(存储服务器 IP 和端口)
esxcli iscsi adapter target portal add \
  --adapter=vmhba64 \
  --address=192.168.1.31 \
  --port=3260

# 添加特定目标的静态发现(可选,替代 SendTargets)
esxcli iscsi adapter target add \
  --adapter=vmhba64 \
  --target="iqn.2026-05.com.storage:esxi-datastore"

# 重新扫描适配器以发现 LUN
esxcli storage core adapter rescan --adapter=vmhba64

步骤 4:配置 CHAP 认证(可选但推荐)

bash
# 启用单向 CHAP
esxcli iscsi adapter auth chap set \
  --adapter=vmhba64 \
  --direction=uni \
  --chap_name="esxi-01-chap-user" \
  --chap_secret="secure_chap_password123"

# 启用双向 CHAP(需要存储端也配置)
esxcli iscsi adapter auth chap set \
  --adapter=vmhba64 \
  --direction=mutual \
  --chap_name="esxi-01-chap-user" \
  --chap_secret="secure_chap_password123" \
  --chap_target_in="storage-target-secret" \
  --chap_target_out="storage-target-secret"

步骤 5:在 iSCSI LUN 上创建 VMFS 数据存储

bash
# 查看发现的存储设备
esxcli storage core device list | grep -A 5 "iSCSI\|naa."

# 在发现的 iSCSI 设备上创建 VMFS 数据存储
vmkfstools -C vmfs6 -S datastore-iscsi-01 /dev/disks/naa.xxxxxxxxxxxxxxxx

# 确认挂载
df -h | grep datastore-iscsi

配置 iSCSI 多路径(MPIO)

bash
# 查看 LUN 的可用路径
esxcli storage nmp device list -d naa.xxxxxxxxxxxxxxxx

# 输出中包含的关键信息:
# - Storage Array Type: VMW_SATP_DEFAULT_AA
# - Path Selection Policy: VMW_PSP_FIXED
# - Working Paths: vmhba64:C0:T0:L0, vmhba64:C1:T0:L0

# 将路径策略改为轮询(Round Robin)以启用负载均衡
esxcli storage nmp psp roundrobin deviceconfig set \
  --device=naa.xxxxxxxxxxxxxxxx \
  --type=iops \
  --iops=1

# 参数说明:
# --type=iops: 每 1 个 I/O 操作后切换路径
# 也可以使用 --type=bytes 和 --bytes=1048576(每 1MB 切换)

# 验证路径策略变更
esxcli storage nmp device list -d naa.xxxxxxxxxxxxxxxx | grep "Path Selection"

# 查看所有路径的实时状态
esxcli storage nmp path list --device=naa.xxxxxxxxxxxxxxxx

# 输出示例:
#  vmhba64:C0:T0:L0
#     Runtime Name: vmhba64:C0:T0:L0
#     Device: naa.xxxxxxxxxxxxxxxx
#     Path State: active
#     Transport: iscsi
#  vmhba64:C1:T0:L0
#     Runtime Name: vmhba64:C1:T0:L0
#     Device: naa.xxxxxxxxxxxxxxxx
#     Path State: active
#     Transport: iscsi

# 设置 SATP 的故障切换策略
esxcli storage nmp satp set \
  --satp=VMW_SATP_DEFAULT_AA \
  --default-psp=VMW_PSP_RR

实战三:配置 NFS 数据存储

ESXi 存储接入路径

图中把块存储、文件存储和 vSAN 的接入路径放在一起:iSCSI/FC 先发现 LUN 再创建 VMFS,NFS 直接挂载 NAS 导出,vSAN 则通过本地磁盘和策略形成共享数据存储。

挂载 NFS v3 数据存储

通过 vSphere Client 操作

  1. 选择 ESXi-01 → 配置 → 存储 → 新建数据存储
  2. 选择 "挂载 NFS 数据存储"
  3. 选择 NFS 版本:NFS v3
  4. 配置参数:
    • 数据存储名称:nfs-datastore-01
    • NFS 服务器:192.168.1.30
    • NFS 共享路径:/export/nfs/vmware
  5. 完成挂载

通过命令行挂载 NFS

bash
# 1. 测试 NFS 服务器连通性
ping 192.168.1.30

# 2. 查看 NFS 服务器导出的共享
showmount -e 192.168.1.30
# 输出示例:
# Export list for 192.168.1.30:
# /export/nfs/vmware  *
# /export/iso         *

# 3. 挂载 NFS 数据存储(方法一:使用 esxcli)
esxcli storage nfs add \
  --host=192.168.1.30 \
  --share=/export/nfs/vmware \
  --volume-name=nfs-datastore-01

# 4. 挂载 NFS 数据存储(方法二:直接添加到 /etc/fstab 对应的 VM 配置文件)
# 不过 esxcli 是推荐方式

# 5. 验证挂载
df -h | grep nfs
# 输出示例:
# 192.168.1.30:/export/nfs/vmware   1.0T   200G   800G  20% /vmfs/volumes/nfs-datastore-01

# 6. 列出所有 NFS 数据存储
esxcli storage nfs list
# 输出示例:
# Volume Name    Host            Share                      Accessible  Mounted
# -------------  --------------  -------------------------  ----------  -------
# nfs-datastore  192.168.1.30    /export/nfs/vmware         true        true

挂载 NFS v4.1 数据存储

NFS v4.1 比 v3 提供了更好的锁定机制和 Kerberos 认证支持。在 vSphere 8.0 中,NFS v4.1 的配置需要额外的安全设置。

bash
# 挂载 NFS v4.1 数据存储
esxcli storage nfs add \
  --host=192.168.1.30 \
  --share=/export/nfs/vmware4 \
  --volume-name=nfs4-datastore-01 \
  --nfs-version=41

# 启用 Kerberos 认证(需要配置 KDC)
esxcli storage nfs add \
  --host=192.168.1.30 \
  --share=/export/nfs/secure-vmware \
  --volume-name=nfs4-secure \
  --nfs-version=41 \
  --sec-type=krb5p

# 查看 NFS v4.1 连接状态
esxcli storage nfs v41 status

配置 NFS 高级选项

bash
# 设置 NFS 挂载选项(需要在 /etc/vmware/esx.conf 中设置)
# 但对于特定操作,可以直接通过 esxcli 调整

# 设置 NFS 超时值(默认 30 秒)
# 适用于大 I/O 场景或高延迟网络
vim-cmd hostsvc/advopt/update "NFS.MountTimeout" "int" 60

# 设置 NFS 读取/写入缓冲区大小(默认 1024KB)
vim-cmd hostsvc/advopt/update "NFS.MaxVolumes" "int" 8

# 查看当前 NFS 高级参数
esxcfg-advcfg -l | grep -i nfs

# 设置 NFS 最大队列深度(默认 64,SSD 后端建议 128)
esxcfg-advcfg -s 128 /NFS/MaxQueueDepth

# 设置 NFS 心跳间隔(默认 12 秒,高延迟网络可调大)
esxcfg-advcfg -s 20 /NFS/HeartbeatFrequency

# 设置 NFS 心跳超时(默认 180 秒)
esxcfg-advcfg -s 300 /NFS/HeartbeatTimeout

# 注意:上述高级参数修改会影响所有 NFS 数据存储,需谨慎操作

实战四:配置 vSAN 集群

环境准备

vSAN 集群的最低配置要求:

  • 最少 3 个 ESXi 主机(推荐 4+ 以获得更好的性能和灵活性)
  • 每个主机至少 1 个缓存设备(SSD/NVMe)和 1 个容量设备(HDD/SSD)
  • 所有主机配置为相同的网络模式
  • 所有主机已添加到同一个 vCenter 集群
bash
# 在每个 ESXi 主机上验证磁盘设备
esxcli storage core device list | grep -E "Display Name|Is SSD|Device Type"

# 确认缓存设备标记为 SSD
esxcli storage core device list -d <device_id> | grep "Is SSD"
# 如果是 SSD 但显示 false,可用以下命令强制标记:
esxcli storage core device setconfig -d <device_id> --mark-as-ssd=true

# 确认 vSAN 支持磁盘
esxcli vsan storage list

启用 vSAN 服务

通过 vSphere Client 启用

  1. 导航到集群 → 配置 → vSAN → 服务
  2. 点击 "配置" 启用 vSAN
  3. 选择 "将 vSAN 与此集群绑定"
  4. 配置网络(vmkernel 接口用于 vSAN 流量)

通过命令行启用

bash
# 1. 在每个主机上创建 vSAN 所需的 vmkernel 适配器
# (如果在 vCenter 中使用集群级别的配置,此步骤可省略)

# 2. 在集群上启用 vSAN
# 需要连接到 vCenter 的 Shell 或通过 PowerCLI

# 通过 PowerCLI 启用 vSAN(在管理节点上执行)
# Connect-VIServer 192.168.1.20
# Get-Cluster "VSAN-Cluster" | Set-Cluster -VsanEnabled:$true

声明磁盘为 vSAN 使用

bash
# 查看 vSAN 可用的磁盘
esxcli vsan storage list
# 输出示例:
# Device: naa.xxxxxxxxxxxx1
#    Display Name: Local VMware Disk1 (naa.xxxxxxxxxxxx1)
#    Size: 100.0 GB
#    Is SSD: true
#    Is Capacity Flash: false
#    Is Local: true
#    VSAN Info:
#       UUID:
#       Decommission State: none
#       State: eligible for use

# 将磁盘添加到 vSAN 磁盘组
# 注意:以下命令需要指定缓存和容量设备
esxcli vsan storage add \
  --disks="<cache_disk_device_id>" \
  --storage-type=hybrid

# 添加多个容量设备到一个组
esxcli vsan storage add \
  --disks="<cache_disk_device_id>" \
  --data-disks="<capacity_disk1>,<capacity_disk2>" \
  --storage-type=hybrid

# 添加全闪存磁盘组
esxcli vsan storage add \
  --disks="<cache_ssd>" \
  --data-disks="<capacity_ssd1>,<capacity_ssd2>" \
  --storage-type=allflash

# 查看已声明的 vSAN 磁盘
esxcli vsan storage list | grep -A 10 "VSAN Info"

创建和配置 vSAN 存储策略

通过 vSphere Client 创建存储策略:

  1. 导航到策略和配置文件 → VM 存储策略 → 创建
  2. 策略名称:Gold-SSD-Mirror
  3. 在 vSAN 规则部分配置:
    • 站点容错:无(单站点)
    • 容错方法:RAID-1(镜像)- 性能最佳
    • 允许的故障数:FTT=1(可容忍 1 个故障)
    • 条带宽度:2(条带化,提高并行 I/O 性能)
    • 禁用对象校验和:否
    • 强制置备:否
  4. 检查兼容性 → 完成创建

通过命令行创建(使用 PowerCLI 或 API):

powershell
# PowerCLI 创建存储策略示例
$policySpec = New-SpbmStoragePolicy -Name "Gold-SSD-Mirror" -Description "Gold tier with mirroring"
$capability = Get-SpbmCapability -Name "VSAN.hostFailuresToTolerate"
$policyRule = New-SpbmRule -Capability $capability -Value 1
$policySpec | Add-SpbmRule -Rule $policyRule

$capability2 = Get-SpbmCapability -Name "VSAN.stripeWidth"
$policyRule2 = New-SpbmRule -Capability $capability2 -Value 2
$policySpec | Add-SpbmRule -Rule $policyRule2

将 VM 部署到 vSAN 存储

bash
# 创建虚拟机并指定存储策略
# 方法:在 vSphere Client 中创建虚拟机时,在"选择存储"步骤
# 选择 vSAN 数据存储,然后应用创建好的 "Gold-SSD-Mirror" 策略

# 使用命令行检查 vSAN 对象的合规状态
# 确保所有对象显示 "Compliant"

实战五:存储 I/O 控制(SIOC)配置

bash
# 1. 在 vCenter 集群级别启用 SIOC
# 导航到集群 → 配置 → 服务 → 启用 Storage I/O Control

# 2. 设置数据存储的延迟阈值
# 对于 NVMe/SSD 后端:5-10ms
# 对于 SAS HDD 后端:15-30ms
# 对于 SATA HDD 后端:30-50ms

# 3. 为关键虚拟机设置更高的存储份额
# 在虚拟机配置 → 编辑设置 → VM 存储策略
# 份额类型:自定义
# IOPS 份额:2000(高优先级)

# 4. 查看 SIOC 统计信息
esxtop -b -d 2 | grep -i "sioc\|storage"
# 或在 esxtop 中按 u 进入磁盘视图查看各数据存储的延迟

# 5. 检查 SIOC 状态
esxcli storage vmfs sioc status --volume-path=/vmfs/volumes/datastore-local-01

实战六:存储性能监控与诊断

bash
# 1. 使用 esxtop 监控存储性能
# 运行 esxtop,然后按 u 进入磁盘适配器视图
esxtop

# 在 esxtop 磁盘视图中关注的关键指标:
# NMLRD/s: 每秒读命令数
# NMWRT/s: 每秒写命令数
# QUED: 当前队列深度
# DAVG/cmd: 设备平均延迟(ms)
# KAVG/cmd: VMkernel 平均延迟(ms)
# GAVG/cmd: 客户机平均延迟(ms)

# 2. 使用 vscsiStats 分析虚拟磁盘性能
vscsiStats -l
# 列出所有正在运行虚拟机的虚拟 SCSI 设备

# 查看特定虚拟机的 I/O 延迟分布
vscsiStats -w <world_id> -i 1

# 3. 使用 esxcli 收集存储统计信息
esxcli storage core device stats get -d <device_id>
# LATENCY: 平均 I/O 延迟(微秒)
# QUEUED: 当前队列中的 I/O 数
# COMMANDS: 累计命令数

# 4. 查看存储路径延迟
esxcli storage nmp path list --device <device_id>
# 关注 Path State 应为 active,若有 dead 表示路径故障

# 5. 生成存储配置报告
esxcli storage core device list > /tmp/storage_devices.txt
esxcli storage nmp device list > /tmp/nmp_devices.txt
esxcli storage vmfs extent list > /tmp/vmfs_extents.txt

配置示例

示例 1:完整 iSCSI 目标配置脚本

以下是一个完整的 ESXi iSCSI 初始化配置脚本,可自动完成 iSCSI 适配器配置:

bash
#!/bin/bash
# 文件名:configure_iscsi.sh
# 用途:ESXi 软件 iSCSI 适配器自动配置脚本
# 使用:在 ESXi Shell 中 sh configure_iscsi.sh

# 配置参数
ISCSI_IP="192.168.1.31"
ISCSI_PORT="3260"
ISCSI_TARGET="iqn.2026-05.com.storage:esxi-datastore"
CHAP_USER="vmware-storage"
CHAP_PASS="StrongCHAPpass2026!"
VMFS_NAME="datastore-iscsi-production"

echo "=== ESXi iSCSI 配置脚本开始 ==="

# 步骤 1:启用软件 iSCSI 适配器
echo "[1/5] 启用软件 iSCSI 适配器..."
esxcli iscsi software set --enabled=true

# 等待适配器创建
sleep 2

# 获取适配器名称
ADAPTER=$(esxcli iscsi adapter list | grep "iscsi_sw" | awk '{print $1}')
echo "   检测到 iSCSI 适配器: $ADAPTER"

# 步骤 2:配置 CHAP 认证
echo "[2/5] 配置 CHAP 认证..."
esxcli iscsi adapter auth chap set \
    --adapter=$ADAPTER \
    --direction=uni \
    --chap_name="$CHAP_USER" \
    --chap_secret="$CHAP_PASS"

# 步骤 3:添加目标门户
echo "[3/5] 添加 iSCSI 目标门户 ${ISCSI_IP}:${ISCSI_PORT}..."
esxcli iscsi adapter target portal add \
    --adapter=$ADAPTER \
    --address=$ISCSI_IP \
    --port=$ISCSI_PORT

# 步骤 4:添加静态目标
echo "[4/5] 添加 iSCSI 目标 ${ISCSI_TARGET}..."
esxcli iscsi adapter target add \
    --adapter=$ADAPTER \
    --target="$ISCSI_TARGET"

# 步骤 5:重新扫描适配器
echo "[5/5] 重新扫描存储适配器..."
esxcli storage core adapter rescan --adapter=$ADAPTER

echo "=== iSCSI 适配器配置完成 ==="
echo ""
echo "查找到的 iSCSI 存储设备:"
esxcli storage core device list | grep -B 1 -A 5 "iSCSI\|naa."

echo ""
echo "是否在发现的 LUN 上创建 VMFS 数据存储? (y/n)"
echo "如需创建,请先确认 LUN 的设备 ID"

echo ""
echo "=== 配置完成 ==="

示例 2:存储多路径策略配置

bash
#!/bin/bash
# 文件名:configure_mpio.sh
# 用途:配置特定存储 LUN 的多路径策略

# 参数:设备 ID
DEVICE="$1"
PSP="${2:-VMW_PSP_RR}"

if [ -z "$DEVICE" ]; then
    echo "用法: $0 <device_id> [psp_policy]"
    echo "   device_id: 存储设备 ID (naa.xxx)"
    echo "   psp_policy: VMW_PSP_FIXED | VMW_PSP_MRU | VMW_PSP_RR (默认)"
    exit 1
fi

echo "配置设备 $DEVICE 的多路径策略为: $PSP"

# 检查设备是否存在
esxcli storage core device list -d "$DEVICE" > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "错误:设备 $DEVICE 不存在"
    exit 1
fi

# 获取当前路径数
PATH_COUNT=$(esxcli storage nmp path list --device "$DEVICE" | grep -c "Runtime Name")
echo "当前路径数: $PATH_COUNT"

if [ "$PATH_COUNT" -lt 2 ]; then
    echo "警告:只有 $PATH_COUNT 条路径,多路径配置效果有限"
fi

# 设置 PSP
case "$PSP" in
    VMW_PSP_RR)
        esxcli storage nmp psp roundrobin deviceconfig set \
            --device="$DEVICE" \
            --type=iops \
            --iops=1
        echo "PSP 已设为 Round Robin(每 1 IOPS 切换)"
        ;;
    VMW_PSP_FIXED)
        esxcli storage nmp psp fixed deviceconfig set \
            --device="$DEVICE" \
            --preferred=vmhba64:C0:T0:L0
        echo "PSP 已设为 Fixed(优先路径: vmhba64:C0:T0:L0)"
        ;;
    VMW_PSP_MRU)
        esxcli storage nmp psp mru deviceconfig set \
            --device="$DEVICE"
        echo "PSP 已设为 MRU(最近使用的路径)"
        ;;
    *)
        echo "未知的 PSP 策略: $PSP"
        exit 1
        ;;
esac

# 验证配置
echo ""
echo "验证配置:"
esxcli storage nmp device list -d "$DEVICE" | grep -E "Device|PSP|Path Policy|Working Path"

echo ""
echo "所有路径状态:"
esxcli storage nmp path list --device "$DEVICE" | grep -E "Runtime|State"

示例 3:vSAN 故障诊断脚本

bash
#!/bin/bash
# 文件名:vsan_health_check.sh
# 用途:vSAN 健康状态快速诊断

echo "=========================================="
echo "  vSAN 健康检查报告 - $(date)"
echo "=========================================="

echo ""
echo "--- 1. 集群状态 ---"
esxcli vsan cluster get 2>/dev/null || echo "vSAN 未在此主机上启用"

echo ""
echo "--- 2. 各主机存储使用 ---"
for host in $(esxcli vsan cluster get 2>/dev/null | grep Member | awk '{print $2}'); do
    echo "主机: $host"
    esxcli vsan storage usage -t $host 2>/dev/null
done

echo ""
echo "--- 3. 磁盘组状态 ---"
esxcli vsan storage list | grep -E "Device:|State:|VSAN Info|Is SSD|Disk Group"

echo ""
echo "--- 4. vSAN 对象健康 ---"
# 获取 vSAN 对象统计(需在 vCenter 环境)
# 命令行模式下可用以下命令
python3 -c "
import json, subprocess
result = subprocess.run(['esxcli', 'vsan', 'health', 'summary', 'get'],
    capture_output=True, text=True)
print(result.stdout if result.stdout else '需 vCenter 环境上下文')
" 2>/dev/null

echo ""
echo "--- 5. 网络健康 ---"
esxcli vsan network list 2>/dev/null
ping -c 2 -W 1 192.168.1.11 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "节点间网络通信: 正常"
else
    echo "节点间网络通信: 异常(需要检查)"
fi

echo ""
echo "--- 6. 磁盘空间 ---"
df -h | grep vsan

echo ""
echo "=========================================="
echo "  诊断完成"
echo "=========================================="

示例 4:ESXi 自动数据存储挂载配置

bash
#!/bin/bash
# 文件名:auto_storage_mount.sh
# 用途:批量挂载 iSCSI LUN 并创建 VMFS 数据存储
# 适合在首次部署时自动配置存储

# 配置
ISCSI_SERVER="192.168.1.31"
ISCSI_PORT="3260"
NFS_SERVER="192.168.1.30"

# 1. 配置 iSCSI
echo "=== 配置 iSCSI 存储 ==="
esxcli iscsi software set --enabled=true
sleep 2
ADAPTER=$(esxcli iscsi adapter list | grep "iscsi_sw" | awk '{print $1}')

# 批量添加目标门户
for portal in "192.168.1.31" "192.168.1.32"; do
    esxcli iscsi adapter target portal add \
        --adapter=$ADAPTER --address=$portal --port=$ISCSI_PORT
done

# 重新扫描
esxcli storage core adapter rescan --adapter=$ADAPTER
sleep 3

# 2. 在发现的 iSCSI 设备上创建数据存储
DEVICES=$(esxcli storage core device list | grep -B 1 "iSCSI" | grep "naa\." | awk '{print $1}')
INDEX=1
for DEVICE in $DEVICES; do
    DS_NAME="datastore-iscsi-$(printf '%02d' $INDEX)"
    echo "创建数据存储: $DS_NAME 于设备 $DEVICE"
    vmkfstools -C vmfs6 -S "$DS_NAME" "/dev/disks/$DEVICE" 2>/dev/null
    INDEX=$((INDEX + 1))
done

# 3. 挂载 NFS 共享
echo "=== 挂载 NFS 数据存储 ==="
esxcli storage nfs add --host=$NFS_SERVER \
    --share=/export/nfs/vmware --volume-name=nfs-datastore-01

echo "=== 存储配置完成 ==="
df -h | grep -E "datastore|nfs"

存储最佳实践总结表

场景 推荐配置 理由
生产数据库(高 IOPS) VMFS 6 + Eager Zeroed + RR 多路径 一致性能、高并发
文件服务器(大文件) NFS v3 + 加大 NFS 缓冲区 大文件顺序读写性能
桌面虚拟化(VDI) vSAN + RAID-5/6 纠删码 + 精简置备 空间效率、成本优化
开发测试 VMFS 6 + Thin Provisioning 灵活、节省空间
关键应用 vSAN FTT=2 镜像或 RAID-6 最高级别的数据保护
备份存储 NFS + 大容量 HDD 成本低、容量大

验证方法

验证 1:VMFS 数据存储完整性验证

bash
# 1. 检查 VMFS 卷的基本信息
vmkfstools -P -v 10 /vmfs/volumes/datastore-local-01
# -P 检查文件系统完整性
# -v 10 详细程度
# 输出应包含卷标签、UUID、版本、容量等信息

# 示例输出:
# VMFS version: 6
# VMFS UUID: xxxxxx-xxxxxxxx-xxxx-xxxxxxxxxxxx
# Capacity: 100.0 GB
# Free: 99.9 GB
# Block Size: 1 MB

# 2. 检查 VMFS 上的文件系统一致性
vmkfstools -x check /vmfs/volumes/datastore-local-01
# 如果输出为 "OK" 表示文件系统正常
# 如果有错误,会显示具体的损坏信息

# 3. 检查 VMFS 扩展的完整性
esxcli storage vmfs extent list
# 验证每个 VMFS 数据存储的扩展数量和状态
# 输出示例:
# Volume Name       Extent Number  Device Name                  Size
# datastore-local-01    0         naa.xxxxxxxxxxxxxxxx1       100.0 GB
# datastore-local-01    2         naa.xxxxxxxxxxxxxxxx2       50.0 GB  (在线添加)

# 4. 验证 VMFS 元数据的正确性
vim-cmd hostsvc/datastore/<datastore_id>/refresh
# 刷新数据存储的元数据,确保缓存一致

验证 2:iSCSI 连接状态验证

bash
# 1. 检查 iSCSI 会话状态
esxcli iscsi session list
# 输出应显示:Status = connected
# 特别注意 Session ID 和目标 IQN 是否匹配

# 详细会话信息:
esxcli iscsi session connection list
# 输出示例:
# Connection ID: 2
# Session ID: iscsi.session-xxxxx
# Status: connected
# Target: iqn.2026-05.com.storage:esxi-datastore
# Target Portal: 192.168.1.31:3260
# CHAP: enabled

# 2. 验证 iSCSI LUN 的可用性
esxcli storage core device list | grep -A 10 "naa.xxxxxxxxxxxxxxxx"
# 确认:
# - Status: on
# - Is Local: off
# - Queue Depth: 64 (或更大,取决于存储阵列配置)
# - SCSI Level: 6

# 3. 验证路径冗余
esxcli storage nmp path list --device naa.xxxxxxxxxxxxxxxx
# 确保每个路径的 State 为 "active"
# 如果某个路径显示 "dead",说明该路径有问题

# 4. 测试故障切换
# 手动禁用一条路径(模拟网络故障)
esxcli storage nmp path set \
  --runtime-name vmhba64:C1:T0:L0 \
  --state disabled
# 验证虚拟机 I/O 是否中断(应该无中断)
# 恢复路径
esxcli storage nmp path set \
  --runtime-name vmhba64:C1:T0:L0 \
  --state active

验证 3:NFS 数据存储验证

bash
# 1. 检查 NFS 挂载状态
esxcli storage nfs list
# 验证所有 NFS 数据存储的 Accessible 字段为 true

# 2. 验证 NFS 性能
# 在 NFS 上创建一个临时文件进行写入测试
dd if=/dev/zero of=/vmfs/volumes/nfs-datastore-01/test_write \
   bs=1M count=1024 conv=fdatasync
# 输出应显示写入速度和耗时
# 示例:1024+0 records in, 1024+0 records out
# 1073741824 bytes (1.1 GB) copied, 10.2345 s, 104.9 MB/s

# 清理测试文件
rm /vmfs/volumes/nfs-datastore-01/test_write

# 3. NFS 锁定测试
# 在主机之间同步创建锁定测试
# 在 ESXi-01 上启动一个 VM(使用 NFS 数据存储)
# 在 ESXi-02 上尝试对同一 VM 进行 vMotion
# 验证 NFS 锁定机制正常工作

# 4. 检查 NFS 协议握手
# 查看 ESXi 与 NAS 之间的 NFS 版本协商
cat /var/log/vmkernel | grep -i nfs | tail -10
# 应显示使用的 NFS 版本(3 或 4.1)

验证 4:vSAN 健康状态验证

bash
# 1. vSAN 集群健康检查
esxcli vsan health summary get
# 输出示例:
# Overall Health: GREEN
# Number of failing components: 0
# Number of re-syncing components: 0

# 2. 检查 vSAN 容量
esxcli vsan storage usage summary
# Usage Summary:
#   Total Capacity: 3.0 TB
#   Used: 1.2 TB (40%)
#   Free: 1.8 TB (60%)
#   Object overhead: 200.0 GB

# 3. 检查对象状态
esxcli vsan debug object list
# 关注 Obj Status 字段,应为 "active"
# 如果显示 "degraded" 或 "absent",需要进一步检查

# 4. vSAN 网络测试
esxcli vsan network test
# 测试 vSAN 节点间的网络延迟和带宽
# 如果延迟 > 5ms 或丢包 > 0%,需要优化网络

# 5. 验证存储策略合规性
# 在 vCenter 中选择 VM → 监控 → vSAN → 对象
# 检查所有对象的 "合规" 状态

验证 5:存储性能基准测试

bash
#!/bin/bash
# 文件名:storage_benchmark.sh
# 用途:对数据存储进行简单性能测试

echo "=== 存储性能基准测试 ==="

# 在目标数据存储上创建测试文件
DS_PATH="/vmfs/volumes/$1"
if [ -z "$1" ]; then
    echo "用法: $0 <datastore_name>"
    echo "可用数据存储:"
    df -h | grep -v "Filesystem" | awk '{print $NF}' | grep -v "^/"
    exit 1
fi

if [ ! -d "$DS_PATH" ]; then
    echo "错误:数据存储 $DS_PATH 不存在"
    exit 1
fi

echo ""
echo "测试数据存储: $DS_PATH"
echo ""

# 顺序写入测试(大块)
echo "--- 顺序写入 (1M 块, 1GB 文件) ---"
time dd if=/dev/zero of="$DS_PATH/bench_write" \
    bs=1M count=1024 conv=fdatasync 2>&1 | grep -E "bytes|copied"
echo ""

# 顺序读取测试(大块)
echo "--- 顺序读取 (1M 块, 1GB 文件) ---"
echo 3 > /proc/sys/vm/drop_caches 2>/dev/null || true
time dd if="$DS_PATH/bench_write" of=/dev/null \
    bs=1M count=1024 2>&1 | grep -E "bytes|copied"
echo ""

# 随机写入测试(小块)
echo "--- 随机写入 (4K 块, 100MB 文件) ---"
time dd if=/dev/urandom of="$DS_PATH/bench_random" \
    bs=4K count=25600 conv=fdatasync 2>&1 | grep -E "bytes|copied"
echo ""

# 清理测试文件
rm -f "$DS_PATH/bench_write" "$DS_PATH/bench_random"

echo "=== 测试完成 ==="
echo "注:以上数据为单线程性能,实际多线程并发性能可能更高。"

常见问题

ESXi 存储排障 Runbook

这张图适合放在存储故障排查前作为总入口:先确认数据存储是否可见和可挂载,再看路径、协议网络、延迟指标、vSAN 对象健康和容量回收。不要只盯着虚拟机报错,底层路径和对象状态往往更关键。

问题 1:ESXi 无法识别 iSCSI LUN

现象:在 ESXi 上配置 iSCSI 后,重新扫描适配器但未发现新 LUN。

可能原因

  1. iSCSI 目标端未正确配置 LUN(LUN 未映射到该发起程序)
  2. CHAP 认证信息不匹配
  3. 网络防火墙阻止了 3260 端口
  4. iSCSI 目标端的 ACL 未允许该发起程序

诊断步骤

bash
# 1. 检查 iSCSI 会话是否建立
esxcli iscsi session list
# 如果无会话,说明 ESXi 无法连接到目标

# 2. 检查目标门户是否可达
nc -zv 192.168.1.31 3260
# 如果端口不通,检查网络连通性

# 3. 检查 CHAP 认证状态
esxcli iscsi adapter auth chap get --adapter=vmhba64

# 4. 检查特定目标的认证状态
esxcli iscsi adapter target list --adapter=vmhba64

# 5. 在 ESXi 日志中查找 iSCSI 错误
grep -i "iscsi.*error\|iscsi.*fail\|iscsi.*auth" /var/log/vmkernel | tail -20

解决方案

  1. 检查存储端的 LUN 映射配置
  2. 确保证 CHAP 用户名和密码在两端一致
  3. 配置存储端 ACL,将 ESXi 的 IQN 加入允许列表
  4. 检查防火墙规则,确保 IP 流量在 3260 端口双向畅通

验证:配置修复后,执行 esxcli storage core adapter rescan --adapter=vmhba64 验证 LUN 出现。

问题 2:VMFS 数据存储显示 "Inaccessible" 或变为只读

现象:vSphere Client 中数据存储显示灰色不可访问状态。

可能原因

  1. 共享存储连接中断(SAN/iSCSI 链路故障)
  2. VMFS 元数据损坏
  3. 存储阵列 LUN 映射变更
  4. 多个 ESXi 主机之间的锁竞争

诊断步骤

bash
# 1. 检查物理连接
esxcli storage core device list -d naa.xxxxxxxxxxxxxxxx
# 查看 Status 是否为 "on"

# 2. 检查路径状态
esxcli storage nmp path list --device naa.xxxxxxxxxxxxxxxx

# 3. 检查 VMFS 一致性
fsck.vmfs -x /vmfs/volumes/<datastore-uuid>

# 4. 检查 SCSI Reservation 冲突
grep -i "Reservation\|SCSI.*conflict" /var/log/vmkernel | tail -20

# 5. 尝试卸载并重新挂载
esxcli storage filesystem umount -l datastore-name
esxcli storage filesystem mount -l datastore-name

解决方案

  1. 如果 LUN 可见但 VMFS 不可访问,尝试重新挂载
  2. 如果是锁冲突,在所有主机上卸载后重新挂载
  3. 如果是元数据损坏,使用 vmkfstools -x repair 修复
  4. 如果物理连接有问题,检查光纤/网线、HBA 卡、SAN 交换机的状态

问题 3:虚拟机 I/O 性能缓慢,存储延迟高

现象:虚拟机运行变慢,vCenter 中的存储延迟持续高于 50ms。

可能原因

  1. 存储阵列性能不足(磁盘队列深度过深)
  2. 多条虚拟机同时争夺有限的存储 I/O
  3. 存储多路径配置不当
  4. 网络问题(对于 iSCSI/NFS)
  5. 写入缓存未启用或配置过小

诊断步骤

bash
# 1. 使用 esxtop 检查存储延迟
esxtop
# 按 u 进入磁盘视图,关注 DAVG、KAVG、GAVG 指标
# DAVG > 20ms 表示存储设备延迟过高
# KAVG > 2ms 表示 VMkernel 层有瓶颈

# 2. 检查队列深度
esxcli storage core device list -d <device> | grep "Queue Depth"
# 如果队列深度被过度削减,可能限制 I/O 并发

# 3. 检查多路径分布
esxcli storage nmp device list -d <device>
# 检查所有路径是否都在均衡使用

# 4. 检查 vSAN 的磁盘平衡度
esxcli vsan storage usage -t all

# 5. 检查数据存储的 SIOC 状态
esxcli storage vmfs sioc status -l datastore-name

解决方案

  1. 如果存储阵列延迟高,考虑升级到 SSD/NVMe
  2. 启用 SIOC 控制虚拟机之间的 I/O 争用
  3. 将路径策略改为 Round Robin 以利用所有路径
  4. 增加 NFS 或 iSCSI 的队列深度
  5. 使用存储 DRS 将高负载 VM 迁移到低负载数据存储

问题 4:vSAN 对象显示 "Degraded" 或 "Absent"

现象:vCenter 中 vSAN 对象状态为降级或缺失。

可能原因

  1. 某个 ESXi 主机宕机
  2. 磁盘故障(缓存盘或容量盘)
  3. 网络分区(vSAN 节点之间网络断开)
  4. 磁盘组已满(容量监控阈值)

诊断步骤

bash
# 1. 检查主机状态
esxcli vsan cluster get | grep Member

# 2. 检查存储状态
esxcli vsan storage list | grep -E "Device:|State:|VSAN Info"

# 3. 检查对象的组件放置
esxcli vsan debug object list

# 4. 检查重新同步状态
esxcli vsan debug resync list

# 5. 检查磁盘健康
esxcli storage core device smart get -d <device>

解决方案

  1. 如果主机宕机,恢复主机或将其标记为维护模式
  2. 如果磁盘故障,更换磁盘并启动重新同步
  3. 如果网络分区,修复 vSAN 网络配置
  4. 如果磁盘组满,添加新磁盘或清理不需要的数据
  5. 等待重新同步完成(可通过 vsan.resync 命令监控进度)

问题 5:vSAN 数据存储空间不足

现象:vSAN 数据存储使用率达到 80% 以上,空间即将耗尽。

可能原因

  1. 虚拟机持续增长,消耗了更多空间
  2. 快照未及时清理
  3. 对象开销(冗余副本/纠删码校验)消耗了大量空间
  4. 未启用去重和压缩

解决方案

bash
# 1. 查看 vSAN 容量概览
esxcli vsan storage usage summary

# 2. 查找空间占用最大的 VM
# 在 vCenter 中使用 vsan 对象视图

# 3. 清理不需要的快照
# 在 vCenter 中删除所有不需要的快照

# 4. 启用去重和压缩(如果是全闪存 vSAN)
# 在 vCenter 的 vSAN 配置中启用去重和压缩
# 注意:去重需要重建数据,可能需要一定时间

# 5. 扩展集群容量
# - 向现有主机添加更多容量磁盘
# - 向集群添加新主机
# - 使用纠删码替代镜像以提高空间效率

# 6. 设置容量警告阈值
# vCenter → vSAN → 容量 → 警告阈值 80%,严重阈值 95%

# 7. 设置磁盘组的预留空间
# 至少保留 20-30% 空闲空间用于重新同步和 DRS 迁移

问题 6:存储路径故障导致 I/O 错误

现象:vCenter 告警显示路径故障,虚拟机 I/O 短暂中断或性能下降。

诊断步骤

bash
# 1. 列出所有存储路径
esxcli storage nmp path list

# 2. 重点关注 State 为 "dead" 的路径
esxcli storage nmp path list | grep -A 3 "dead"

# 3. 记录故障时间
grep "lost.*path\|path.*state.*dead\|SCSI.*error" /var/log/vmkernel | tail -30

# 4. 检查 SATP 配置状态
esxcli storage nmp device list | grep -E "Device|SATP"

解决方案

  1. 检查物理连接:光纤线缆、HBA 卡、交换机端口
  2. 更新 HBA 固件和驱动
  3. 检查存储阵列端口的健康状态
  4. 如果路径恢复后仍显示 dead,手动重置:
    bash
    esxcli storage nmp path set --runtime-name <path> --state active
    
  5. 配置更短的路径故障检测时间
  6. 确保 PSP 配置正确(RR 可更快检测和切换)

问题 7:NFS 心跳丢失导致虚拟机冻结

现象:使用 NFS 数据存储的虚拟机突然无响应,vCenter 显示 NFS 数据存储不可达。

诊断步骤

bash
# 1. 检查 NFS 挂载状态
esxcli storage nfs list | grep "Accessible"

# 2. 检查 NAS 服务器连通性
ping 192.168.1.30

# 3. 检查 NFS 服务
# 登录 NAS 服务器检查 NFS 服务状态
showmount -e 192.168.1.30

# 4. 检查 ESXi 的 NFS 心跳日志
grep "NFS.*heartbeat\|NFS.*timeout\|NFS.*lost" /var/log/vmkernel | tail -30

# 5. 检查网络丢包和延迟
ping -c 100 -s 1500 192.168.1.30 | grep -E "loss|avg|dev"

解决方案

  1. 确保 NAS 服务器时间与 ESXi 同步(NTP)
  2. 调整 NFS 心跳参数(增大超时值)
  3. 为 NFS 流量使用专用 VLAN 和更快的网络
  4. 在 NAS 上启用 NFS 的硬挂载和 intr 选项
  5. 使用 vSphere NFS Cluster 的高级配置

问题 8:精简置备虚拟磁盘空间膨胀失控

现象:精简单虚拟磁盘实际使用的空间远大于预期,数据存储空间被快速消耗。

原因

  1. 大量随机写入导致 VMDK 中几乎所有块都变为非零
  2. 使用 fstrim/discard 的空间回收未启用
  3. 删除大文件但未执行 UNMAP 操作
  4. 数据库日志文件的频繁写入

诊断与修复

bash
# 1. 检查精简虚拟磁盘的实际使用情况
vmkfstools -P /vmfs/volumes/datastore/path/to/vm.vmdk
# 比较 Capacity(文件大小)和 Space Used(实际使用)

# 2. 在客户机内部执行回收(Linux)
# 安装和运行 fstrim
sudo apt install -y util-linux
sudo fstrim -av

# 3. 在客户机内部执行回收(Windows)
# 运行优化驱动器工具来回收空间
# 或使用 PowerShell: Optimize-Volume -DriveLetter C -ReTrim -Verbose

# 4. 在 ESXi 层触发 UNMAP
esxcli storage vmfs unmap -l datastore-name -n 100

# 5. 检查是否启用了客户机 SCSI 丢弃支持
# 在 VM 高级参数中设置:
# disk.EnableUUID = TRUE
# sched.scsiX.status = "enable"

预防措施

  1. 在 VM 的高级参数中启用 isolation.tools.diskWiper.disable = FALSE
  2. 定期在客户机中执行 fstrim/Trim 操作
  3. 监控数据存储空间使用趋势,设置告警

总结

本篇文章深入探讨了 VMware vSphere 存储管理的核心技术与实战操作。我们从 VMFS 文件系统的架构原理出发,详细介绍了 VMFS 6 的新型子块分配和自动 UNMAP 回收机制,分析了 VMDK 虚拟磁盘的厚置备和精简置备的适用场景。在外部存储接入方面,我们完整演示了 iSCSI SAN 和 NFS NAS 两种主流存储协议的配置流程,包括 CHAP 认证、多路径 IO 配置和 NFS v4.1 的高级设置。在超融合方向,我们详细介绍了 vSAN 的磁盘组架构、存储策略设计以及 RAID-5/6 纠删码的高效使用方式。

关键技术要点回顾

  1. VMFS 6 是 vSphere 8.0 的推荐文件系统,具备自动 UNMAP、增强的子块分配和完整的 SPBM 集成,应作为新部署的首选
  2. iSCSI 多路径配置:Round Robin 策略配合 ALUA 是实现高性能和冗余的最佳实践
  3. NFS 适用于弹性场景:配置简便,但在高负载下需关注网络延迟和心跳超时问题
  4. vSAN 存储策略是超融合的核心:根据工作负载特性选择 FTT、纠删码和条带宽度参数
  5. 存储性能监控:esxtop 的 DAVG/KAVG/GAVG 三层延迟分析是排查问题的根本方法

最佳实践建议

  • 在所有生产环境中使用 VMFS 6 或 NFS v4.1
  • 为 iSCSI 存储启用 Round Robin 多路径和 CHAP 认证
  • vSAN 集群保留至少 20% 的空闲空间用于故障切换和重新同步
  • 为关键应用选择 FTT=2(RAID-1 镜像)或 RAID-6 纠删码
  • 定期执行存储性能基准测试,建立基线数据
  • 在数据存储使用率达到 70% 时发出告警,80% 时启动扩容

本系列下一篇预告

在下一篇文章《VMware 虚拟化实战 03 - vCenter Server 部署》中,我们将深入探讨:

  • vCenter Server Appliance 的两阶段部署流程
  • DNS、NTP、FQDN、端口和资源规格规划
  • SSO 域、身份源、权限和初始清单配置
  • Appliance Management、文件级备份和服务状态检查
  • ESXi 主机加入 vCenter 后的代理与连通性排查
  • 部署失败、登录缓慢、主机无法加入等常见问题

验证环境说明:

  • ESXi 版本:VMware ESXi 8.0 Update 3 (build-23307199)
  • vCenter 版本:vCenter Server Appliance 8.0 Update 3
  • 实验平台:VMware Workstation Pro 17.5
  • 存储仿真:Openfiler 2.99 + Linux NFS Server
  • iSCSI 目标:LIO (Linux-IO Target) / SCST
  • vSAN 模式:混合 (HDD + SSD Cache)
  • 本文撰写日期:2026-05-16

参考资料

  1. VMware vSphere 8.0 Storage Guide - VMware, Inc.
  2. VMware vSAN 8.0 Design and Sizing Guide - VMware, Inc.
  3. VMware vSphere 8.0 Availability Guide - VMware, Inc.
  4. "VMware vSphere Performance Best Practices" - VMware Performance Engineering
  5. vSphere Command-Line Interface Reference - VMware, Inc.
  6. "Understanding VMFS Locking Mechanism" - VMware KB 1003565
  7. "Configuring iSCSI Adapter and Multipathing" - VMware KB 2001226
  8. vSAN 8.0 OSA vs ESA Architecture Comparison - VMware vSAN Blog