Ubuntu16.04编译netmap-终极解决方案

news/2024/5/18 13:38:31 标签: 网络, 服务器, udp, 协议栈

Ubuntu16.04编译netmap-终极解决方案

  • 1 前言
  • 2 环境准备
  • 3 netmap下载
  • 4 编译
  • 5 网卡名称修改
  • 6 测试

1 前言

最近想着自己实现用户态网络协议栈,需要依赖netmap获取底层网卡数据,一般这种三方库编译都是很easy的,我也是抱着这个思想结果遇到很多坑,这里记录一下希望可以给后面的人提供一些参考。

2 环境准备

首先更新一下源:

sudo apt-get update

安装依赖库,netmap需要依赖内核的头文件,这里需要提前安装一下

apt-get install -y linux-headers-$(uname -r)

3 netmap下载

git clone https://github.com/luigirizzo/netmap.git

4 编译

根据网上网上看到最多的是一键三连:

./configure && make && make install

然后就各种报错了,这里做了删减,保留主要信息如下:大概的意思就是需要下载这些库,然后保存到
/home/learn/netmap-master/LINUX/ext-drivers目录下。因为需要梯子的缘故都下载失败了,只能苦逼手动下载了一遍。后面才知道其实只需要下载你需要支持的网卡驱动就行…比如比较常用的eth对应的就是e1000e-3.4.0.2.tar.gz的包。

***     --kernel-sources=/path/to/sources

***   test -e /home/learn/netmap-master/LINUX/ext-drivers/mlnx-en-5.3-1.0.0.1-ubuntu18.04-x86_64.tgz || wget http://content.mellanox.com/ofed/MLNX_EN-5.3-1.0.0.1/mlnx-en-5.3-1.0.0.1-ubuntu18.04-x86_64.tgz -P /home/learn/netmap-master/LINUX/ext-drivers

***   test -e /home/learn/netmap-master/LINUX/ext-drivers/i40e-2.4.6.tar.gz || wget https://sourceforge.net/projects/e1000/files/i40e%20stable/2.4.6/i40e-2.4.6.tar.gz -P /home/learn/netmap-master/LINUX/ext-drivers/

***   test -e /home/learn/netmap-master/LINUX/ext-drivers/ixgbevf-4.3.2.tar.gz || wget https://sourceforge.net/projects/e1000/files/ixgbevf%20stable/4.3.2/ixgbevf-4.3.2.tar.gz -P /home/learn/netmap-master/LINUX/ext-drivers/

***   test -e /home/learn/netmap-master/LINUX/ext-drivers/ixgbe-5.3.8.tar.gz || wget https://sourceforge.net/projects/e1000/files/ixgbe%20stable/5.3.8/ixgbe-5.3.8.tar.gz -P /home/learn/netmap-master/LINUX/ext-drivers/

***   test -e /home/learn/netmap-master/LINUX/ext-drivers/igb-5.3.5.20.tar.gz || wget https://sourceforge.net/projects/e1000/files/igb%20stable/5.3.5.20/igb-5.3.5.20.tar.gz -P /home/learn/netmap-master/LINUX/ext-drivers/

***   test -e /home/learn/netmap-master/LINUX/ext-drivers/e1000e-3.4.0.2.tar.gz || wget https://sourceforge.net/projects/e1000/files/e1000e%20stable/3.4.0.2/e1000e-3.4.0.2.tar.gz -P /home/learn/netmap-master/LINUX/ext-drivers/

***   test -e /home/learn/netmap-master/LINUX/ext-drivers/virtio_net.c || wget https://raw.githubusercontent.com/torvalds/linux/v4.9/drivers/net/virtio_net.c -P /home/learn/netmap-master/LINUX/ext-drivers/

下载后的目录:
在这里插入图片描述
再次一键三连基本就很ok:

./configure --kernel-sources=/usr/src/linux-headers-4.4.0-142-generic
make -j 4 && make install

这里有个注意点就是configure在适配内核的时候,执行会卡很久,不用怀疑失败了,我就是这里被坑了,自己咔掉,然后各种找资料,各种无解,可以先去玩耍一下:
在这里插入图片描述

5 网卡名称修改

如果你查看自己的网卡名称不是eth0,又可以学知识了。

ifconfig
ens33 Link encap:Ethernet HWaddr 00:0c:29:16:55:fc
inet addr:192.168.88.160 Bcast:192.168.88.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe16:55fc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:232399 errors:40 dropped:125 overruns:0 frame:0
TX packets:124764 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:258555713 (258.5 MB) TX bytes:17560092 (17.5 MB)
Interrupt:19 Base address:0x2000

具体操作步骤如下:
1 修改网卡名称:

vi /etc/default/grub
#修改这句,有其他内容直接追加就行
GRUB_CMDLINE_LINUX=“net.ifnames=0 biosdevname=0”
#生效
grub-mkconfig -o /boot/grub/grub.cfg

2 修改网络配置

vi /etc/network/interfaces
#将ens33替换成eth0即可
auto eth0
iface eth0 inet static
address 192.168.88.160
netmask 255.255.255.0
gateway 192.168.88.254
dns-nameservers 8.8.8.8
#生效,失败的直接重启
/etc/init.d/networking restart
在这里插入图片描述

6 测试

#加载ko
insmod netmap.ko
#查看
lsmod | grep netmap
在这里插入图片描述
#测试
pkt-gen -i ens18 -f tx -l 60
在这里插入图片描述
注意:不要在ssh测试,因为netmap接管数据后,ssh会失效,直接在虚拟机上测试
#恢复
rmmod netmap.ko


http://www.niftyadmin.cn/n/927472.html

相关文章

音视频开发-音频库使用tinyalsa使用

前言 TinyALSA 是一个在 Linux 内核中与 ALSA 接口的小型库。tinyalsa主要是为了解决alsa库过于庞大,同时接口繁杂,不利于用户的使用。tinyalsa主要是alsa内核的用户层音频接口,屏蔽内核的设备操作过程,为用户层提供对于设备的基…

UDP用户态协议栈详细实现

UDP用户态协议栈详细实现1 前言2 网络协议格式2.1 以太网协议2.2 IP协议2.3 UDP协议2.4 ARP协议2.5 ICMP协议3 UDP用户协议栈实现1 前言 首先需要回答一个问题,为什么要学习实现用户态协议栈,从技术角度分析,主要是由于用户态的网络协议栈更…

企业级线程池实现

异步多任务组件-线程池实现1 前言2 线程池的工作原理2.1 结构体定义2.2 线程池处理流程3 线程池实现3.1 线程池创建3.2 线程池销毁3.3 线程池添加任务3.4 线程池woker处理函数3.5 队列操作函数1 前言 线程池作为作为开发过程中的利器,具有的优势也非常明显&#xf…

内存管理-内存池的实现

内存池的实现1 前言2 内存池的原理2.1 内存利用链表进行管理2.2 分配固定大小2.3 按块进行内存管理3 内存池的实现3.1 内存池的创建3.2 内存池的销毁3.3 内存分配3.4 大块内存分配3.5 小块内存分配3.6 内存的对其问题1 前言 内存池出现的意义比较重大,对于服务器这…

企业级请求池实现

企业级请求池实现1 前言2 异步请求池原理2.1 基本原理2.2 结构体设计3 请求池实现3.1 请求池创建3.2 请求池销毁3.3 请求响应函数3.3 请求函数1 前言 请求池出现的运用场景,主要是为了解决同步处理带来的阻塞导致效率的大大降低,异步请求池将请求事件和…

企业级连接池实现

企业级连接池实现1 前言2 连接池设计2.1 连接池原理2.2 数据结构设计3 mysql连接过程4 连接池的实现4.1 连接池创建4.2 连接池销毁4.3 连接获取4.4 连接归还5 测试1 前言 连接池主要解决的问题就是,服务器对数据库的后半段的连接问题,这个过程连接对象是…

多线程操作与安全

多线程操作与安全1 互斥锁1.1 使用场景1.2 基本操作2 自旋锁2.1 使用场景2.2 基本操作3 原子操作3.1 使用场景3.2 基本操作4 线程私有空间4.1 使用场景4.2 基本操作5 信号量5.1 使用场景5.2 基本操作1 互斥锁 1.1 使用场景 互斥锁的特性: 当遇到锁被占用&#xff…

地表最强队列-ZMQ无锁队列

1 前言 老规矩,介绍前先简单聊一下为啥需要无锁队列,主要解决了哪些问题。首先是为啥需要无锁队列,我们最常见的就是利用锁保护临界资源,在多线程中进行队列操作,当并发量起来会带来大量的线程切换开销,而…