openstack虚拟机迁移到ovirt环境脚本实现

本文档介绍了如何将openstack虚拟机手动迁移到ovirt-engine环境,由于cinder鉴权问题,采用备份导入的方式。详细步骤包括:获取openstack虚拟机信息,使用virsh和xml解析获取详细配置,将虚拟机disk转换为qcow2格式,通过ovirt SDK上传并创建虚拟机,挂载磁盘和添加网卡。

1、需求背景:

旧平台openstack虚拟机需要迁移到ovirt-engine环境,直接用ovirt自带的对接openstack环境一直cinder鉴权报错,调查是版本不支持,只能手动备份导入的ovirt平台。

思路:获取openstack环境虚拟机信息,读取迁移虚拟机表格,导出虚拟机为qcow2,上传到ovirt平台创建虚拟机挂盘。

2、获取openstack计算节点虚拟机信息

通过virsh list获取instance实例列表,再通过dumpxml获取虚拟机信息利用xml模块解析所需要的信息

    def get_vms_list(self):
        # print("virsh list --all --name ...")
        list_cmd = "virsh list --all --name".split(" ")
        stdout, stderr = self.cmd_process(list_cmd)
        instance_names = list(filter(None, stdout.split("\n")))
        return instance_names

    def get_dumpxml_info(self, instance_name):
        # print("virsh dumpxml...")
        info_cmd = "virsh dumpxml %s" % instance_name
        stdout, _ = self.cmd_process(info_cmd.split(" "))
        return stdout

    def get_vms_info(self):
        instance_names = self.get_vms_list()
        vms_info = []
        for instance_name in instance_names:
            xml_str = self.get_dumpxml_info(instance_name)
            DOMTree = xml.dom.minidom.parseString(xml_str)
            collection = DOMTree.documentElement
            vm_info = {}
            data_volume = []
            vm_info["instance_name"] = collection.getElementsByTagName("name")[0].childNodes[0].data
            vm_info["vm_name"] = collection.getElementsByTagName("metadata")[0].getElementsByTagName("nova:instance")[
                0].getElementsByTagName("nova:name")[0].childNodes[0].data
            vm_info["vm_flavor"] = collection.getElementsByTagName("metadata")[0].getElementsByTagName("nova:instance")[
                    0].getElementsByTagName("nova:flavor")[0].getAttribute("name")
            vm_info["instance_uuid"] = collection.getElementsByTagName("uuid")[0].childNodes[0].data
            vm_info["instance_vcpu"] = collection.getElementsByTagName("vcpu")[0].childNodes[0].data
            vm_info["instance_memory"] = collection.getElementsByTagName("memory")[0].childNodes[0].data
            for disk_info in collection.getElementsByTagName("devices")[0].getElementsByTagName("disk"):
                dev = disk_info.getElementsByTagName("target")[0].getAttribute("dev")
                if dev == "vda" or dev == "hda":
                    vm_info["system_volume"] = disk_info.getElementsByTagName("source")[0].getAttribute("name")
                else:
                    data_volume.append(disk_info.getElementsByTagName("source")[0].getAttribute("name"))
            vm_info["data_volume"] = data_volume
            vms_info.append(vm_info)
        return vms_info

计算节点都要执行,最后汇总到执行脚本的节点,并且汇总读取信息(注意系统卷和数据卷的判断根据具体环境修改适配)

    run_first_time = False
    if run_first_time:
        for host in HOST_LIST:
            print("** get the vm info from %s" % host)
            os.system("scp get_vm_info.py root@%s:/home" % host)
            sshclient_execmd(host, "pyth
<think>嗯,用户问的是如何将OpenStack中的虚拟机迁移到指定的物理主机。首先,我得回忆一下OpenStack迁移制。OpenStack主要有冷迁移和实时迁移两种方式,冷迁移需要关,实时迁移则不用,但可能对配置有要求。用户的需求是迁移到指定物理,所以可能需要指定目标主机。 接下来,我得考虑不同迁移方式的具体步骤。冷迁移的话,先关闭实例,然后使用nova migrate命令,但可能需要管理员权限。而实时迁移的话,用nova live-migration,但需要确认环境是否支持,比如共享存储或者块存储迁移的设置。 然后,用户提到要指定目标物理,这时候需要知道目标主机的名称或者ID。使用nova host-list可以列出所有计算节点,找到目标主机的名称。接着在迁移命令中指定--host参数,这样就能定向迁移了。 不过,可能有些注意事项,比如目标主机的资源是否足够,比如CPU、内存、磁盘空间等,否则迁移会失败。另外网络配置也需要兼容,比如相同的网络标签或者物理网络连接,否则虚拟机可能无法访问网络。 权限方面,执行迁移操作可能需要管理员角色,普通用户可能没有权限,所以用户可能需要联系管理员或者检查自己的权限设置。另外,实时迁移对Hypervisor有要求,比如KVM或者Xen,并且配置正确,比如libvirt的配置是否正确,以及Nova的配置文件中是否启用了实时迁移。 还有,如果是块存储迁移,即虚拟机磁盘不在共享存储上,可能需要更长的时间,并且要确保目标主机能够访问相同的存储后端,或者配置了正确的迁移参数,比如--block-migrate选项。 用户可能还关心如何验证迁移是否成功,可以使用nova show命令查看实例的详细信息,确认host属性已经变为目标主机。同时检查虚拟机的状态是否正常,网络是否连通,服务是否运行良好。 另外,可能遇到的问题包括迁移过程中出现错误,这时候需要查看Nova的日志文件,通常是/var/log/nova/nova-compute.log和nova-scheduler.log,排查错误原因。比如资源不足、配置错误、网络问题等。 总结一下,步骤大致是:确定迁移类型,检查目标主机资源,执行迁移命令,验证结果,处理可能的问题。需要根据具体情况选择冷迁移还是实时迁移,并确保环境配置满足要求。</think>以下是将OpenStack虚拟机迁移到指定物理的分步指南: 一、先决条件 1. 确认OpenStack版本支持迁移操作(建议Queens或更新版本) 2. 确保源主机和目标主机: $$ \text{CPU架构一致} $$ $$ \text{Hypervisor类型相同(均为KVM/Xen等)} $$ $$ \text{共享存储配置(对于非块迁移场景)} $$ 3. 管理员权限(需要执行nova命令) 二、操作步骤 1. 获取目标物理信息 ```bash nova host-list # 查看所有计算节点名称 ``` 2. 冷迁移(需关) ```bash nova stop <instance_id> nova migrate --host <目标主机名> <instance_id> nova resize-confirm <instance_id> ``` 3. 实时迁移(无需停) ```bash nova live-migration --host <目标主机名> <instance_id> ``` 4. 验证迁移结果 ```bash nova show <instance_id> | grep host ``` 三、关键参数说明 | 参数 | 作用 | 示例值 | |----------------|-----------------------------|---------------| | --host | 指定目标物理名称 | compute-node2 | | --block-migrate| 启用块存储迁移(非共享存储场景) | 布尔值 | 四、常见问题排查 1. 资源不足错误: $$ \text{检查目标主机内存:free -h} $$ $$ \text{验证CPU核数:lscpu} $$ 2. 迁移超时: ```bash # 修改nova.conf [libvirt] live_migration_timeout = 600 # 单位:秒 ``` 3. 网络配置验证: $$ \text{确保VLAN/VXLAN ID一致} $$ $$ \text{检查安全组规则同步} $$ 五、最佳实践建议 1. 生产环境推荐使用Ceph等共享存储方案 2. 定期维护时执行: $$ \text{nova host-evacuate <故障主机>} $$ 3. 通过Placement API实现智能调度: ```bash openstack aggregate add host <聚合组> <目标主机> ``` 注:具体命令参数可能因OpenStack版本不同略有差异,建议通过`nova help migrate`查看版本特定说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值