ESXi 虚拟机管理命令大全 ⚡
🖥️ 掌握ESXi命令行管理,轻松掌控虚拟机生命周期
目录 📚
🔍 一、虚拟机信息查询
📋 获取所有虚拟机列表
用途: 显示ESXi主机上所有虚拟机的详细信息
1
2
3
4
5
6
7
8
|
# 获取完整虚拟机列表
vim-cmd vmsvc/getallvms
# 格式化输出(更易读)
vim-cmd vmsvc/getallvms | awk '{printf "%-4s %-30s %-20s %-15s %-10s\n", $1, $2, $3, $4, $5}'
# 仅显示虚拟机ID和名称
vim-cmd vmsvc/getallvms | awk '{print $1 " " $2}' | grep -v "Vmid"
|
输出说明:
vmid
: 虚拟机唯一标识符
name
: 虚拟机名称
file
: 配置文件路径
guest OS
: 客户机操作系统
version
: 虚拟机硬件版本
📝 查看虚拟机详细信息
1
2
3
4
5
6
7
8
9
10
11
|
# 查看特定虚拟机配置
vim-cmd vmsvc/get.config [vmid]
# 查看虚拟机运行时信息
vim-cmd vmsvc/get.summary [vmid]
# 查看虚拟机资源分配
vim-cmd vmsvc/get.resourceconfig [vmid]
# 查看虚拟机客户机信息(需要VMware Tools)
vim-cmd vmsvc/get.guest [vmid]
|
⚡ 二、电源管理操作
🔌 开启虚拟机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 开启指定虚拟机
vim-cmd vmsvc/power.on [vmid]
# 示例:开启vmid为20的虚拟机
vim-cmd vmsvc/power.on 20
# 批量开启所有已关闭的虚拟机
for vmid in $(vim-cmd vmsvc/getallvms | awk '{if($1 != "Vmid" && $0 !~ /\[/){print $1}}'); do
state=$(vim-cmd vmsvc/power.getstate $vmid | grep -o "Powered off")
if [ "$state" = "Powered off" ]; then
echo "Starting VM ID: $vmid"
vim-cmd vmsvc/power.on $vmid
fi
done
|
🔴 关闭虚拟机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 正常关机(需要VMware Tools)
vim-cmd vmsvc/power.shutdown [vmid]
# 强制关机(立即断电)
vim-cmd vmsvc/power.off [vmid]
# 示例:正常关闭vmid为20的虚拟机
vim-cmd vmsvc/power.shutdown 20
# 强制关闭所有虚拟机(紧急情况使用)
for vmid in $(vim-cmd vmsvc/getallvms | awk '{if($1 != "Vmid") print $1}'); do
echo "强制关闭虚拟机: $vmid"
vim-cmd vmsvc/power.off $vmid
done
|
🔄 重启虚拟机
1
2
3
4
5
6
7
8
|
# 正常重启(需要VMware Tools)
vim-cmd vmsvc/power.reboot [vmid]
# 强制重启
vim-cmd vmsvc/power.reset [vmid]
# 示例:重启vmid为20的虚拟机
vim-cmd vmsvc/power.reboot 20
|
⏯️ 暂停与恢复
1
2
3
4
5
6
7
8
|
# 暂停虚拟机
vim-cmd vmsvc/power.suspend [vmid]
# 从暂停状态恢复
vim-cmd vmsvc/power.resume [vmid]
# 检查虚拟机是否支持暂停
vim-cmd vmsvc/get.capability [vmid] | grep suspend
|
📊 三、状态监控与诊断
🔍 获取虚拟机电源状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 查看虚拟机当前状态
vim-cmd vmsvc/power.getstate [vmid]
# 示例:查看vmid为20的虚拟机状态
vim-cmd vmsvc/power.getstate 20
# 批量检查所有虚拟机状态
for vmid in $(vim-cmd vmsvc/getallvms | awk '{if($1 != "Vmid") print $1}'); do
echo -n "VM $vmid: "
vim-cmd vmsvc/power.getstate $vmid | grep -o "Powered on\|Powered off\|Suspended"
done
# 可能的返回状态:
# - Powered on 🟢 已开机
# - Powered off 🔴 已关机
# - Suspended ⏸️ 已暂停
|
📈 列出当前运行的虚拟机
1
2
3
4
5
6
7
8
9
10
11
|
# 显示所有运行中的虚拟机
esxcli vm process list
# 详细格式显示
esxcli vm process list | grep -E "^(World|Process|Name|UUID)"
# 统计运行中的虚拟机数量
esxcli vm process list | grep "World ID" | wc -l
# 显示虚拟机资源使用情况
esxcli vm process list | awk '/Name:/ {name=$2} /CPU:/ {cpu=$2} /Mem:/ {mem=$2} /World ID:/ {print "VM:", name, "CPU:", cpu, "Memory:", mem}'
|
🖥️ 资源使用监控
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 查看CPU使用情况
esxtop
# 查看内存使用情况
esxcli hardware memory get
# 查看存储性能
esxcli storage core device stats get
# 查看网络统计信息
esxcli network nic stats get
# 查看虚拟机资源限制
esxcli vm process list | grep -E "(World ID|CPU|Memory)"
|
🔧 四、高级管理命令
🔄 虚拟机快照管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 创建快照
vim-cmd vmsvc/snapshot.create [vmid] "Snapshot Name" "Description" includeMemory suppressPowerOff
# 列出快照
vim-cmd vmsvc/snapshot.get [vmid]
# 恢复到快照
vim-cmd vmsvc/snapshot.revert [vmid] snapshotId suppressPowerOff
# 删除快照
vim-cmd vmsvc/snapshot.remove [vmid] snapshotId
# 删除所有快照
vim-cmd vmsvc/snapshot.removeall [vmid]
# 示例:创建名为"Backup"的快照
vim-cmd vmsvc/snapshot.create 123 "Backup" "Pre-update snapshot" 0 0
|
📁 文件操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 查看虚拟机文件
ls -la /vmfs/volumes/
# 查找特定虚拟机文件
find /vmfs/volumes -name "*.vmx" | grep [vm-name]
# 检查虚拟机磁盘文件
vmkfstools -i [source.vmdk] [destination.vmdk]
# 扩展虚拟磁盘
vmkfstools -X [new-size]G [disk.vmdk]
# 克隆虚拟机磁盘
vmkfstools -i source.vmdk destination.vmdk -d thin
# 检查磁盘一致性
vmkfstools -e [disk.vmdk]
|
🌐 网络管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 查看虚拟交换机
esxcli network vswitch standard list
# 查看端口组
esxcli network vswitch standard portgroup list
# 查看虚拟机网络适配器
esxcli network vm list
# 查看网络统计信息
esxcli network nic stats get
# 查看VMkernel网络接口
esxcli network ip interface list
# 配置虚拟机网络
esxcli network vm portgroup set -p "Portgroup Name" -v [vmid]
|
🛠️ 五、配置与维护
⚙️ ESXi主机配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 查看主机信息
esxcli system version get
# 查看主机时间
esxcli system time get
# 查看主机状态
esxcli system status get
# 查看主机硬件信息
esxcli hardware platform get
# 查看CPU信息
esxcli hardware cpu list
# 查看内存信息
esxcli hardware memory get
# 查看PCI设备
esxcli hardware pci list
|
🔧 服务管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 列出所有服务
esxcli system service list
# 启动服务
esxcli system service start --service=[service-name]
# 停止服务
esxcli system service stop --service=[service-name]
# 重启管理代理(常用故障排除)
/etc/init.d/hostd restart
/etc/init.d/vpxa restart
# 查看服务状态
esxcli system service status --service=[service-name]
# 设置服务开机自启
esxcli system service set --service=[service-name] --enabled=true
|
💾 存储管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 查看存储适配器
esxcli storage core adapter list
# 查看存储设备
esxcli storage core device list
# 查看数据存储
esxcli storage filesystem list
# 查看NFS存储
esxcli storage nfs list
# 查看VMFS数据存储
esxcli storage vmfs extent list
# 重新扫描存储适配器
esxcli storage core adapter rescan --adapter=[adapter-name]
|
⚠️ 六、注意事项
🔴 重要警告
-
权限要求: 需要SSH登录ESXi主机并具有管理员权限
1
2
3
4
5
|
# 启用ESXi SSH(临时)
esxcli system ssh set --enabled=true
# 设置SSH开机自启
esxcli system ssh set --enabled=true --start-auto=true
|
-
操作风险: 强制关机可能导致数据丢失
1
2
3
4
5
6
7
8
|
# 优先使用正常关机
vim-cmd vmsvc/power.shutdown [vmid]
# 仅在必要时使用强制关机
vim-cmd vmsvc/power.off [vmid]
# 检查虚拟机是否有未保存数据
vim-cmd vmsvc/get.summary [vmid] | grep -E "(guestHeartbeatStatus|guestState)"
|
-
备份重要: 关键操作前建议创建快照
1
2
3
4
5
|
# 创建保护性快照
vim-cmd vmsvc/snapshot.create [vmid] "Pre-Maintenance" "Snapshot before maintenance" 0 0
# 设置快照保留策略
vim-cmd vmsvc/snapshot.setoption [vmid] 90 7
|
✅ 最佳实践
-
记录操作: 记录所有命令行操作
1
2
3
|
# 启用ESXi Shell命令历史记录
export HISTFILE=~/.esh_history
export HISTSIZE=1000
|
-
测试环境: 在生产环境操作前先在测试环境验证
1
2
|
# 创建测试虚拟机克隆
vim-cmd vmsvc/clone [vmid] [new-vmid] [new-name]
|
-
维护窗口: 在业务低峰期执行维护操作
1
2
|
# 检查当前负载
esxcli system stats load get
|
-
监控验证: 操作后验证虚拟机状态
1
2
3
|
# 操作后验证
vim-cmd vmsvc/power.getstate [vmid]
esxcli vm process list | grep [vmid]
|
💡 七、实用技巧
🎯 快速查找虚拟机ID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 根据虚拟机名称查找vmid
vim-cmd vmsvc/getallvms | grep -i "[vm-name]"
# 创建查找函数(添加到~/.profile)
findvm() {
vim-cmd vmsvc/getallvms | grep -i "$1"
}
# 根据IP地址查找虚拟机
findvmbyip() {
for vmid in $(vim-cmd vmsvc/getallvms | awk '{if($1 != "Vmid") print $1}'); do
ip=$(vim-cmd vmsvc/get.guest $vmid | grep ipAddress | sed -n '1p' | cut -d '"' -f 2)
if [ "$ip" = "$1" ]; then
echo "VMID: $vmid"
vim-cmd vmsvc/get.summary $vmid | grep "name"
fi
done
}
|
📊 资源使用报告
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 生成虚拟机资源报告
echo "VM Resource Usage Report - $(date)"
echo "==================================="
vim-cmd vmsvc/getallvms | awk 'NR>1 {print $1}' | while read vmid; do
echo "VMID: $vmid"
vim-cmd vmsvc/get.summary $vmid | grep -E "(memory|cpu|powerState)"
echo "---"
done
# 导出为CSV格式
echo "VMID,Name,PowerState,CPU,Memory" > vm_report.csv
vim-cmd vmsvc/getallvms | awk 'NR>1 {print $1}' | while read vmid; do
name=$(vim-cmd vmsvc/get.summary $vmid | grep "name" | cut -d '"' -f 2)
power=$(vim-cmd vmsvc/power.getstate $vmid | grep -o "Powered on\|Powered off\|Suspended")
cpu=$(vim-cmd vmsvc/get.summary $vmid | grep "cpu" | cut -d '"' -f 2)
memory=$(vim-cmd vmsvc/get.summary $vmid | grep "memory" | cut -d '"' -f 2)
echo "$vmid,$name,$power,$cpu,$memory" >> vm_report.csv
done
|
🎯 八、批量操作脚本
🔄 批量电源管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#!/bin/bash
# 批量启动所有已关闭的虚拟机
echo "Starting all powered-off VMs..."
for vmid in $(vim-cmd vmsvc/getallvms | awk '{if($1 != "Vmid" && $0 !~ /\[/){print $1}}'); do
state=$(vim-cmd vmsvc/power.getstate $vmid | grep -o "Powered off")
if [ "$state" = "Powered off" ]; then
echo "Starting VM ID: $vmid"
vim-cmd vmsvc/power.on $vmid
sleep 2
fi
done
echo "Done."
#!/bin/bash
# 批量正常关闭所有虚拟机
echo "Shutting down all VMs gracefully..."
for vmid in $(vim-cmd vmsvc/getallvms | awk '{if($1 != "Vmid") print $1}'); do
state=$(vim-cmd vmsvc/power.getstate $vmid | grep -o "Powered on")
if [ "$state" = "Powered on" ]; then
echo "Shutting down VM ID: $vmid"
vim-cmd vmsvc/power.shutdown $vmid
sleep 5
fi
done
echo "Done."
|
📸 批量快照管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#!/bin/bash
# 为所有运行中的虚拟机创建快照
SNAPSHOT_NAME="Pre-Maintenance-$(date +%Y%m%d)"
echo "Creating snapshot '$SNAPSHOT_NAME' for all running VMs..."
for vmid in $(vim-cmd vmsvc/getallvms | awk '{if($1 != "Vmid") print $1}'); do
state=$(vim-cmd vmsvc/power.getstate $vmid | grep -o "Powered on")
if [ "$state" = "Powered on" ]; then
echo "Creating snapshot for VM ID: $vmid"
vim-cmd vmsvc/snapshot.create $vmid "$SNAPSHOT_NAME" "Automated snapshot before maintenance" 0 0
sleep 1
fi
done
echo "Done."
#!/bin/bash
# 删除所有虚拟机的所有快照
echo "Removing all snapshots from all VMs..."
for vmid in $(vim-cmd vmsvc/getallvms | awk '{if($1 != "Vmid") print $1}'); do
echo "Removing snapshots from VM ID: $vmid"
vim-cmd vmsvc/snapshot.removeall $vmid
sleep 1
done
echo "Done."
|
🚀 九、性能优化
⚡ 性能监控命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 查看CPU就绪时间
esxcli perf metric get --metric-id=cpu.ready.summation
# 查看内存交换
esxcli perf metric get --metric-id=mem.swapped.summation
# 查看存储延迟
esxcli perf metric get --metric-id=disk.totalLatency.average
# 查看网络丢包率
esxcli perf metric get --metric-id=net.droppedRx.summation
# 查看内存 ballooning
esxcli perf metric get --metric-id=mem.vmmemctl.average
|
🛠️ 性能优化技巧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 调整虚拟机内存分配
vim-cmd vmsvc/reconfigure [vmid] mem=[new-memory-size]
# 调整虚拟机CPU数量
vim-cmd vmsvc/reconfigure [vmid] numCPUs=[new-cpu-count]
# 启用CPU热添加
vim-cmd vmsvc/reconfigure [vmid] cpuHotAddEnabled=true
# 启用内存热添加
vim-cmd vmsvc/reconfigure [vmid] memoryHotAddEnabled=true
# 调整虚拟机资源份额
vim-cmd vmsvc/reconfigure [vmid] cpuShares=[shares] memShares=[shares]
|
📈 资源使用分析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 分析CPU使用情况
esxcli system stats load get
# 分析内存使用情况
esxcli system stats memory get
# 分析存储性能
esxcli storage core device stats get
# 分析网络性能
esxcli network nic stats get
# 生成性能报告
esxcli system stats list | grep -E "(cpu|mem|net|disk)"
|
💡 专业提示: 在使用ESXi命令行管理虚拟机时,建议先使用 vim-cmd vmsvc/getallvms
确认正确的虚拟机ID,然后再执行电源操作。对于生产环境的重要虚拟机,务必在操作前创建快照备份。