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

相关推荐
IT_陈寒27 分钟前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
子兮曰1 小时前
Agency-Agents 深度解析:400+ AI 专家的"梦之队"如何重塑开发工作流
前端·后端·vibecoding
用户8356290780512 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
小满zs2 小时前
Go语言第二章(小无相功)
后端·go
用户8356290780512 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
karry_k2 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十九):点选验证码代码逐行目检
前端·后端·go
贰先生2 小时前
Xiuno BBS X版 用户封禁系统
后端
karry_k2 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
ServBay2 小时前
不会写代码也能建站?AI 时代,非技术创始人如何从零搭建自己的 Web 项目
后端·mcp