VMware 迁移到 Proxmox VE - 详细操作手册
版本:v2.0 详细版 | 适用:PVE 8.2+ / ESXi 6.7--8.0 / vCenter 7.x--8.x
目录
- 实验环境假设
- [迁移前准备(Checklist 细化)](#迁移前准备(Checklist 细化))
- [Proxmox VE 安装与集群搭建](#Proxmox VE 安装与集群搭建)
- 存储与网络配置
- [使用 PVE 8.2 原生 ESXi 导入](#使用 PVE 8.2 原生 ESXi 导入)
- [Windows VM 迁移完整步骤](#Windows VM 迁移完整步骤)
- [Linux VM 迁移完整步骤](#Linux VM 迁移完整步骤)
- [备份系统 PBS 部署](#备份系统 PBS 部署)
- [HA 配置实操](#HA 配置实操)
- 批量迁移脚本
- 故障排查速查表
- 迁移后验证清单
- [附录 A:常用 qm/pct 命令速查](#附录 A:常用 qm/pct 命令速查)
- [附录 B:PowerCLI 批量关机脚本](#附录 B:PowerCLI 批量关机脚本)
关于截图 :本手册无法嵌入真实截图,但每个 UI 操作都提供了菜单路径、ASCII 界面示意图、等效 CLI 命令。如需真实截图,推荐参考 Proxmox 官方 Wiki
pve.proxmox.com/wiki。
一、实验环境假设
| 角色 | 主机名 | IP | 配置 |
|---|---|---|---|
| 源 vCenter | vcsa.lab.local | 10.0.0.10 | 8.0 U2 |
| 源 ESXi 1 | esxi01.lab.local | 10.0.0.11 | ESXi 7.0 U3 |
| 源 ESXi 2 | esxi02.lab.local | 10.0.0.12 | ESXi 7.0 U3 |
| 目标 PVE 节点 1 | pve01.lab.local | 10.0.0.21 | 64C / 256G / 2×960G SSD |
| 目标 PVE 节点 2 | pve02.lab.local | 10.0.0.22 | 64C / 256G / 2×960G SSD |
| 目标 PVE 节点 3 | pve03.lab.local | 10.0.0.23 | 64C / 256G / 2×960G SSD |
| PBS 备份服务器 | pbs01.lab.local | 10.0.0.30 | 16C / 64G / 10TB HDD |
网络规划:
- vmbr0:管理 + 业务(10.0.0.0/24),bond0 = eno1 + eno2(LACP)
- vmbr1:迁移/Ceph(10.0.1.0/24),25GbE 独立网口
- Corosync 环 1:走 vmbr0
- Corosync 环 2:走独立 1GbE 冗余心跳
二、迁移前准备(Checklist 细化)
2.1 盘点 VMware 侧资产(PowerCLI 脚本)
powershell
# 安装 PowerCLI
Install-Module VMware.PowerCLI -Scope CurrentUser -AllowClobber
# 连接 vCenter
Connect-VIServer -Server vcsa.lab.local -User administrator@vsphere.local
# 导出所有 VM 清单
Get-VM | Select Name, PowerState, NumCpu, MemoryGB,
@{N='ProvisionedGB';E={[math]::Round($_.ProvisionedSpaceGB,1)}},
@{N='UsedGB';E={[math]::Round($_.UsedSpaceGB,1)}},
@{N='OS';E={$_.Guest.OSFullName}},
@{N='IP';E={$_.Guest.IPAddress -join ','}},
@{N='Host';E={$_.VMHost.Name}},
@{N='Datastore';E={($_.DatastoreIdList | %{(Get-View $_).Name}) -join ','}} |
Export-Csv -Path C:\vm-inventory.csv -NoTypeInformation -Encoding UTF8
# 导出快照信息
Get-VM | Get-Snapshot | Select VM, Name, Created, SizeGB |
Export-Csv -Path C:\snapshots.csv -NoTypeInformation
# 导出网络端口组
Get-VirtualPortGroup | Select Name, VLanId, VirtualSwitch |
Export-Csv -Path C:\portgroups.csv -NoTypeInformation
2.2 风险分级表(示例)
| VM | 业务 | 等级 | 停机窗口 | 依赖 | 迁移批次 |
|---|---|---|---|---|---|
| web-test-01 | 测试站 | P3 | 任意 | 无 | Wave 0 |
| app-dev-02 | 开发环境 | P3 | 工作日白天 | db-dev-01 | Wave 1 |
| erp-app-01 | ERP 应用 | P1 | 周六 00-04 | erp-db-01, AD | Wave 3 |
| erp-db-01 | ERP 数据库 | P0 | 季度窗口 | 存储 | Wave 4 |
2.3 环境前置检查(源侧)
Step 1:清理过期快照
powershell
Get-VM | Get-Snapshot | Where {$_.Created -lt (Get-Date).AddDays(-3)} | Remove-Snapshot -Confirm:$false
Step 2:记录 MAC 地址
powershell
Get-VM | Get-NetworkAdapter | Select @{N='VM';E={$_.Parent.Name}}, Name, MacAddress, NetworkName |
Export-Csv C:\mac-list.csv -NoTypeInformation
Step 3:验证 ESXi API 访问
bash
nc -zv 10.0.0.11 443
# 预期:Connection to 10.0.0.11 443 port [tcp/https] succeeded!
三、Proxmox VE 安装与集群搭建
3.1 ISO 准备与安装
Step 1:下载 ISO :https://www.proxmox.com/en/downloads
Step 2:写入 U 盘
bash
sudo dd if=proxmox-ve_8.2-1.iso of=/dev/sdX bs=1M status=progress
警告 :确认
of=是 U 盘设备,搞错会擦掉硬盘!
Step 3:安装向导关键选项
┌─────────────────────────────────────────────────┐
│ Proxmox VE Installer │
├─────────────────────────────────────────────────┤
│ Target Harddisk │
│ ┌───────────────────────────────────────────┐ │
│ │ [x] /dev/sda SAMSUNG MZ-960 894GB │ │
│ │ Options → Filesystem: [ zfs (RAID1) ▼] │ │
│ │ compress: [ on ▼] │ │
│ │ ashift: [ 12 ▼] (4K 扇区) │ │
│ │ hdsize: [ 800 ] GB 预留空间 │ │
│ └───────────────────────────────────────────┘ │
│ [ Next ] │
└─────────────────────────────────────────────────┘
推荐:系统盘用 ZFS RAID1(2 块 SSD 镜像),数据盘单独留给 Ceph/LVM。
3.2 安装后初始化
Step 4:切换软件源为无订阅版
bash
ssh root@10.0.0.21
sed -i 's/^deb/#deb/' /etc/apt/sources.list.d/pve-enterprise.list
sed -i 's/^deb/#deb/' /etc/apt/sources.list.d/ceph.list 2>/dev/null
echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" \
> /etc/apt/sources.list.d/pve-no-subscription.list
echo "deb http://download.proxmox.com/debian/ceph-reef bookworm no-subscription" \
> /etc/apt/sources.list.d/ceph-no-subscription.list
apt update && apt -y dist-upgrade
reboot
Step 5:去掉订阅提示弹窗
bash
sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" \
/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
systemctl restart pveproxy
3.3 组建集群
Step 6:在 pve01 创建集群
bash
root@pve01:~# pvecm create lab-cluster --link0 10.0.0.21 --link1 10.0.1.21
root@pve01:~# pvecm status
Step 7:其他节点加入
bash
root@pve02:~# pvecm add 10.0.0.21 --link0 10.0.0.22 --link1 10.0.1.22
root@pve03:~# pvecm add 10.0.0.21 --link0 10.0.0.23 --link1 10.0.1.23
Step 8:Web UI 登录 :https://10.0.0.21:8006
四、存储与网络配置
4.1 配置 LACP + VLAN 网桥
编辑 /etc/network/interfaces:
auto lo
iface lo inet loopback
auto eno1
iface eno1 inet manual
auto eno2
iface eno2 inet manual
auto bond0
iface bond0 inet manual
bond-slaves eno1 eno2
bond-miimon 100
bond-mode 802.3ad
bond-xmit-hash-policy layer2+3
auto vmbr0
iface vmbr0 inet static
address 10.0.0.21/24
gateway 10.0.0.1
bridge-ports bond0
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
auto eno3
iface eno3 inet static
address 10.0.1.21/24
mtu 9000
执行 ifreload -a 应用。
4.2 添加 NFS 共享存储
UI 路径:Datacenter → Storage → Add → NFS
等效 CLI:
bash
pvesm add nfs nfs-migrate --server 10.0.0.50 --export /mnt/migrate --content images,iso
4.3 上传 VirtIO 驱动 ISO
bash
cd /var/lib/vz/template/iso/
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
五、使用 PVE 8.2 原生 ESXi 导入
5.1 添加 ESXi 作为导入源
UI 路径:Datacenter → Storage → Add → ESXi
┌──────────── Add: ESXi ─────────────────────┐
│ ID: esxi-source │
│ Server: 10.0.0.11 │
│ Username: root │
│ Password: ************ │
│ Skip Cert Verify: [✓] │
│ Nodes: All │
└─────────────────────────────────────────────┘
连 vCenter 还是 ESXi? 推荐直接连 ESXi 主机,按主机批量迁移,速度快。
5.2 执行单个 VM 导入
Step 1:源侧关机 VM
powershell
Stop-VM -VM app-dev-02 -Confirm:$false
Step 2:在 PVE 选中 VM → 点 Import
┌─── Import Guest: app-dev-02 ────────────────────────┐
│ VM ID: [ 102 ] │
│ Name: [ app-dev-02 ] │
│ Target node: [ pve01 ▼ ] │
│ Target storage: [ local-zfs ▼ ] │
│ CPU type: [ x86-64-v2-AES ▼ ] │
│ OS Type: [ Linux 6.x/2.6 ▼ ] │
│ ISO for drivers:[ virtio-win.iso ▼ ] │
└─────────────────────────────────────────────────────┘
关键选项说明:
- CPU type :选
x86-64-v2-AES保证跨代 CPU 兼容 - Target storage:选 SSD 存储提升导入速度
- OS Type :Linux 选
Linux 6.x/2.6,Windows 选对应版本
Step 3:观察任务日志
Task viewer: Import guest 'app-dev-02'
──────────────────────────────────────────────────
Querying VM metadata...
Creating VM 102...
Importing disk 'scsi0' (40 GB)...
transferred 40.0 GiB of 40.0 GiB (100.0%)
TASK OK
速度参考:千兆网约 100 MB/s,万兆网约 600-800 MB/s。
Step 4:启动前检查配置
常见修正项:
- 源 VM 是 UEFI 启动 → BIOS 改为
OVMF (UEFI),并添加 EFI Disk - Windows 2012 R2 或更老 → Machine 改为
pc-i440fx - 网卡模型若有兼容问题 → 改为
e1000
六、Windows VM 迁移完整步骤
核心难点:原 VM 使用 LSI/BusLogic 控制器,启动后找不到 VirtIO 磁盘会蓝屏。必须提前在源 VMware 中注入 VirtIO 驱动。
6.1 源侧准备(ESXi 中,VM 开机状态)
Step 1:挂载 virtio-win.iso
vSphere Client:VM 右键 → Edit Settings → CD/DVD Drive → Datastore ISO File
Step 2:安装驱动 (进入 Windows,运行 D:\virtio-win-gt-x64.msi,勾选所有组件)
Step 3:启用 VirtIO 启动驱动(关键!)
cmd
reg add "HKLM\SYSTEM\CurrentControlSet\Services\viostor" /v Start /t REG_DWORD /d 0 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\vioscsi" /v Start /t REG_DWORD /d 0 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\NetKVM" /v Start /t REG_DWORD /d 0 /f
bcdedit /set {current} hypervisorlaunchtype off
没做这一步 :迁移后开机直接蓝屏
STOP 0x0000007B INACCESSIBLE_BOOT_DEVICE。
Step 4:卸载 VMware Tools(控制面板)
Step 5:关机 shutdown /s /t 0
6.2 PVE 侧导入后调整
救急法:如果没装驱动就迁移了,把磁盘临时改为 IDE 启动,进系统后再装驱动切回 VirtIO。
启动后:
- 设备管理器检查无黄色感叹号
- 安装 QEMU Guest Agent(
guest-agent\qemu-ga-x86_64.msi) - PVE Web UI → VM → Options →
QEMU Guest Agent: Enabled
七、Linux VM 迁移完整步骤
7.1 源侧准备
Step 1:确保 initramfs 含 virtio 模块
bash
# CentOS/RHEL
dracut --add-drivers "virtio_blk virtio_scsi virtio_net virtio_pci" -f -v
lsinitrd /boot/initramfs-$(uname -r).img | grep virtio
# Ubuntu/Debian
echo -e "virtio_blk\nvirtio_scsi\nvirtio_net\nvirtio_pci" >> /etc/initramfs-tools/modules
update-initramfs -u -k all
Step 2:检查 fstab 使用 UUID
bash
cat /etc/fstab
# 必须是 UUID=xxx,不能是 /dev/sdX
grep -i "root=" /etc/default/grub
Step 3:切换 Guest Agent
bash
# RHEL 系
dnf remove open-vm-tools -y
dnf install qemu-guest-agent -y
systemctl enable --now qemu-guest-agent
# Debian 系
apt remove open-vm-tools -y
apt install qemu-guest-agent -y
shutdown -h now
八、备份系统 PBS 部署
8.1 PBS 安装
下载 ISO:https://www.proxmox.com/en/downloads/proxmox-backup-server
访问 https://10.0.0.30:8007
8.2 创建 Datastore
UI 路径:Datastore → Add Datastore
Name: backup-main
Backing Path: /mnt/backup
GC Schedule: daily 02:00
Prune Schedule: daily 03:00
Keep Last: 3
Keep Daily: 14
Keep Weekly: 8
Keep Monthly: 12
8.3 PVE 中添加 PBS 存储
获取指纹:
bash
root@pbs01:~# proxmox-backup-manager cert info | grep Fingerprint
UI:Datacenter → Storage → Add → Proxmox Backup Server
8.4 配置备份任务
UI:Datacenter → Backup → Add
九、HA 配置实操
9.1 前置检查
bash
pvecm status | grep Quorate # 必须 Yes
pvesm status # 必须有 shared=1 存储
systemctl status pve-ha-lrm
9.2 创建 HA 组
UI:Datacenter → HA → Groups → Create
9.3 为 VM 启用 HA
bash
ha-manager add vm:102 --group critical-vms --max_restart 3 --state started
ha-manager status
9.4 故障演练
bash
# 在 pve01 上硬断电
echo b > /proc/sysrq-trigger
# 在 pve02 观察
watch -n 1 "ha-manager status"
预期:约 2 分钟内 VM 在其他节点启动。
十、批量迁移脚本
10.1 CLI 导入单个 VM
bash
pvesh get /nodes/pve01/storage/esxi-source/content
qm importovf 200 /mnt/esxi/app-dev-02/app-dev-02.ovf local-zfs --format qcow2
qm disk import 200 esxi-source:ha-datacenter/app-dev-02/app-dev-02.vmdk local-zfs
10.2 批量脚本
bash
#!/bin/bash
# batch-import.sh
CSV=/root/migrate-list.csv
ESXI_STORE="esxi-source"
while IFS=, read -r vmname vmid storage node; do
[[ "$vmname" == "vmname" ]] && continue
echo "=== Importing $vmname as VMID $vmid to $node:$storage ==="
pvesh create /nodes/$node/qemu \
--vmid $vmid \
--name $vmname \
--import-working-storage $storage \
--storage $storage \
--source $ESXI_STORE:ha-datacenter/$vmname/$vmname.vmx
if [ $? -eq 0 ]; then
echo "[OK] $vmname"
else
echo "[FAIL] $vmname" >> /root/migrate-failed.log
fi
done < "$CSV"
CSV 示例:
vmname,vmid,storage,node
web-test-01,201,local-zfs,pve01
app-dev-02,202,local-zfs,pve02
app-dev-03,203,local-zfs,pve03
十一、故障排查速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| Windows 启动蓝屏 0x7B | 缺 VirtIO 驱动 | 改 IDE 启动 → 装驱动 → 改回 SCSI |
| Linux dropped to shell | fstab 用了 /dev/sdX | 救援盘进单用户改 UUID |
| 导入任务卡在 0% | ESXi API 限速/证书 | 检查 ESXi 负载,勾 skip cert |
| 导入速度慢(<50MB/s) | 源 ESXi thin 读取慢 | 先 Storage vMotion 到 thick |
| VM 启动后无网络 | MAC 变了或网卡名变 | 改回原 MAC;Linux 改 netplan |
| "No bootable device" | UEFI/BIOS 不匹配 | 改 BIOS 为 OVMF 加 EFI Disk |
| HA 不触发切换 | 没配 fencing/watchdog | 安装 watchdog,配置 IPMI fence |
| Ceph 性能低 | 网络或 OSD 盘问题 | 25GbE + 企业级 NVMe |
| 集群脑裂 | corosync 延迟过高 | 独立心跳网,link1 冗余 |
| PBS 备份 no space | GC 未运行 | 手动 garbage-collection start |
十二、迁移后验证清单
技术层面(每台 VM)
□ VM 成功启动,操作系统登录正常
□ 时间同步正确
□ 所有磁盘挂载正常
□ 网卡 IP/网关/DNS 正确,可 ping 外网
□ VirtIO 驱动加载(Windows 设备管理器无感叹号)
□ QEMU Guest Agent 运行
□ 业务服务端口监听
□ 业务冒烟测试通过
□ 备份任务能正常跑
□ 源 VMware VM 标记"保留 30 天不删"
集群层面
□ pvecm status 所有节点 online
□ Ceph/存储健康
□ HA 演练至少一次成功
□ 备份成功率 > 99%
□ PBS GC/Prune 运行正常
□ 监控告警配置到位
□ 运维文档与账号交接完成
□ VMware 许可证到期日已记录
附录 A:常用 qm/pct 命令速查
bash
# VM 操作
qm list
qm start 100
qm shutdown 100
qm stop 100
qm migrate 100 pve02 --online
qm config 100
qm set 100 -memory 8192
qm resize 100 scsi0 +10G
# 磁盘导入
qm disk import 100 /path/to/disk.vmdk local-zfs
qm disk import 100 /path/to/disk.qcow2 local-zfs
# 快照
qm snapshot 100 before-upgrade
qm rollback 100 before-upgrade
qm delsnapshot 100 before-upgrade
# 备份
vzdump 100 --storage pbs-main --mode snapshot --compress zstd
附录 B:PowerCLI 批量关机脚本
powershell
$batch = @("app-dev-02","app-dev-03","web-test-01")
foreach ($vm in $batch) {
Write-Host "Shutting down $vm ..."
Shutdown-VMGuest -VM $vm -Confirm:$false
}
do {
Start-Sleep 10
$running = Get-VM -Name $batch | Where PowerState -eq "PoweredOn"
Write-Host "Still running: $($running.Count)"
} while ($running.Count -gt 0)
Write-Host "All VMs powered off, safe to import."
本手册版本 v2.0 | 实际迁移前请在测试环境完整演练至少一次
参考:Proxmox VE 官方文档、PVE 8.2 ESXi Import 发布说明、Red Hat virtio-win 项目