Virtio-user使用简介
一、简述
DPDK支持几种方式让用户空间的报文重新进入内核协议栈(这种dpdk和kernel直接通信的路径叫做exception path),例如tap/tun设备使用,kni,Virtio-user。这里主要讲Virtio-user使用,Virtio-user是virtio PMD的虚拟设备,启动DPDK virtio-user,系统就会创建一个内核态的虚拟设备tap。下面介绍Virtio-user的使用和使用前驱动的安装。
二、驱动安装过程
现在内核基本都自带vfio-pci或者uio_pci_generic驱动,基本不需要igb_uio,igb_uio在20.11版本已经从dpdk目录内移除,Virtio-user依赖vfio-pci.ko驱动,安装好驱动后需要将网卡绑定到该驱动。
2.1 vfio-pci.ko驱动安装
在安装驱动前需要注意看下系统是否支持虚拟IO技术(例如intel@VT-d),或是否支持并开启了IOMMU(Input/Output Memory Management Unit),如果支持IOMMU那么使用2.1.1小节中的安装方式,如果不支持,使用2.1.2小节中的安装方式。Linux是否支持虚拟IO技术可使用下面的命令查看:
cat /proc/cpuinfo | grep vmx #有结果说明支持intel-vt虚拟化
cat /proc/cpuinfo | grep svm #有结果说明支持amd-vt虚拟化
如果不支持虚拟化则建议换no-IOMMU的方式启动。如果是虚拟机环境,在虚拟机的cpu选项中可以将虚拟化引擎都进行勾选。
2.1.1 IOMMU模式驱动安装
使用IOMMU模式安装驱动,在驱动安装之前需要设置或者启用iommu,需要在linux启动配置中添加intel_iommu=on iommu=pt,如果是amd的cpu使用amd_iommu=on iommu=pt置方式如下:
$ sudo vim /etc/default/grub # 在GRUB_CMDLINE_LINUX行添加intel_iommu=on iommu=pt
$ sudo update-grub #更新linux启动配置文件,这里是Ubuntu环境,若centos使用命令:grub2-mkconfig -o /boot/grub2/grub.cfg
$ sudo reboot #重启系统
#重启之后可以使用cat /proc/cmdline查看有“intel_iommu=on iommu=pt”标识
待iommu设置好了之后按照下面的命令安装驱动即可。
sudo modprobe vfio-pci
2.1.2 no-IOMMU模式驱动安装
如果设备硬件不支持IO虚拟化,那么就不能够使用IOMMU模式加载驱动,需要使用下面的方式加载驱动。如果之前已经使用安装了vfio-pci了,那需要卸载所有vfio相关的驱动,然后重新按照下面的方式安装:
将vfio相关的驱动都卸载掉
rmmod vfio_iommu_type1
rmmod vfio-pci
rmmod vfio#重新安装驱动
modprobe vfio enable_unsafe_noiommu_mode=1
modprobe vfio-pci
2.2 绑定网卡
使用脚本查看当前的网卡设备绑定情况:
root#./usertools/dpdk-devbind.py -s# Network devices using kernel driver
===================================
0000:00:03.0 '82540EM Gigabit Ethernet Controller 100e' if=enp0s3 drv=e1000 unused=vfio-pci *Active*
0000:00:08.0 '82540EM Gigabit Ethernet Controller 100e' if=enp0s8 drv=e1000 unused=vfio-pci *Active*
0000:00:09.0 '82540EM Gigabit Ethernet Controller 100e' if=enp0s9 drv=e1000 unused=vfio-pci *Active*No 'Baseband' devices detected
==============================
... ...
从上面可以看到系统有3张网卡,这里使用第三个enp0s9 网卡,因为该设备是在使用状态,所以需要将网卡down之后再绑定,操作命令如下:
>ifconfig enp0s9 down #将要绑定的网卡状态设置为down
>./usertools/dpdk-devbind.py -b vfio-pci 0000:00:09.0 #将网卡和驱动绑定,这里填写的网卡的pci地址
>./usertools/dpdk-devbind.py -s #再次查看绑定的情况Network devices using DPDK-compatible driver
============================================
0000:00:09.0 '82540EM Gigabit Ethernet Controller 100e' drv=vfio-pci unused=e1000Network devices using kernel driver
===================================
0000:00:03.0 '82540EM Gigabit Ethernet Controller 100e' if=enp0s3 drv=e1000 unused=vfio-pci *Active*
0000:00:08.0 '82540EM Gigabit Ethernet Controller 100e' if=enp0s8 drv=e1000 unused=vfio-pci *Active*No 'Baseband' devices detected
==============================
... ...
当“Network devices using DPDK-compatible driver”下出现需要的Ethernet设备之后就表示绑定成功,后面dpdk程序就可以使用该网络设备(Network devices)。
三、启动并使用
在启动程序前,假设大页内存等都已经设置好。
3.1 使用启动参数添加虚拟网卡
dpdk应用程序都会有EAL环境初始化,使用rte_eal_init初始化中可以解析入参是否需要增加虚拟设备,例如使用testpmd启动方式如下:
形式如下:
./dpdk-testpmd -l <cores> -a <pci BDF> --vdev=virtio_user0,path=/dev/vhost-net,queues=<num>,queue_size=<size>
例如:
./dpdk-testpmd -a 0000:00:09.0 --vdev=virtio_user0,path=/dev/vhost-net,queues=1,queue_size=512
其中涉及到的启动参数主要是:
--vdev :启动程序时添加一个虚拟设备。
在--vdev参数后面还可以接:
path :内核vhost-net设备的路径。
queue_size :默认是256,以防度队列过短我们可以最大设置到1024。
queues :虚拟队列的数量,每个队列由一个内核线程管理。
iface :虚拟设备的名字
启动程序之后可以使用ifconfig -a命令看到有个设备名为tap0,即表示虚拟设备添加成功,如下:
root@ubuntu:~/dpdk/dpdk-stable-21.11.1/usertools#
... ...
tap0: flags=4098<BROADCAST,MULTICAST> mtu 1500ether ca:6f:0b:ac:36:4c txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0... ...
3.2 使用代码添加虚拟网卡
如果不使用启动参数,也可以在程序中添加代码的方式增加虚拟设备,具体代码如下:
#define RX_RING_SIZE 1024
nb_ports = rte_eth_dev_count_avail(); /* 获取所有可用的网卡 *//* Create a vhost_user port for each physical port */
unsigned port_count = 0;
RTE_ETH_FOREACH_DEV(portid) {char portname[32];char portargs[256];struct rte_ether_addr addr = {0};/* once we have created a virtio port for each physical port, stop creating more */if (++port_count > nb_ports)break;/* get MAC address of physical port to use as MAC of virtio_user port */rte_eth_macaddr_get(portid, &addr);/* set the name and arguments */snprintf(portname, sizeof(portname), "virtio_user%u", portid);snprintf(portargs, sizeof(portargs),"path=/dev/vhost-net,queues=1,queue_size=%u,iface=%s,mac=" RTE_ETHER_ADDR_PRT_FMT,RX_RING_SIZE, portname, RTE_ETHER_ADDR_BYTES(&addr)); //这里的portname名字可以更改为其他标识,例如tap/* add the vdev for virtio_user */if (rte_eal_hotplug_add("vdev", portname, portargs) < 0) //这里的portname必须是virtio_user0,virtio_user1...rte_exit(EXIT_FAILURE, "Cannot create paired port for port %u\n", portid);
}
添加上述代码需要添加头文件:
#include <rte_dev.h>
#include <rte_ethdev.h>
四、参考文档
dpdk官方文档参考:9. Virtio_user as Exception Path — Data Plane Development Kit 23.07.0 documentation
VFIO驱动安装参考:7. Linux Drivers — Data Plane Development Kit 23.07.0 documentation
虚拟机设置dpdk环境:DPDK-1:概述 - 墨天轮
virtio 与vhost_net介绍:virtio 与vhost_net介绍_virtio vhost-CSDN博客
相关文章:
Virtio-user使用简介
一、简述 DPDK支持几种方式让用户空间的报文重新进入内核协议栈(这种dpdk和kernel直接通信的路径叫做exception path),例如tap/tun设备使用,kni,Virtio-user。这里主要讲Virtio-user使用,Virtio-user是virtio PMD的虚拟设备&…...
点云从入门到精通技术详解100篇-基于深度学习的三维植物点云分割网络
目录 前言 研究现状及趋势 传统的植物表型分割方法 现行的植物表型分割方法...
C语言 Cortex-A7核 SPI 实验
1 实验目的 1、数码管显示相同的值0000 1111 2222 .... 9999 2、数码管不同的值1234 2 代码 include/spi.h #ifndef __SPI_H__ #define __SPI_H__ #includ…...
Spring工具类--ReflectionUtils的使用
原文网址:Spring工具类系列--ReflectionUtils的使用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring的ReflectionUtils的使用。 ReflectionUtils工具类的作用:便利地进行反射操作。 Spring还有一个工具类:ReflectUtils,它们在…...
zemax西德莫尔目镜
高性能的军用光学仪器 在两个双胶合透镜之间,增加了一块平凸透镜 半视场角增大到35度 入瞳直径4mm波长0.51、0.56、0.61半视场35焦距27.9mm 镜头参数: 成像效果:...
C++ 拷贝构造函数
介绍和示例 拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象。 复制对象把它作为参数传递给函数。 复制对象…...
怎么使用 Flink 向 Apache Doris 表中写 Bitmap 类型的数据
Bitmap是一种经典的数据结构,用于高效地对大量的二进制数据进行压缩存储和快速查询。Doris支持bitmap数据类型,在Flink计算场景中,可以结合Flink doris Connector对bitmap数据做计算。 社区里很多小伙伴在是Doris Flink Connector的时候&…...
LeetCode 四数相加II 哈希
原题链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题面: 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i,…...
python(自4) xpath下载 lxml安装 lxml语法 使用方式
(一)安装 搜索xpath 讲解 XPath 教程 (w3school.com.cn) 一,下载地址 : https://chrome.zzzmh.cn/info/hgimnogjllphhhkhlmebbmlgjoejdpjl 二 ,拖拽 (二)lxml安装 cmd 打开终端 cd pythond…...
05-Zookeeper典型使用场景实战
上一篇:04-Zookeeper集群详解 1. Zookeeper 分布式锁加锁原理 如上实现方式在并发问题比较严重的情况下,性能会下降的比较厉害,主要原因是,所有的连接都在对同一个节点进行监听,当服务器检测到删除事件时,…...
stl格式-3D三角形
文章目录 什么是stl文件?格式首选stl的语法1.这是一个stl格式的文件:2.下面先举个例子(难度略微提示)补充:关于\<\<我试了一下:这个法线你随便写好像也没问题\>> 3.来个立方体4.最后再写一个由三个直角形组成的立方体 什么是stl文件? 首先说一下,这个stl不是cpp…...
基于微信小程序的高校暑期社会实践小程序设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...
ARM-day2
1、 .text .global _start_start:MOV r0, #0x1ADDS r1,r0, #0x1cmp r1, #100bl funstop:b stopfun:ADD r2,r1,r1.end2、思维导图...
macOS Sonoma 14 正式版(23A344)发布,附黑/白苹果镜像下载地址
系统介绍(系统下载地址:http://www.imacosx.cn/115300.html) 黑果魏叔9 月 27日消息,苹果今日向 Mac 电脑用户推送了 macOS Sonoma 14 正式版(23A344)。 macOS 14正式版系统发布:全新功能与改…...
HarmonyOS开发:封装一个便捷的Log工具类
前言 日志打印,没什么好说的,系统已给我们提供,且调用也是非常的简单,我们封装的目的,一是扩展,打印一些不常见的类型,比如格式化json,使得日志看起来比较好看,二是&…...
第十章_祖冲之_圆周率
倒数1又2/3章,keep_writting的一天: 第十章10.1.7 运行程序资源下载网站为何打不开呢?...
FVM管理Flutter 环境
开发中,会经常切换不同版本的 Flutter 环境。使用 FVM(Flutter Version Manager )来进行 Flutter 版本切换是一个很不错的选择。 下面从安装FVM、环境配置、切换Flutter这几个主要步骤总结下 FVM 的使用 一、安装 homebrew 网址࿱…...
vue | 样式隔离scoped的原理 样式穿透deep的原理
文章目录 vue中的样式穿透scoped 样式隔离父组件可以修改子组件根节点样式 deep 样式穿透:deep(.el-col)的原理 vue中的样式穿透 scoped 样式隔离 一个style标签拥有scoped属性时,css样式就只能作用于当前的组件,这样就可以使得组件之间的样式不互相污…...
UML,集合框架
1.什么是UML UML是统一建模语言的简称,它是一种由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员阐明,展示,构建和记录软件系统的产出。UML代表了一系列在大型而复杂系统建模中被证明是成功的做法,是开发面向对象软件…...
如何快速轻松自动添加微信好友?
有些客需要换新的微信号,想把以前微信号上的好友全部加回来,但是因为微信系统的规定,频繁加好友容易被封号,而且手动添加好友太费时费力,还要控制加好友的间隔时间。那么有没有什么方法可以快速轻松自动添加好友呢&…...
Android Studio中文界面终极指南:3分钟告别英文开发困境
Android Studio中文界面终极指南:3分钟告别英文开发困境 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Androi…...
基于MCP协议集成AI求职助手:自动化简历优化与面试准备
1. 项目概述:将AI求职助手集成到你的工作流 如果你正在用Claude Desktop或者Cursor这类AI助手,并且恰好又在找工作或者准备职业跃迁,那你可能已经体会过那种“割裂感”——你需要手动把简历内容、职位描述、面试问题来回复制粘贴到聊天窗口&…...
从PoC到千万级并发:2026年6款高成熟度AI Agent工具落地路径对比(含成本/延迟/可观测性三维雷达图)
更多请点击: https://intelliparadigm.com 第一章:从PoC到千万级并发:2026年6款高成熟度AI Agent工具落地路径对比(含成本/延迟/可观测性三维雷达图) 在生产环境中规模化部署AI Agent,已不再仅依赖模型能力…...
3PEAK思瑞浦 TP2272-SO1R SOP8 精密运放
特性 增益带宽积:7MHz 高斜率:20V/us 宽电源范围:3.1V至36V或2.25V至18V 低失调电压:0.5mV(最大值) 低输入偏置电流:30pA(典型值) 轨到轨输出电压范围 单位增益稳定: 工作温度范围:-40C至125C...
Multi-Agent 落地常见问题:数据质量、模型适配与业务对齐解决方案
Multi-Agent 落地常见问题:数据质量、模型适配与业务对齐解决方案 引言 痛点引入:从「演示天堂」到「生产地狱」的Multi-Agent鸿沟 2023年11月OpenAI DevDay发布的GPT-4o Assistants API、LangChain团队迭代的LangGraph 1.0、Microsoft Research推出的AutoGen Studio 2.0,…...
【2024最新版】ElevenLabs有声书生产流水线:1个API Key+3个Python脚本+2个FFmpeg指令=日更10小时高质量音频
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs有声书生产流水线全景概览 ElevenLabs 的有声书生产流水线是一套融合文本预处理、语音合成、音频后处理与元数据封装的端到端自动化系统,专为高质量、多语种、情感一致的有声内容…...
BridgesLLM Portal:统一AI模型调用的门户框架设计与实践
1. 项目概述:一个面向AI应用开发的“门户”框架最近在AI应用开发领域,一个名为“BridgesLLM-ai/portal”的项目引起了我的注意。乍一看这个名字,可能会觉得有些抽象——“portal”是门户的意思,而“BridgesLLM”似乎暗示着它与大语…...
通过用量看板直观比较不同大模型api的token消耗效率
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过用量看板直观比较不同大模型API的Token消耗效率 对于需要持续调用大模型API的开发者或团队而言,理解并控制成本是项…...
ios蓝牙开发
一、蓝牙基本概念蓝牙:BLE (Bluetooth Low Energy/低功耗蓝牙),一般应用苹果的官方框架基于 <CoreBluetooth/CoreBluetooth.h> 框架进行开发。中心设备:用于扫描周边蓝牙外设的设备,比如我们上面所说的中心者模式࿰…...
AI提示词工程:用Claude+Cursor构建高效创意工作流
1. 项目概述:当创意遇上AI,一个提示词库如何改变工作流如果你是一位创意工作者——无论是设计师、插画师、文案策划还是视频创作者,最近几个月,你的工作流里可能多了一个新伙伴:Claude。这个由Anthropic推出的AI助手&a…...
