在实际运维中,常会遇到需要将 Proxmox VE(PVE) 上运行的虚拟机迁移到 VMware(Workstation / ESXi) 的场景。
由于两者在 磁盘存储、控制器类型、网卡驱动 等方面存在差异,直接拷贝往往会导致系统无法启动或网络丢失。
本文基于一次真实生产环境迁移,记录 从 PVE 导出虚拟机磁盘 → 转换格式 → 导入 VMware → 修复网络 的完整过程,适合 CentOS 7 / Linux 类系统 的离线迁移场景。
一、迁移前环境说明
1.虚拟机基本信息
- 操作系统:CentOS 7 x86_64
- 内核版本:3.10.x
- 架构:x86_64
- PVE 存储类型:
local-lvm(LVM 逻辑卷) - 磁盘:
- 系统盘:32G
- 数据盘:500G
2. 虚拟机关键配置(PVE)
- 查询对应的虚拟机id
- 查询系统信息
qm config 102
关键字段如下:
scsihw: virtio-scsi-single
scsi0: local-lvm:vm-102-disk-0,size=32G
scsi1: local-lvm:vm-102-disk-1,size=500G
net0: virtio=56:95:E4:8D:4E:84,bridge=vmbr0
二、迁移前必须了解的几个关键点
1. 存储类型说明(非常重要)
local-lvm → LVM 逻辑卷存储(块设备)
这意味着磁盘实际路径类似:
/dev/pve/vm-102-disk-0
/dev/pve/vm-102-disk-1
不是文件形式,VMware 无法直接使用,必须导出 / 转换为 .vmdk。
2. 磁盘控制器兼容性
- PVE 使用:
VirtIO-SCSI - VMware 不支持 VirtIO-SCSI 控制器模型
3. 网卡驱动问题(高频坑)
net0: virtio=...
-
VirtIO 网卡 VMware 不支持
-
迁移后系统会 无网卡 / eth0 消失
推荐做法:可以在PVE中提前切换为E1000:
qm set 102 --net0 e1000=56:95:E4:8D:4E:84,bridge=vmbr0
启动确认网络正常后再导出,可避免迁移后网络问题。但因为本人原PVE的虚拟机仍要投入生产,想着不改不错的原则,并未对网卡做修改
三、迁移前检查清单
☑ 虚拟机已关机
☑ 存储类型确认(local-lvm)
☑ 架构一致(x86_64)
☑ 网卡切换为 E1000(推荐)
如果在 PVE 中已提前将网卡切换为 E1000,且迁移后虚拟机能够正常获取 IP 并联网,则可跳过本文第六节「迁移后网络修复」
☑ VMware 环境准备完成
四、PVE 端操作:导出磁盘
1.关闭虚拟机
qm shutdown 102
2. 查询虚拟机是否关闭
注明:图片是我实操之前实验的另一台id为104的虚拟机
qm status 102
# 输出status: stopped
3. 找到磁盘文件
qm config 102 | grep disk
4. 挂载外部硬盘
- 插入硬盘后使用lsblk命令列出所有块设备
lsblk
- 创建挂载目录
mkdir -p /mnt/sdb
成功: 没有输出(静默执行表示成功)
失败: 若提示“权限不足”,请确认是 root 用户。
- 挂载硬盘
mount /dev/sdb1 /mnt/sdb
成功:无输出。
失败:若提示 mount: unknown filesystem type,可能没格式化;执行下面命令
⚠提示:实操中我从未执行过下面的格式化命令,慎重操作
lsblk -f /dev/sdb1
- 验证挂载成功
df -h | grep sdb
成功样例:/dev/sdb1 1.8T 200G 1.6T 12% /mnt/sdb
失败: 没有任何输出,说明未挂载成功。
- 准备导出目录
在外部硬盘中创建目录,用于拷贝
mkdir -p /mnt/sdb/vm102
5. 导出 PVE 磁盘为 VMware 格式
直接从 LVM 转换为 VMDK(推荐方式)
- 导出系统盘
qemu-img convert -p -f raw -O vmdk /dev/pve/vm-102-disk-0 /mnt/sdb/vm102/vm102-disk0.vmdk
- 导出数据盘
qemu-img convert -p -f raw -O vmdk /dev/pve/vm-102-disk-1 /mnt/sdb/vm102/vm102-disk1.vmdk
- 验证导出结果
ls -lh /mnt/sdb/vm102/
- 验证导出文件的逻辑容量(虚拟大小)(可选操作)
qemu-img info /mnt/sdb/vm102/vm102-disk1.vmdk
正常输出会类似:
image: /mnt/sdb/vm104/vm104-disk1.vmdk
file format: vmdk` ` virtual size: 100G (107374182400 bytes)
disk size: 77G
解释:
- virtual size: VMware 看到的虚拟容量(100G)
- disk size: 实际文件大小(77G)
- file format: vmdk(没问题)
所以在 VMware 里,这块盘依然会显示为 100 GB 的虚拟磁盘。
6. 卸载硬盘
- 导出完成后卸载
umount /mnt/sdb
成功:无输出。
若提示 “target is busy”,执行下面命令,查看哪个进程占用后结束它。
lsof | grep /mnt/sdb
7. 传输
- 拔下硬盘带去 VMware
- 或用 SCP 拷贝:
# 验证机104到192.168.65.32机器上去验证
scp -r /mnt/sdb/vm104 root@192.168.65.32:/vmfs/volumes/datastore1/
五、VMware 侧导入虚拟机
1. 创建虚拟机
插入硬盘后,把硬盘中的要拷贝的文件复制到电脑中,下面操作不要直接选用硬盘中的文件!!!!
我选择的Workstation 15.x,可根据需要自行选择
【实操和图片不一致】:选择稍后安装,因为已经有PVE导出来的系统盘和数据盘文件,不需要安装操作系统
【实操和图片不一致:血与泪的教训】:选择准虚拟化SCSI(P)
【实操和图片不一致:血与泪的教训】:选择IDE(I)
选择硬盘中的磁盘文件,并且要保持现有格式
网络适配器->网络连接->桥接模式下,要勾选“复制物理网络连接状态”
创建好虚拟机后,右键“设置”->硬盘,选择添加,将第二个磁盘文件放进去,或者在创建虚拟机时选择添加第二块磁盘
六、迁移后网络修复(CentOS 7)
若使用 DHCP 可跳过;仅适用于固定 IP 场景。
下面以固定为192.168.230.116为例
删除旧网卡配置
cd /etc/sysconfig/network-scripts/
mv ifcfg-eth0 ifcfg-eth0.bak 2>/dev/null
(通用方法)使用 NetworkManager(nmcli)
适用于 大多数 CentOS 7 / VMware 场景。
nmcli con show # 查看当前连接名(一般是 "Wired connection 1" 或 "ens33")
nmcli con mod "有线连接 1" \
ipv4.addresses 192.168.230.116/24 \
ipv4.gateway 192.168.230.1 \
ipv4.dns 8.8.8.8 \
ipv4.method manual
nmcli con up "有线连接 1"
nmcli con show ens33
验证
-
查看实际网卡状态:
ip addr show ens33 -
然后查看该连接的详细 IPv4 配置:
nmcli con show "有线连接 1" | grep ipv4 -
查看输出的关键字段:
-
ipv4.methodmanual→ 静态 IPauto→ DHCP
-
ipv4.addresses→ 显示分配的 IP,例如192.168.230.116/24 -
ipv4.gateway→ 网关,例如192.168.230.1 -
ipv4.dns→ DNS,例如8.8.8.8
-
如果 ipv4.method: manual 且地址为 192.168.230.116,说明 IP 已固定。
(传统方法):通过 ifcfg 文件配置,由 NetworkManager 生效
1. 创建 ens33 配置
确保存在配置文件,如果不存在,就创建
ls /etc/sysconfig/network-scripts/ifcfg-ens33
编辑ens33配置
vi /etc/sysconfig/network-scripts/ifcfg-ens33
内容如下:
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.230.116
PREFIX=24
GATEWAY=192.168.230.1
DNS1=8.8.8.8
确保 NetworkManager 自启,禁用 network 服务:
systemctl disable network
systemctl stop network
systemctl enable NetworkManager
systemctl restart NetworkManager