迁移实战|从VMware和Hyper-V迁移到OpenStack

作者:祝祥

介绍

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

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

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

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

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

全局步骤

  1. 安装VirtIO驱动程序
  2. 扩展分区(可选)
  3. 自定义虚拟机(可选)
  4. 创建Cinder卷
  5. 将VMDK转换为Ceph
  6. 创建Neutron端口(可选)
  7. 在OpenStack中创建和启动实例

技术指标

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

  • 云平台:OpenStack Train
  • 云存储:Ceph
  • Windows实例:Windows Server 2012R2至2016
  • Linux实例:RHEL5/6/7,SLES,Debian和Ubuntu
  • 只能转换来自ESXi的VMDK文件,无法使用qemu-img从VMware Player转换VMDK文件
  • 不涉及加密磁盘的迁移
  • OpenStack为实例提供VirtIO半虚拟化硬件

需求

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

  • 服务器操作系统(已成功通过以下测试):
  • RHEL6(RHEL7没有“ libguestfs-winsupport”)
  • Fedora 19、20、21和22
  • Ubuntu 14.04,16.04和18.04
  • 与正在运行的OpenStack环境的网络连接。最好不要通过公网Internet,因为我们需要“超级管理员”权限。本地网络连接通常比Internet连接更快。如果能保证是万兆网络的话将会更好。
  • 足够的硬件性能与功能来转换磁盘并能在KVM中运行实例(大小取决于您要在一定时间内迁移的实例,如有SSD最佳)。

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

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

  • 拥有Linux迁移主机上的本地sudo(root)权限
  • QEMU/KVM主机
  • OpenStack的权限(通过Keystone获取)
  • 对Ceph的相应的操作权限
  • 对OpenStack API和Ceph的不受限制网络访问
  • VirtIO驱动程序(可从Red Hat,Fedora等主站下载)
  • 软件包(所有软件包都应位于默认的发行版存储库中):
    • “ python-cinderclient”(用于云盘)
    • “ python-keystoneclient”(用于向OpenStack进行身份验证)
    • “ python-novaclient”(控制实例)
    • “ python-neutronclient”(用于控制网络)
    • “ python-httplib2”(以便能够与Web服务通信)
    • “ libguestfs-tools”(用于访问磁盘文件)
    • “ libguestfs-winsupport”(应该仅在基于RHEL的系统上单独安装)
    • “ libvirt-client”(控制KVM)
    • “ qemu-img”(转换磁盘文件)
    • “ ceph”(将虚拟磁盘导入Ceph)
    • “ vmware-vdiskmanager”(用于扩展VMDK磁盘,可从VMware站点下载)

步骤

1.注入VirtIO驱动程序

1.1 Windows Server 2012

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

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

1.2 Linux(内核2.6.25及更高版本)

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

mount -o remount,rw /pvscanvgscanreboot

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

完成后关闭虚拟机。

1.3 Linux(2.6.25之前的内核)

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

  • 红帽为RHEL 3.9及更高版本提供VirtIO支持
  • SuSe为SLES 10 SP3及更高版本提供VirtIO支持

较旧内核的步骤是:

  1. 创建KVM实例:
  2. Linux(内核2.6.25之前):使用IDE硬件创建和启动KVM实例(由于只能配置一个IDE 控制器而导致产生4个磁盘,因此KVM中限于4 个磁盘!)。我没有尝试过SCSI或SATA,因为本次迁移中只有不超过4个磁盘的Linux虚拟机。Linux应该启动没有问题。
  3. 加载virtio模块(特定于发行版):RHEL(旧版本):https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/ch10s04.html 和SLES 10 SP3系统:https://www.suse.com/documentation/opensuse121/book_kvm/data/app_kvm_virtio_install.html
  4. 关闭实例。
  5. 将所有磁盘更改为VirtIO磁盘并启动实例。现在应该可以正常启动了。
  6. 完成后关闭虚拟机。对于Red Hat,请参阅:https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/ch10s04.html对于SuSe,请参阅:https://www.suse.com/documentation/opensuse121/book_kvm/data/app_kvm_virtio_install.htm

1.4 Windows Server 2008(及更低版本);不推荐使用

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

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

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

 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

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

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

请参阅:https://support.microsoft.com/zh-cn/kb/314082 (为Windows XP 编写,但仍可用于Windows 2003和2008)。

另请参阅:http://libguestfs.org/virt-copy-in.1.html和http://libguestfs.org/virt-win-reg.1.html

2.展开分区(可选)

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

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

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

3.1在Linux中自动启动脚本

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

3.2在Windows中自动启动脚本

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

自动登录Windows(使用用户“ Administrator”和密码“ Password”)并启动C:StartupWinScript.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.创建Glance镜像

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

具体步骤如下:

  • 生成随机uuid,作为镜像id
uuid=$(uuidgen)
  • 通过rbd的方式上传镜像,同时添加相应的快照与快照保护
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创建镜像,同时与rbd镜像进行关联
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.创建Cinder卷

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

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

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

cinder create --display-name <name_of_disk> <size> --volume-type <volumetype>

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

cinder list | grep <name_of_disk>

Cinder命令信息:http://docs.openstack.org/cli-reference/content/cinderclient_commands.html

6.将VMDK转换为Ceph

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

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

rbd -p <ceph_pool> rm volume-<volume-id>

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

qemu-img convert -p <vmdk_disk_file> -O rbd rbd:<ceph_pool>/volume-<volume-id>

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

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

7.创建Neutron端口(可选)

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

 --security-group <security_group_name>

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

neutron port-create --fixed-ip ip_address=<ip_address> --mac-address <mac_address> <network_name> --name <port_name>

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

8.在OpenStack中创建并启动实例

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

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

nova boot <instance_name> --flavor <flavor_id> --boot-volume <boot_volume_id> --nic port-id=<neutron_port_id>

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

nova volume-attach <instance_ID> <volume_id>

总结

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

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

版权声明:

作者: freeclashnode

链接: https://www.freeclashnode.com/news/article-1527.htm

来源: FreeClashNode

文章版权归作者所有,未经允许请勿转载。

免费节点实时更新

热门文章

最新文章

归档