介绍

当前我们有一整套运行长达5年之久的,因服务器逐步报废的原因,我们决定将所有的虚拟主机迁移至。是采用Kolla部署的Train版本的高可用环境,Ceph为独立部署的版本。

当前我们需要从 ESXi 迁移超过220个虚拟机(Linux和)到。除了主机外,还有少部分的Hyper-V虚拟主机也要进行迁移。本文将为大家演示用于迁移虚拟机的步骤和命令。通过这些步骤和命令,可以轻松创建自动进行迁移的脚本。

本次迁移仅仅涉及V2V,不涉及任何的P2V。

比较新版本的-tools和qemu-img 可以很好地处理VMDK文件(旧版本的工具存在一些问题),因此迁移效率更高。迁移过程中去除了从VMDK到VMDK(单个文件)以及从VMDK到RAW 的转换步骤。通过减少这些步骤,使迁移速度将加倍。

迁移过程中需要注意本文涉及到的命令,因为一些命令非常强大,并且可以破坏Ceph和中的配置和数据。因此,请谨慎的使用相关的命令

全局步骤安装驱动程序扩展分区(可选)自定义虚拟机(可选)创建卷将VMDK转换为Ceph创建端口(可选)在中创建和启动实例技术指标

以下是用于迁移的基础结构的规范:

需求

Linux“迁移服务器”(可以使用 14.04/16.04/18.04,/,/,-22),同时需满足以下需求:

我们使用的服务器配置为,8核Intel Xeon E3-1230@3.3 GHz,64 GB RAM,8块1TB SSD,并且每小时能够迁移超过500 GB 。但是,这实际上取决于实例磁盘空间的使用情况。我的旧公司笔记本电脑(Core i5和8GB RAM和一个旧的 HDD)也可以工作,但是显然性能很差。

在迁移之前还要满足如下需求:

步骤1.注入驱动程序1.1 2012

从 2012和 8.0开始,驱动程序受 保护。在脱机磁盘中注入驱动程序非常困难。 2012默认无法从硬盘启动。因此,我采取了以下后续步骤将驱动程序安装到中。请注意,这些步骤应适用于所有经过测试的版本(2008/2012/2016)。

创建一个新的KVM实例。确保将 vmdk磁盘创建为IDE磁盘!网卡应该是设备。添加额外的磁盘,以便可以安装驱动程序。当然,您应该添加包含驱动程序的 ISO或软盘驱动器。您还可以使用virt-copy-in 注入驱动程序文件,并注入必要的注册表设置以自动安装驱动程序。启动虚拟机,并给大约两分钟时间,以找到新的硬件。为所有新发现的硬件安装驱动程序。确认没有设备没有安装驱动程序。关闭系统并卸下额外的磁盘。将 vmdk磁盘重新定义为磁盘(这是IDE)并启动实例。现在应该可以正常启动了。关闭 虚拟机。1.2 Linux(内核2.6.25及更高版本)

Linux 2.6.25及更高版本的内核已经内置了对硬件的支持。因此,无需注入驱动程序。 使用硬件创建并启动新的KVM虚拟机。如果LVM分区没有自动安装,请运行以下命令进行修复:

mount -o remount,rw /pvscanvgscanreboot

(重新启动后,所有LVM分区都应该挂载,Linux应该可以正常启动)

完成后关闭虚拟机。

1.3 Linux(2.6.25之前的内核)

一些Linux发行版提供了用于较旧内核版本的模块:

较旧内核的步骤是:

创建KVM实例:Linux(内核2.6.25之前):使用IDE硬件创建和启动KVM实例(由于只能配置一个IDE 控制器而导致产生4个磁盘,因此KVM中限于4 个磁盘!)。我没有尝试过SCSI或SATA,因为本次迁移中只有不超过4个磁盘的Linux虚拟机。Linux应该启动没有问题。加载模块(特定于发行版):RHEL(旧版本): 和SLES 10 SP3系统:关闭实例。将所有磁盘更改为磁盘并启动实例。现在应该可以正常启动了。完成后关闭虚拟机。对于Red Hat,请参阅:对于SuSe,请参阅:1.4 2008(及更低版本);不推荐使用

对于2012之前的版本,您还可以使用以下步骤插入驱动程序。

将相应版本的所有驱动程序文件复制到C:。您可以使用工具virt-copy-in将文件和文件夹复制到虚拟磁盘中。将* .sys文件复制到%%%(您可能希望使用virt-ls查找正确的目录。请注意中的大小写)。您可以使用工具virt-copy-in将文件和文件夹复制到虚拟磁盘中。注册表应结合硬件ID和驱动程序,但默认情况下中未安装驱动程序。因此,我们需要自己做。您可以使用virt-win-reg 注入注册表文件。如果您选择将所有驱动程序复制到C:以外的其他位置,则必须在最后一行更改“ ” 变量(最简单的方法是在外部系统上进行更改,然后导出注册表文件,从而提供给迁移虚拟机使用)。

注册表文件(也称为.reg,因为它仅保存存储信息):

 Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1001&subsys_00000000]"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}""Service"="viostor"[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1001&subsys_00020000]"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}""Service"="viostor"
[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1001&subsys_00021AF4]"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}""Service"="viostor"[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1001&subsys_00021AF4&rev_00]"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}""Service"="viostor"
[HKEY_LOCAL_MACHINESYSTEMControlSet001ControlCriticalDeviceDatabasepci#ven_1af4&dev_1004&subsys_00081af&rev_00]"ClassGUID"="{4D36E97B-E325-11CE-BFC1-08002BE10318}""Service"="viostor"[HKEY_LOCAL_MACHINESYSTEMControlSet001Servicesviostor]"ErrorControl"=dword:00000001"Group"="SCSI miniport""Start"=dword:00000000"Tag"=dword:00000021"Type"=dword:00000001"ImagePath"="system32driversviostor.sys"
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersion]"DevicePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,69,00,6e,00,66,00,3b,00,63,00,3a,00,5c,00,44,00,72,00,69,00,76,00,65,00,72,00,73,00,00,00

执行完这些步骤后,应从不带BSOD的 磁盘引导。

引导时,所有其他驱动程序(网络,等)也应自动安装。

请参阅: (为 XP 编写,但仍可用于 2003和2008)。

另请参阅:和

2.展开分区(可选)

迁移的某些服务器在分区上的可用磁盘空间有限。没有足够的空间来安装新的管理应用程序。所以,可以使用用-工具,以增加磁盘的大小。然后,您仍然需要从操作系统扩展分区。您可以在下一步中自定义虚拟机时执行此操作。

3.自定义虚拟机(可选)

要准备在中运行的操作系统,您可能需要卸载某些软件(例如 Tools和驱动程序),更改密码并安装新的管理工具等。您可以通过编写脚本来自动执行此操作。您应该能够使用virt-copy-in命令将脚本和文件注入虚拟磁盘。

3.1在Linux中自动启动脚本

由于只有几个Linux服务器需要迁移,因此我在Linux中手动启动了脚本。而且很容易就做到了自动化。

3.2在中自动启动脚本

可以选择方法在启动时启动脚本,因为该方法适用于所有版本。您可以 通过注入注册表文件将脚本放入。仅当用户登录时才运行脚本。因此,还应该注入 管理员的用户名,密码,并将设置为'1'。当启动时,它会自动登录的用户定义。完成后,请确保关闭虚拟机。

自动登录(使用用户“ ”和密码“ ”)并启动C:.vbs的示例注册表文件:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce] "Script"="cscript C:StartupWinScript.vbs" "Parameters"=""
[HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogon]"AutoAdminLogon"="1""UserName"="Administrator""Password"="Password"

4.创建镜像

当前平台使用Ceph作为存储、镜像后端。如果创建云主机希望通过从镜像的方式启动而不是云盘的方式启动的话,那么镜像上传需要通过-api。我们在上的云主机,系统盘数据大小约为200G。不管是作为上传体积较大的raw或者qcow2镜像,由于要经过-api上传,速度会比较慢,此时可以采用先上传到Ceph,再在中的方式,因为连接到Ceph后端的通常是万兆光口,上传速度会很快:

具体步骤如下:

uuid=$(uuidgen)

rbd -p images --image-format 2 import image_file $uuidrbd -p images snap create --snap snap $uuidrbd -p images snap protect --snap snap $uuid

glance image-create --os-image-api-version 1 --id $uuid --name image_name --disk-format raw --container-format bare --is-public false --location rbd://$(ceph fsid)/images/$uuid/snap 

5.创建卷

对于要导入的每个磁盘,您需要创建一个卷。命令中指定的卷大小并不重要,因为下一步我们将删除(并通过ceph直接导入的方式重新创建)Ceph块设备。我们仅创建卷以创建和Ceph 之间的链接。

但是,您应该使卷大小与计划导入的磁盘相同。这对于拥有管理界面()用户来说,操作很简单。

使用以下命令创建一个卷(大小以GB为单位,您可以通过 type-list检查可用的卷类型):

cinder create --display-name   --volume-type 

注意卷ID(您也可以使用以下命令找到卷ID ),因为下一步需要使用这些ID。

cinder list | grep 

命令信息:

6.将VMDK转换为Ceph

一旦创建了卷,就可以将VMDK磁盘文件转换为RBD块(Ceph)。但是首先我们需要删除实际的Ceph 磁盘。请确保删除正确的Ceph块设备!

首先,您应该知道磁盘驻留在哪个Ceph池中。然后从Ceph中删除该卷(-id是您在上一步“创建卷”中记录的卷ID ):

rbd -p  rm volume-

下一步是将VMDK文件转换为Ceph上的卷(所有ceph的参数都是为了更好的性能。变量是vmdk文件的完整路径。-id**是您之前记下的ID)。

qemu-img convert -p  -O rbd rbd:/volume-

对虚拟机的所有虚拟磁盘执行此操作。

小心!rbd命令非常强大(可能会破坏Ceph上比预期更多的数据,请谨慎使用)!

7.创建端口(可选)

在某些情况下,您可能需要设置固定的IP地址或MAC地址。您可以通过使用创建端口并在下一步中使用该端口(在中创建和启动实例中进行关联)来实现。您首先应该知道是什么(nova net-list),需要使用“ Label”。仅是必需的。您还可以通过添加来添加安全组。

 --security-group 

为每个安全组添加此参数,因此,如果要添加6个安全组,则应添加此参数6次。

neutron port-create --fixed-ip ip_address= --mac-address   --name 

注意端口的ID,下一步将需要它。

8.在中创建并启动实例

现在,我们已经准备就绪,可以使用卷和可选的端口创建实例。注意启动磁盘的卷ID。现在,您只需要知道要选择的的ID。运行nova -list,以获取所所需要的 ID。

现在,您可以创建并启动新实例:

nova boot  --flavor  --boot-volume  --nic port-id=

注意实例ID。现在,通过执行此命令来添加实例的其他磁盘(如果要添加其他卷):

nova volume-attach  

总结

迁移过程中可能会出现失败的情况,尤其是。错误版本的驱动程序极易导致系统蓝屏,所以正确的安装驱动非常重要。对于较大的数据盘,本案例是使用直接上传到ceph中,替换掉相同大小的空卷,如果通过镜像的方式上传,然后创建云盘,那么会多花几倍的时间。所以合理以及灵活的使用Ceph能大大加快迁移的速度。

本文主要讲解了操作的流程,如果是批量操作的话,完全可以写成对应的编排脚本,进行批量迁移。脚本运行之前一定要充分测试。