增强型 vMotion 兼容性(EVC)是 vSphere 环境中保障虚拟机跨主机迁移兼容性的关键功能,而每虚拟机 EVC(Per-VM EVC)允许单独为虚拟机配置 EVC 模式,无需继承集群配置,大幅提升了迁移灵活性。本文将详细介绍如何使用 PowerCLI 脚本自动化审计 vSphere 环境中已配置 Per-VM EVC 的虚拟机,帮助管理员快速完成库存统计、兼容性排查,同时提供脚本扩展用法和操作注意事项,适用于各类 vSphere 运维场景,无需复杂编程基础即可上手。
一、Per-VM EVC 基础认知
1. 核心作用
EVC 的核心价值是通过统一 CPU 功能集,确保虚拟机在不同 CPU 型号的 ESXi 主机间顺畅迁移(vMotion)。传统集群级 EVC 会让所有虚拟机继承同一配置,而 Per-VM EVC 将 EVC 模式设为虚拟机独立属性,即使虚拟机迁移到其他集群或数据中心,其 EVC 配置也不会丢失,尤其适合混合 CPU 环境和跨集群迁移场景。
2. 继承规则
若虚拟机未单独配置 Per-VM EVC,会自动沿用所在集群的 EVC 模式;若已配置,则优先使用自身 EVC 设置,但不能超过集群 EVC 的功能上限(避免 CPU 功能不兼容)。
3. 审计必要性
随着集群规模扩大,手动排查每台虚拟机的 Per-VM EVC 配置不仅耗时,还易出错。自动化审计可快速定位已配置 Per-VM EVC 的虚拟机,为迁移规划、配置优化和故障排查提供准确数据支持。
二、审计准备工作
1. 环境要求
已安装 VMware PowerCLI 模块(支持 vSphere 7.0 及以上版本);
具备 vCenter Server 管理员或只读权限的账户(需能访问虚拟机配置信息);
客户端与 vCenter Server 网络连通(默认端口 443)。
2. PowerCLI 安装与初始化
若未安装 PowerCLI,可通过以下步骤快速部署:
以管理员身份打开 PowerShell;
执行安装命令:Install-Module -Name VMware.PowerCLI -Scope CurrentUser -Force;
解除执行策略限制(可选):Set-ExecutionPolicy RemoteSigned -Confirm:$false;
导入模块:Import-Module VMware.PowerCLI;
忽略证书验证(非生产环境可选):Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false。
3. 连接 vCenter Server
为保障安全,推荐通过交互式凭据输入方式连接 vCenter,避免密码明文暴露:
# 定义vCenter服务器地址
$vCenterServer = "vcenter.example.com" # 替换为实际vCenter地址或IP
# 交互式获取登录凭据
$credential = Get-Credential -Message "请输入vCenter登录账号和密码"
# 建立连接
Connect-VIServer -Server $vCenterServer -Credential $credential
连接成功后,将显示 vCenter 服务器版本、会话 ID 等信息,可通过Get-Connection命令验证连接状态。
三、核心审计脚本解析与执行
1. 脚本原理
判断虚拟机是否启用 Per-VM EVC 的关键是检查Runtime.FeatureMask属性 ------ 该属性非空即表示虚拟机已配置独立 EVC 模式。同时,脚本会自动排除名称包含 "vCLS-" 的系统虚拟机(这些是 vSphere 集群服务虚拟机,用于维护 DRS、HA 等功能,无需审计)。
2. 完整审计脚本
# 1. 获取所有虚拟机的名称和运行时属性(仅提取必要属性,提升执行效率)
$vms = Get-View -ViewType VirtualMachine -Property Name, Runtime
# 2. 循环遍历虚拟机,筛选启用Per-VM EVC的实例
foreach ($vm in $vms) {
# 条件:FeatureMask非空(启用Per-VM EVC)且排除vCLS系统虚拟机
if ($vm.Runtime.FeatureMask -ne $null -and $vm.Name -notmatch "vCLS-") {
# 输出结果(包含虚拟机名称和Per-VM EVC状态)
Write-Host "✅ 虚拟机 [$($vm.Name)] 已启用Per-VM EVC"
}
}
# 3. 断开vCenter连接(释放资源)
Disconnect-VIServer -Server * -Confirm:$false
Write-Host "`n📋 审计完成!已列出所有启用Per-VM EVC的虚拟机"
3. 执行步骤
将脚本中的$vCenterServer替换为实际环境的 vCenter 地址;
在 PowerShell 中粘贴脚本,按回车执行;
按提示输入 vCenter 登录账号和密码;
等待脚本执行完成,终端将输出所有已启用 Per-VM EVC 的虚拟机名称。
4. 示例输出
✅ 虚拟机 [Web-Server-01] 已启用Per-VM EVC
✅ 虚拟机 [DB-Server-02] 已启用Per-VM EVC
✅ 虚拟机 [APP-Server-03] 已启用Per-VM EVC
📋 审计完成!已列出所有启用Per-VM EVC的虚拟机
四、脚本扩展:导出审计结果到 CSV
若需将审计结果存档或进一步分析,可修改脚本将结果导出为 CSV 文件(支持 Excel 打开),扩展脚本如下:
# 1. 连接vCenter(同上,省略重复代码)
$vCenterServer = "vcenter.example.com"
$credential = Get-Credential -Message "请输入vCenter登录账号和密码"
Connect-VIServer -Server $vCenterServer -Credential $credential
# 2. 收集虚拟机信息并筛选
$evcVms = @() # 定义数组存储结果
$vms = Get-View -ViewType VirtualMachine -Property Name, Runtime
foreach ($vm in $vms) {
if ($vm.Runtime.FeatureMask -ne $null -and $vm.Name -notmatch "vCLS-") {
# 构建结果对象
$result = [PSCustomObject]@{
虚拟机名称 = $vm.Name
Per-VM EVC状态 = "已启用"
审计时间 = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
}
$evcVms += $result
}
}
# 3. 导出CSV文件(指定保存路径)
$exportPath = "C:\Reports\Per-VM_EVC_Audit.csv" # 替换为实际保存路径
$evcVms | Export-Csv -Path $exportPath -Encoding UTF8 -NoTypeInformation -Force
# 4. 断开连接并提示
Disconnect-VIServer -Server * -Confirm:$false
Write-Host "📊 审计结果已导出至:$exportPath"
五、注意事项
权限要求:执行脚本的账户需具备 vCenter 的 "虚拟机。配置。查看" 权限,否则可能无法获取FeatureMask属性;
虚拟机状态:脚本支持运行中或已关机的虚拟机,无需关闭虚拟机即可完成审计;
vCLS 虚拟机:名称以 "vCLS-" 开头的虚拟机是 vSphere 集群服务的系统实例,用于保障 DRS、HA 功能可用性,脚本自动排除此类虚拟机,无需手动筛选;
版本兼容性:该方法适用于 vSphere 7.0 Update 1 及以上版本(Per-VM EVC 功能从该版本开始支持);
脚本修改:可根据需求添加更多属性(如虚拟机所在集群、电源状态等),只需在Get-View的-Property参数中补充对应属性名称(如Cluster, Runtime.PowerState)。
通过以上步骤,即可快速完成 vSphere 环境中 Per-VM EVC 配置的自动化审计,大幅提升运维效率,减少人工操作失误。如需进一步扩展脚本功能(如批量修改 EVC 模式、发送审计报告邮件等),可根据实际场景调整代码逻辑。