nova修改libvirt.xml及自定义xml文件修改nova代码支持vhost

本文详细介绍了如何修改nova代码以支持虚拟机参数配置,包括调整虚拟机的网络接口类型、MAC地址、桥接模式等关键设置,并讨论了如何根据虚拟机类型和宿主机类型选择合适的设备驱动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<interface type='bridge'>
      <mac address='00:1a:4a:4d:63:a0'/>
      <source bridge='sdcos-vmnet'/>
      <model type='virtio'/>
      <filterref filter='vdsm-no-mac-spoofing'/>
      <link state='up'/>
      <bandwidth>
      </bandwidth>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
      <driver name='qemu'/>
    </interface>


    <interface type="bridge">
      <mac address="fa:16:3e:ea:69:50"/>
      <model type="virtio"/>
      <source bridge="qbr3bcc4870-b3"/>
      <target dev="tap3bcc4870-b3"/>
      <driver name='qemu'/> #加上此配置文件,则启动的虚拟机参数中就会有vhost=off
    </interface>

修改nova代码支持:
    def get_config(self, instance, vif, image_meta, inst_type):
        conf = vconfig.LibvirtConfigGuestInterface()
        # Default to letting libvirt / the hypervisor choose the model
        model = None
        driver = None
        # If the user has specified a 'vif_model' against the
        # image then honour that model
        if image_meta:
            vif_model = image_meta.get('properties',
                                       {}).get('hw_vif_model')
            if vif_model is not None:
                model = vif_model
        # Else if the virt type is KVM/QEMU, use virtio according
        # to the global config parameter
        if (model is None and
            CONF.libvirt.virt_type in ('kvm', 'qemu') and
                    CONF.libvirt.use_virtio_for_bridges):
            model = "virtio"
        # Workaround libvirt bug, where it mistakenly
        # enables vhost mode, even for non-KVM guests
        if model == "virtio" and CONF.libvirt.virt_type == "qemu":
            driver = "qemu"

修改为:
if model == "virtio" and CONF.libvirt.virt_type == "qemu":
            driver = "qemu"
driver = "qemu"//增加此句,代表永远为qemu




### 关于 `nova.virt.libvirt.driver` 中 `ValueError: No such provider` 在 OpenStack 的 Nova 服务中,当尝试通过 `nova.virt.libvirt.driver` 加载特定驱动程序时,可能会遇到类似于 `ValueError: No such provider` 的错误。这种错误通常表明指定的提供者(provider)未被识别或加载失败。 #### 错误原因分析 1. **配置文件问题** 如果 Nova 配置文件 (`/etc/nova/nova.conf`) 中指定了不存在或不支持的虚拟化驱动程序,则会触发此错误。例如,在 `[libvirt]` 节点下可能设置了无效的参数[^1]。 2. **依赖库缺失** Libvirt 或其相关组件未正确安装可能导致无法找到所需的驱动程序。这包括缺少必要的 Python 库(如 `oslo.utils`, `oslo.concurrency` 等),或者 Libvirt 版本过低[^2]。 3. **UUID 不匹配** 提供者的 UUID (如 `580bc4c2-4a8f-49dd-a31f-046f13686ab3`)可能与实际注册的服务实例不符。如果该 UUID 对应的资源已被删除或从未创建,则会出现此类错误[^3]。 --- #### 解决方案 以下是针对上述问题的具体解决方案: 1. **验证配置文件设置** 检查 `/etc/nova/nova.conf` 文件中的 `[libvirt]` 部分,确认是否存在非法选项。例如: ```ini [libvirt] virt_type = kvm cpu_mode = host-passthrough ``` 若发现未知条目,请移除并重启 Nova 计算服务以重新加载配置。 2. **更新 Libvirt 和相关工具链** 确保系统已安装最新版本的 Libvirt 及其开发包。可以通过以下命令完成升级操作: ```bash sudo apt update && sudo apt install libvirt-daemon-system libvirt-clients python-libvirt -y ``` 同时需注意调整套接字权限以便 Virt-manager 正常工作: ```bash sudo chmod 777 /var/run/libvirt/libvirt-sock sudo chmod 777 /var/run/libvirt/libvirt-sock-ro ``` 3. **排查容器启动回退机制** 当 Kubernetes Pod 内部运行的任务频繁崩溃时,Kubernetes 将执行指数级延迟重试策略 ("Back-off") 。此时可考虑修改镜像入口脚本来保持进程存活状态直到调试结束为止: ```yaml command: ["sh", "-c"] args: - | while true; do sleep 3600; done; ``` 4. **清理残留数据** 使用数据库查询语句定位到引发冲突的目标记录,并手动将其清除掉。假设目标表名为 instances ,则 SQL 如下所示 : ```sql DELETE FROM instances WHERE uuid='580bc4c2-4a8f-49dd-a31f-046f13686ab3'; ``` --- ### 总结 综上所述,“No such provider”的根本原因是由于 Nova 找不到对应 ID 下关联的有效实体所致。通过对环境变量、软件栈以及存储层逐一审查可以有效排除隐患。 ```python import os from oslo_config import cfg CONF = cfg.CONF def check_libvirt_driver(): try: CONF.register_opts([ cfg.StrOpt('virt_type', default='kvm'), ], group='libvirt') if not hasattr(CONF, 'libvirt'): raise Exception("Missing configuration section.") print(f"Using {CONF.libvirt.virt_type} as hypervisor type.") except ValueError as e: print(e) if __name__ == "__main__": check_libvirt_driver() ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值