背景描述
最近由于ESXi7虚拟机在PCIE直通的过程中一直报“已启用/需要重新引导”,修改ACScheck仍不生效。于是决定迁移十台虚拟机到PVE平台。(后来重装esxi修好了,但是心累了
虚拟机迁移
本次虚拟机迁移由于时间仓促,采用直接复制+手动创建恢复的方式恢复虚拟机。没有导出ovf文件,也没有自动迁移。因此该方案也适合esxi无法启动场景下的虚拟机迁移。
导出虚拟机
将所有虚拟机从esxi的数据分区拷贝到系统外部。有条件的可以使用NFS或者物理磁盘,我在这里只能SSH拷贝(其他方式均失效),非常艰苦的拷贝了一宿。
安装PVE系统
可以参考网上的其他教程或者我之前的文章。https://blog.wolfbolin.com/archives/845
创建虚拟机
在徒手创建虚拟机时一般遵从以下特点:
- OS:不使用任何媒体/Do not use any media
- System/Machine:选用Q35
- System/BIOS:esxi创建虚机时默认使用EFI
- 根据虚机系统盘选择,ovf导入的也可能不准确
- Add EFI Disk:不选择(取消勾选)
- Disks:删除自动添加的scsi0,之后再手工导入迁移的系统盘
- CPU/Type:建议选择host
- ESXi默认向虚机暴露所有指令集,选择host最还原(主要目的并不是为了高性能)
- 使用aprl/rr等黑群晖系统的重点关注该选项。关注是否匹配迁移前的CPU架构。
- Network/Model:建议vmxnet3
- 注意还原迁移前虚拟机选项,避免进入系统后不识别或IP拿不到。
- 如果你还记得当时选择的网卡类型和MAC地址,需要尽可能还原。
对于黑群晖系统(arpl/rr引导)额外多说一点。系统机型虽然有其匹配的架构,但是黑群晖不一定必须要运行在对应架构的CPU上,只要系统运行所需指令集能满足要求就可以编译运行。
例如我的主机是EPYC 7k62,使用的系统是RS4021+,原生CPU架构是Broadwell,但是不妨碍它可以在AMD EPYC上运行。
因此在迁移黑群晖时,要尤其关注当时安装黑群晖时是如何运行在CPU上的,如果迁移时CPU架构发生了变化,建议找对应的CPU Type进行模拟。多试试能配得上的,不能一概而论。
虚拟机磁盘导入
在完成PVE安装后将esxi的虚拟机文件夹拷贝回pve机器中,或者通过NFS挂载的方式使虚拟机数据可访问。此处不要直接复制到新建虚拟机的目录下,主要是需要虚拟机的vmdk和flat.vmdk文件。
进入虚拟机备份目录后使用qm命令导入。该命令会复制一份磁盘数据到PVE存储中,不会修改或覆盖现有的磁盘数据,如果导入中存在问题可以重复尝试。
参考如下命令:
qm importdisk PVE虚机ID ESXi磁盘文件 --format=qcow2
该命令用于向指定PVE虚拟机中创建一个新的磁盘,并将现有的磁盘数据拷贝到新磁盘中,并且指定新的磁盘格式为qcow2(即PVE默认磁盘格式)。
举例导入Elasticsearch虚拟机磁盘到手工创建的104号虚拟机。
> cd /opt/esxi_vm/Elasticsearch/
Elasticsearch-flat.vmdk Elasticsearch.nvram Elasticsearch.vmdk Elasticsearch.vmsd Elasticsearch.vmx
> qm importdisk 104 Elasticsearch.vmdk local --format=qcow2
importing disk 'Elasticsearch.vmdk' to VM 104 ...
Formatting '/var/lib/vz/images/104/vm-104-disk-0.qcow2', fmt=qcow2 cluster_size=65536 ...
transferred 20.0 GiB of 20.0 GiB (100.00%)
Successfully imported disk as 'unused0:local:104/vm-104-disk-0.qcow2'
手工挂载磁盘分区到虚拟机
如果是Windows系统请直接看下文驱动安装,Windows直接挂载SCSI会失败。
Linux内核的虚拟机(大部分)可以直接使用SCSI的方式挂载虚拟机磁盘。在PVE的虚拟机管理页面中找到
- Handware > Unused Disk 0(选中)> Edit > SCSI(下拉选择)> Add
- Options > Boot Order > Edit > scsi0(仅勾选这一个)> OK
直通等更多功能的还原
上述操作完成后理论上就可以启动一个纯虚拟化的机器。但是虚拟机在ESXi上存在一些特殊调教时,可能需要额外的操作。此处给出不完全的列举和方案:
- ESXi中使用了硬件直通:对于HBA卡和网卡直通,可以直接在硬件管理界面添加PCIE设备,同时选择
All Function
选项。该操作强烈建议PVE虚拟机是Q35机型,i440fx大概率会踩坑。如果是核显直通,则需要完成在PVE中的所有准备工作后再挂载核显到虚拟机(包括关闭PVE显示输出,和虚拟机画面Hardware>Display->none) - ESXi中选择了保留全部内存:在ESXi中存在PCIE设备时需要锁定全部内存,但是在PVE中无需(默认)执行了该操作,因此无需特殊处理。
- 在ESXi中安装了额外的硬件驱动:PVE的硬件兼容性比ESXi更优秀,但是如果识别有问题可以直接参考PVE相关的问题帖子。
现有Windows虚拟机安装VirtIO驱动
对于迁移的Windows虚拟机无法像多数教程上描述的在安装时挂载virtio-win.iso
。因此需要在磁盘导入到PVE虚拟机后,先以SATA总线挂载系统分区,通过命令行进行磁盘格式修复后再以SCSI形式挂载。
踩坑1:以SATA挂载后进系统手动安装vioscsi的方式无法修复系统盘错误
踩坑2:直接以SCSI挂载的方式进系统会反复蓝屏,安全模式也救不了
正确的方案:
Step1:以SATA总线的方式挂载Windows系统盘。
Step2:挂载VirtIO驱动镜像,通过Fedora链接下载最新的。
Step3:挂载Windows安装镜像(推荐Win10,不是真的要安装)
Step4:修改启动顺序:勾选windows安装镜像并放在第一个(其他不重要)
Step5:以SeaBIOS方式启动虚拟机,虚拟机启动时需要按任意键进入安装镜像
Step6:在Windows安装镜像启动后按 Shift+F10
进入命令行界面(没进安装镜像的需要重试)
Step7:列出所有盘符检查系统盘和驱动镜像是否存在
X:> fsutil fsinfo drivers
Drivers: C:\ D:\ E:\ X:\
C通常是引导盘,D盘通常是系统盘,E盘通常是驱动盘。可以通过切换盘符 C:
并检查文件 dir
的方式检查分区是否正确。
Step8:使用命令修复系统盘,盘符需要对应
dism /image:D:\ /add-driver /driver:E:\vioscsi\w10\amd64
正斜线和反斜线别搞错了,空格不要敲错了
Step9:修复完成后使用命令关机,不要直接使用shutdown
wpeutil shutdown -s
Step10:虚拟机关闭后Remove所有ISO镜像,Detach系统盘并重新以SCSI总线方式挂载。
Step11:重新启动虚拟机。
经过上述的一波操作后,虚拟机的系统盘中已经写入了vioscsi
驱动,这样就可以正常进入系统了。