nova compute 如何创建 ovs 端口

最近搞 qemu 使用 ovs internal port 出现了点问题,但是 neutron ovn 好像默认就是 internal port,所以这里想看下 nova compute 到底使用的是 ovs internal port 还是 linux tap 设备

这两个场景都在这个函数 _nw_info_build_network 中

设备名应该统一为 tap<11 位 port id>

1. 上面这个方法仅在 _build_network_info_model 使用

Return list of ordered VIFs attached to instance

返回需要插入到虚拟机中的有序的虚拟网卡列表

2. 上面这个方法仅在 _get_instance_nw_info 有调用

3. 上面这个方法在这几个方法中调用

update_instance_cache_with_nw_info( # 存一下数据库,忽略 get_instance_nw_info( # 主要关注 通用场景 add_fixed_ip_to_instance( # 特别场景,忽略 remove_fixed_ip_from_instance(

4. 仅需要关注 get_instance_nw_info 在最通用的 allocate_for_instance 方法中调用

5. 仅需要关注 allocate_for_instance 在 _attach_interface 中的使用

(另一个是远程调用 neutron 分配 ip)

只需要关注 ovs vsctl 相关的 driver 中的 attach_interface 实现即可

6. 只能是 libvirt 的实现

7. 结论: 只能是 linux tap 设备

python 复制代码
    def plug_tap(self, instance, vif):
        """Plug a VIF_TYPE_TAP virtual interface."""
        dev = self.get_vif_devname(vif)
        mac = vif['details'].get(network_model.VIF_DETAILS_TAP_MAC_ADDRESS)
        image_meta = instance.image_meta
        vif_model = self.get_vif_model(image_meta=image_meta)
        # TODO(ganso): explore whether multiqueue works for other vif models
        # that go through this code path.
        multiqueue = False
        if vif_model == network_model.VIF_MODEL_VIRTIO:
            multiqueue = hardware.get_vif_multiqueue_constraint(
                instance.flavor, image_meta)
        nova.privsep.linux_net.create_tap_dev(dev, mac, multiqueue=multiqueue)
        network = vif.get('network')
        mtu = network.get_meta('mtu') if network else None
        nova.privsep.linux_net.set_device_mtu(dev, mtu)

@nova.privsep.sys_admin_pctxt.entrypoint
def create_tap_dev(dev, mac_address=None, multiqueue=False):
    if not device_exists(dev):
        try:
            # First, try with 'ip'
            cmd = ('ip', 'tuntap', 'add', dev, 'mode', 'tap')
            if multiqueue:
                cmd = cmd + ('multi_queue', )
            processutils.execute(*cmd, check_exit_code=[0, 2, 254])
        except processutils.ProcessExecutionError:
            if multiqueue:
                LOG.warning(
                    'Failed to create a tap device with ip tuntap. '
                    'tunctl does not support creation of multi-queue '
                    'enabled devices, skipping fallback.')
                raise

            # Second option: tunctl
            processutils.execute('tunctl', '-b', '-t', dev)

        if mac_address:
            _set_device_macaddr_inner(dev, mac_address)
        _set_device_enabled_inner(dev)

历史参考

我之前的笔记确实也是:port 绑定给虚拟机,即 compute livbvirt attatch port 给 br-int 实际上是调用 ovs-vsctl add-port br-int tapxxx: 参考 www.jianshu.com/p/c1c684c5b...

相关推荐
90后的晨仔13 分钟前
Java后端开发:从零构建企业级应用的完整架构与技术栈详解
后端
我命由我123451 小时前
Spring Cloud - Spring Cloud 声明式接口调用(Fiegn 声明式接口调用概述、Fiegn 使用)
java·后端·spring·spring cloud·微服务·架构·java-ee
canonical_entropy1 小时前
领域驱动设计(DDD)中聚合根的最主要职责真的是维护一致性吗?
后端·架构·领域驱动设计
AntBlack1 小时前
不当韭菜 : 好像真有点效果 ,想藏起来自己用了
前端·后端·python
橙子家2 小时前
Serilog 日志库的简介
后端
间彧2 小时前
Java线程池深度实战:不同场景下的最优选择与性能优化
后端
间彧2 小时前
CompletableFuture与线程池:并发编程的双剑合璧
后端
间彧2 小时前
在实际项目中,如何根据任务类型(CPU/IO密集型)设计不同的线程池策略?
后端
golang学习记2 小时前
Go slog 日志打印最佳实践指南
开发语言·后端·golang
间彧2 小时前
Fork/Join框架与线程池实战:深入剖析并行流性能陷阱与优化之道
后端