Skip to content

VMware 虚拟化运维

一、vSphere 基础架构

1.1 架构组件

vSphere 采用分层架构设计,主要包含以下组件:

组件说明
ESXi Hypervisor裸机虚拟化层,直接运行在物理硬件上
vCenter Server集中管理平台,提供统一管理面
vSphere Client基于 HTML5 的 Web 管理界面
vDS(分布式交换机)跨主机统一网络配置
VSAN分布式存储虚拟化方案

1.2 部署模式

  • 单台 ESXi 独立部署:适用于小型环境或测试场景。
  • vCenter 集中管理:适用于生产环境,支持 HA、DRS、vMotion 等高级特性。
  • vCenter 链接模式:多 vCenter 实例互联,实现跨站点统一管理。

二、ESXi 主机管理

2.1 主机网络配置

bash
# 查看当前网络配置
esxcli network ip interface list

# 查看 VMkernel 网络接口
esxcli network ip interface ipget

# 配置管理网络 IP
esxcli network ip interface ipset -i vmk0 -I 192.168.1.100 -N 255.255.255.0 -g 192.168.1.1

2.2 存储管理

bash
# 查看已识别的存储设备
esxcli storage core device list

# 扫描新的存储设备
esxcli storage core adapter rescan --all

# 查看 VMFS 数据存储
esxcli storage vmfs extent list

# 创建 VMFS 数据存储
vmkfstools -C vmfs6 -S DatastoreName /dev/disks/naa.xxxxx

2.3 主机维护模式

bash
# 进入维护模式(将虚拟机迁移至其他主机)
esxcli system maintenanceMode set --enable true

# 退出维护模式
esxcli system maintenanceMode set --enable false

# 查看主机状态
esxcli system maintenanceMode get

三、虚拟机管理命令

3.1 vmkfstools — 虚拟磁盘管理

vmkfstools 是 ESXi 上管理虚拟磁盘文件的核心工具。

bash
# 创建虚拟磁盘(厚置备延迟置零)
vmkfstools -c 50G -d thick /vmfs/volumes/datastore1/vm01/vm01.vmdk

# 创建虚拟磁盘(精简置备)
vmkfstools -c 50G -d thin /vmfs/volumes/datastore1/vm01/vm01.vmdk

# 克隆虚拟磁盘
vmkfstools -i /vmfs/volumes/ds1/source.vmdk -d thin /vmfs/volumes/ds1/dest.vmdk

# 转换磁盘格式(厚转薄)
vmkfstools --punchzero /vmfs/volumes/ds1/vm01.vmdk

# 扩容虚拟磁盘
vmkfstools -X 100G /vmfs/volumes/ds1/vm01/vm01.vmdk

# 查看虚拟磁盘信息
vmkfstools -E /vmfs/volumes/ds1/vm01/vm01.vmdk

3.2 esxcli — 主机管理命令行

bash
# 查看虚拟机列表
esxcli vm process list

# 查看所有虚拟机(含关机状态)
esxcli vm process list --all

# 强制停止虚拟机(VM PID 获取方式)
esxcli vm process kill --type=force --world-id=<world-id>

# 查看系统日志
esxcli system syslog log get

# 查看硬件信息
esxcli hardware platform get

# 查看 CPU 信息
esxcli hardware cpu list

3.3 vim-cmd — vCenter 管理命令

bash
# 列出所有虚拟机(vmid 和名称)
vim-cmd vmsvc/getallvms

# 查看虚拟机状态
vim-cmd vmsvc/power.getstate <vmid>

# 启动虚拟机
vim-cmd vmsvc/power.on <vmid>

# 关闭虚拟机(优雅关机)
vim-cmd vmsvc/power.shutdown <vmid>

# 强制关闭虚拟机
vim-cmd vmsvc/power.off <vmid>

# 挂起虚拟机
vim-cmd vmsvc/power.suspend <vmid>

# 重启虚拟机
vim-cmd vmsvc/power.reboot <vmid>

# 创建虚拟机快照
vim-cmd vmsvc/snapshot.create <vmid> "SnapshotName" "Description" 1 0

# 查看虚拟机快照列表
vim-cmd vmsvc/snapshot.get <vmid>

# 恢复到指定快照
vim-cmd vmsvc/snapshot.revert <vmid> <snapshot-id>

# 删除快照
vim-cmd vmsvc/snapshot.remove <vmid> <snapshot-id>

# 删除所有快照
vim-cmd vmsvc/snapshot.removeall <vmid>

四、资源池配置

4.1 资源池概念

资源池用于对 CPU 和内存资源进行分层分配和隔离,支持以下配置:

  • 份额(Shares):相对权重,竞争时按比例分配资源。
  • 预留(Reservation):保证的最小资源量。
  • 限制(Limit):允许使用的最大资源上限。
  • 可扩展预留:子资源池可继承父资源池的预留资源。

4.2 资源池管理(通过 vCenter)

bash
# 创建资源池(通过 esxcli 或 API,以下为示例命令)
# 实际资源池创建建议通过 vSphere Client 或 API 完成

# 监控资源池使用情况
esxcli resource vcpu list
esxcli resource mem list

4.3 资源分配最佳实践

场景份额策略预留策略
生产关键业务高(High)预留峰值需求的 80%
开发测试环境低(Low)不预留或少量预留
数据库集群自定义(Custom)预留峰值内存需求
批处理任务低(Low)不限,利用空闲资源

五、快照管理

5.1 快照原理

VMware 快照保存虚拟机在特定时间点的状态(磁盘、内存和电源状态)。快照链由 delta 磁盘文件(*-delta.vmdk)构成,父磁盘保持不变。

5.2 快照管理命令

bash
# 创建快照(包含内存状态)
vmware-cmd <vm-path> createsnapshot "PrePatch" "Before system patch" 1 1

# 创建快照(仅磁盘,不含内存)
vmware-cmd <vm-path> createsnapshot "PrePatch" "Before system patch" 0 1

# 恢复到指定快照
vmware-cmd <vm-path> revertsnapshot <snapshot-id>

5.3 快照管理最佳实践

  • 快照不宜长期存在:超过 72 小时应删除或合并。
  • 快照链不宜过长:建议不超过 3 层,超过会严重影响性能。
  • 大磁盘快照注意空间:快照 delta 文件会随写入量增长,需监控数据存储空间。
  • 生产环境慎用内存快照:内存快照文件较大,恢复时间较长。

5.4 快照合并(Consolidation)

bash
# 通过 vim-cmd 检查是否需要合并
vim-cmd vmsvc/getallvms

# 对于需要合并的虚拟机,执行合并操作
# 在 vSphere Client 中操作:虚拟机 -> 快照 -> 整合

六、常用运维脚本

6.1 批量检查虚拟机资源使用情况

bash
#!/bin/bash
# 用途:遍历所有 ESXi 主机上的虚拟机,输出 CPU 和内存分配情况
# 保存路径:/usr/local/bin/check-vm-resources.sh

ESXI_HOSTS=("esxi01.example.com" "esxi02.example.com")
CREDENTIALS="root@password"

for HOST in "${ESXI_HOSTS[@]}"; do
    echo "========== $HOST =========="
    ssh "$CREDENTIALS@$HOST" "esxcli vm process list | grep -E 'Display Name|VM Memory|CPU'"
done

6.2 批量创建虚拟机快照

bash
#!/bin/bash
# 用途:生产环境批量创建快照脚本
# 保存路径:/usr/local/bin/batch-snapshot.sh

VCENTER="vcenter.example.com"
SNAPSHOT_NAME="PrePatch_$(date +%Y%m%d)"
VM_LIST=("web-server-01" "web-server-02" "db-server-01")

for VM in "${VM_LIST[@]}"; do
    echo "Creating snapshot for $VM ..."
    vim-cmd vmsvc/snapshot.create \
        "$(vim-cmd vmsvc/getallvms | grep "$VM" | awk '{print $1}')" \
        "$SNAPSHOT_NAME" "Auto snapshot before patching" 1 0
done

6.3 数据存储空间监控

bash
#!/bin/bash
# 用途:监控所有数据存储使用率,超过阈值告警
# 保存路径:/usr/local/bin/ds-monitor.sh

THRESHOLD=85

for HOST in esxi01 esxi02 esxi03; do
    ssh "root@$HOST" "esxcli storage filesystem list" | \
        awk -v threshold=$THRESHOLD -v host=$HOST \
        'NR>1 {usage=$5; gsub(/%/,"",usage); if(usage+0 > threshold) \
        printf "WARNING: %s - %s usage at %s%%\n", host, $1, $5}'
done

6.4 自动清理过期快照

bash
#!/bin/bash
# 用途:查找并清理超过 7 天的快照
# 保存路径:/usr/local/bin/cleanup-old-snapshots.sh

AGE_LIMIT=7
VCENTER="vcenter.example.com"

# 获取所有虚拟机及其快照
for VM in $(vim-cmd vmsvc/getallvms | awk 'NR>1 {print $1}'); do
    SNAPSHOT_INFO=$(vim-cmd vmsvc/snapshot.get $VM 2>/dev/null)
    if [ -n "$SNAPSHOT_INFO" ]; then
        SNAPSHOT_DATE=$(echo "$SNAPSHOT_INFO" | grep "Created" | head -1)
        # 计算快照存在天数并判断是否删除
        echo "VM $VM has snapshots, check manually if needed"
    fi
done

七、故障排查

7.1 常见问题

问题可能原因解决步骤
虚拟机无法开机磁盘空间不足检查数据存储,释放空间或扩容
性能缓慢CPU Ready 过高减少虚拟机 vCPU 数量,增加物理 CPU
vMotion 失败网络不兼容检查 vMotion 网络和 CPU 兼容性
快照无法删除磁盘 IO 繁忙等待 IO 完成,或重启虚拟机后重试

7.2 日志收集

bash
# 收集 ESXi 主机诊断日志
esxcli system syslog log get

# 导出 vCenter 日志
# 通过 vSphere Client 导出:菜单 -> 系统管理 -> 日志 -> 导出支持包

参考文档:VMware vSphere 8.0 官方文档 | VMware vSphere 命令参考手册