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