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...

相关推荐
程序员爱钓鱼1 小时前
Go语言实战案例 — 工具开发篇:实现一个图片批量压缩工具
后端·google·go
ChinaRainbowSea3 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
舒一笑3 小时前
同步框架与底层消费机制解决方案梳理
后端·程序员
minh_coo3 小时前
Spring框架事件驱动架构核心注解之@EventListener
java·后端·spring·架构·intellij-idea
白初&5 小时前
SpringBoot后端基础案例
java·spring boot·后端
计算机学姐7 小时前
基于Python的旅游数据分析可视化系统【2026最新】
vue.js·后端·python·数据分析·django·flask·旅游
该用户已不存在8 小时前
你没有听说过的7个Windows开发必备工具
前端·windows·后端
David爱编程8 小时前
深入 Java synchronized 底层:字节码解析与 MonitorEnter 原理全揭秘
java·后端
KimLiu8 小时前
LCODER之Python:使用Django搭建服务端
后端·python·django
再学一点就睡8 小时前
双 Token 认证机制:从原理到实践的完整实现
前端·javascript·后端