PVE迁移虚拟机到VMware的实操指南

124 阅读6分钟

在实际运维中,常会遇到需要将 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

image.png

  • 查询系统信息

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. 卸载硬盘

  1. 导出完成后卸载
umount /mnt/sdb

成功:无输出。

若提示 “target is busy”,执行下面命令,查看哪个进程占用后结束它。

lsof | grep /mnt/sdb

7. 传输

  1. 拔下硬盘带去 VMware
  2. 或用 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.method

      • manual → 静态 IP
      • auto → 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