[PVE][ESXI]PVE迁移虚拟机到ESXI

miaodi
发布于 2020-12-08 / 7223 阅读
0

[PVE][ESXI]PVE迁移虚拟机到ESXI

前言

PVE和ESXI都是比较常见的虚拟化系统。
PVE和ESXI的优缺点,网络上已经总结的很详细了。这里就不说了。
之前用的服务器是家用平台,6代i5处理器,装ESXI各种不兼容。而且只支持4根低电压ddr3的台式机内存条,内存兼容性差,且ddr3内存容量低。
最近组装了一台新的服务器,冲着ESXI去的,选购配件的时候就着重了兼容性。
中间过程略去,这里主要记录下虚拟机迁移的过程。

LINUX系统迁移

网上的教程,全部都是从esxi迁移到pve的,而且大多是直接复制粘贴的教程,毫无修改,从pve到esxi的几乎没见到。

那首先来看几篇ESXI->PVE的教程吧,
方法一: ESXI导出虚拟机->上传虚拟机到PVE->使用PVE自带工具qm importovf导入到PVE->修改部分数据使其兼容。
方法二:ESXI导出vmdk文件(相当于磁盘)->上传到PVE->PVE新建虚拟机->挂载上传的vmdk文件为虚拟机的磁盘,并做为启动盘

方法一中可以看出来,最重要的就是qm importovf这个工具,查看下importovf的作用和用法:

root@pve111:~# qm help importovf
USAGE: qm importovf <vmid> <manifest> <storage> [OPTIONS]

  Create a new VM using parameters read from an OVF manifest

  <vmid>     <integer> (1 - N)

	     The (unique) ID of the VM.

  <manifest> <string>

	     path to the ovf file

  <storage>  <string>

	     Target storage ID

  -dryrun    <boolean>

	     Print a parsed representation of the extracted OVF parameters,
	     but do not create a VM

  -format    <qcow2 | raw | vmdk>

	     Target format



可以看出来是根据ovf文件在PVE中创建新的虚拟机,不适用于导出虚拟机。
那再查下qm下还有哪些方法吧:

root@pve111:~# qm
ERROR: no command specified
USAGE: qm <COMMAND> [ARGS] [OPTIONS]

       qm cloudinit dump <vmid> <type>

       qm guest cmd <vmid> <command>
       qm guest exec-status <vmid> <pid>
       qm guest passwd <vmid> <username> [OPTIONS]
       qm guest exec <vmid> [<extra-args>] [OPTIONS]

       qm clone <vmid> <newid> [OPTIONS]
       qm config <vmid> [OPTIONS]
       qm create <vmid> [OPTIONS]
       qm delsnapshot <vmid> <snapname> [OPTIONS]
       qm destroy <vmid> [OPTIONS]
       qm list  [OPTIONS]
       qm listsnapshot <vmid>
       qm migrate <vmid> <target> [OPTIONS]
       qm move_disk <vmid> <disk> <storage> [OPTIONS]
       qm pending <vmid>
       qm reboot <vmid> [OPTIONS]
       qm reset <vmid> [OPTIONS]
       qm resize <vmid> <disk> <size> [OPTIONS]
       qm resume <vmid> [OPTIONS]
       qm rollback <vmid> <snapname>
       qm sendkey <vmid> <key> [OPTIONS]
       qm set <vmid> [OPTIONS]
       qm shutdown <vmid> [OPTIONS]
       qm snapshot <vmid> <snapname> [OPTIONS]
       qm start <vmid> [OPTIONS]
       qm stop <vmid> [OPTIONS]
       qm suspend <vmid> [OPTIONS]
       qm template <vmid> [OPTIONS]
       qm unlink <vmid> --idlist <string> [OPTIONS]

       qm cleanup <vmid> <clean-shutdown> <guest-requested>
       qm importdisk <vmid> <source> <storage> [OPTIONS]
       qm importovf <vmid> <manifest> <storage> [OPTIONS]
       qm monitor <vmid>
       qm mtunnel 
       qm nbdstop <vmid>
       qm rescan  [OPTIONS]
       qm showcmd <vmid> [OPTIONS]
       qm status <vmid> [OPTIONS]
       qm terminal <vmid> [OPTIONS]
       qm unlock <vmid>
       qm vncproxy <vmid>
       qm wait <vmid> [OPTIONS]

       qm help [<extra-args>] [OPTIONS]

输入qm help 可以查看每个命令的简单介绍和用法,这里看了一遍,没有合适的,这条路放弃。


方法二来说具有一定的可行性。
从PVE导出虚拟机磁盘 -> 上传到ESXI -> ESXI创建新的虚拟机 -> 将上传的磁盘挂载为启动盘
按照这个流程只要解决第一步和最后一步就行了。
最后一步当中,经过测试只能挂载vmdk格式的文件,貌似ESXI还会校验vmdk文件,能自动识别是不是虚拟磁盘。
所以只要解决第一步:从PVE中导出虚拟磁盘,且为vmdk格式。

先来看下从PVE中导出虚拟机试试,网页管理端中有 克隆、转换成模板、迁移、备份等。

  • 克隆是直接创建一个一样的虚拟机,肯定不行。
  • 转成模板之后也没有其他操作
  • 迁移是在PVE集群中迁移,没有其他操作。
  • 备份之后的格式是vma格式,貌似只有PVE能用。
    上述都不能用,只好找其他方法。
    PVE中的存储池是分功能的。
    比如 磁盘映像、ISO镜像、容器、容器模板等。
    那么只要找到磁盘映像存放位置应该就行。
    image.png

可以看到PVE中磁盘映像都是raw格式存储,并且大概率是使用一个文件。

使用搜索功能查下镜像119的磁盘映像,119装的是centos7系统,里面跑着的是harbor仓库。

root@pve111:~# find / -name vm-119-disk-0
/dev/vg-x600/vm-119-disk-0
/run/schroot/mount/alpine-f3c692a3-96bb-4537-ad61-fd2ae001832d/dev/vg-x600/vm-119-disk-0
root@pve111:/dev/vg-x600# ls -l /dev/vg-x600/*119*
lrwxrwxrwx 1 root root 8 Dec  8 18:05 /dev/vg-x600/vm-119-disk-0 -> ../dm-28

可以看到,119的磁盘映像指向/dev/dm-28

root@pve111:/dev# ls -l /dev/dm-28
brw-rw---- 1 root disk 253, 28 Dec  8 18:05 /dev/dm-28

b格式代表外接设备,如磁盘等
大概率这个就是raw格式的虚拟磁盘(猜的)。
使用qemu-img命令试着转换下。

qemu-img convert -f <原格式> -O <目标格式> <原文件路径> <目标文件路径> 
这里 -f <原格式>可以忽略。qemu-img会自动识别

这里输入
root@pve111:/dev# qemu-img convert -f raw -O vmdk /dev/dm-28 /dev/vm119.vmdk
等待了一分钟左右,报错了:qemu-img: error while writing sector 49012725: No space left on device
硬盘空间不足。。。
这次直接拷贝到nfs挂载的nas上
root@pve111:/mnt/pve/NFS_103/frompve# qemu-img convert -f raw -O vmdk /dev/dm-28 /mnt/pve/NFS_103/frompve/vm119.vmdk
这次不到30秒搞定了。。。可能两台设备之间是万兆连接的,之前本地拷贝是在固态和垃圾固态之间拷贝。

转换好之后将vmdk文件上传到ESXI,我这里启用了nfs共享,就不用上传了。
下面就是创建虚拟机。
image.png
系统类型和之前一致。硬盘删除掉,mac地址和之前一致,方便dhcp服务器分配ip,新机器内存大,用不完,多给点内存。

然后编辑设置->添加现有硬盘—>选择上传的vmdk文件。控制类型选择和之前PVE里面一样的。点击保存,会自动多分配一点硬盘空间,再次打开即可看到。
image.png
如果控制器类型不一致的话在启动时ESXI会提示,比如我PVE里面使用的是vitro SCSI控制器,ESXI里面也选择SCSI,提示控制器类型不对,无法启动,改成IDE控制器正常。需要用户自己选择试下,错了也没事。

点击启动后正常引导,进入系统:
image.png
查看下ip地址是否正确:ifconfig

启动harbor:
docker-compose start

浏览器查看下harbor:
image.png

迁移成功!

windows系统的话,经过测试,依然可行,迁移后安装vmtools,流畅运行。

总结

PVE中转换虚拟磁盘为vmdk格式 -> 从PVE导出虚拟磁盘 -> 上传到ESXI -> ESXI创建新的虚拟机 -> 将上传的磁盘挂载为启动盘

3.1 查找虚拟磁盘位置

image.png
如图,一般来说在local-lvm中可以查到虚拟磁盘的名称,如果添加了多个磁盘的,后缀会从0开始累加。

使用find / -name vm-100-disk-0查找虚拟磁盘的位置
一般来说都在/dev路径下。

查找到对应的虚拟磁盘文件,比如vm-119-disk-0的磁盘映像实际是/dev/dm-28

3.2 转换虚拟磁盘为vmdk格式

qemu-img convert -f <原格式> -O <目标格式> <原文件路径> <目标文件路径> 
这里 -f <原格式>可以忽略。qemu-img会自动识别

如:
qemu-img convert -f raw -O vmdk /dev/dm-28 /dev/vm119.vmdk

3.3 下载vmdk文件,并上传到esxi。

使用文件传输工具连接PVE进行下载。
mac下可以使用 Royal TSX等软件
windows下可以使用Bitvise等软件

将下载的vmdk文件上传到ESXI的数据任一存储文件夹。

我是PVE和ESXI都挂载了NAS的nfs共享,PVE直接将转换后的vmdk文件存入NAS中,ESXI直接读取。

3.4 ESXI中创建虚拟机

根据之前虚拟机的系统类型进行设置,
删除自动生成的硬盘。
mac地址可以改为和原来的一样的,网络驱动器类型选择兼容的就行,无法识别的话关机重新改也行。

注意事项

  1. PVE中,原来的虚拟机硬盘设置使用的是scsi控制器,ESXI中设置SCSI控制器时不识别,提示错误的硬盘类型,改为IDE0后正常启动。
  2. windows系统迁移中,ESXI中启动方式记得改成和PVE中一样的,PVE默认是seabios启动,ESXI默认是UEFI启动。两边启动方式不一致时会导致启动失败。

参考

vmware-VM迁移至Proxmox VE教程
https://foxi.buduanwang.vip/virtualization/375.html/

linux – 如何从Proxmox迁移到VMWare?
https://bbs.csdn.net/topics/394369679

PVE使用qemu-img转换磁盘格式
https://foxi.buduanwang.vip/linux/370.html/

本文链接:
https://www.bfmiaodi.cn/archives/pve迁移虚拟机到esxi