因为工作需要,要在Centos上安装netmap,也许是自己太菜了,整了一天多才OK,现在把整个流程几下来,方便大家学习交流。
1. 首先介绍一下我的环境:
我是在virtualbox上安装的Centos7, 内核版本为3.10.0-327.10.1.el7.x86_64
内核版本使用命令uname -r可以查看
其实原本的版本不是这个,由于查到的资料太杂乱了,期间用yum install kernel-devel安装了一次内核驱动程序(个人认为不安装一样可以),导致变成了现在这个版本, 不过问题不大,我们继续。
2. 下载安装netmap
主要依赖ruo_yo的文章http://www.cnblogs.com/ruo-yu/p/5083290.html
下面是下载netmap部分:
[root@huh ~]# git clone https://github.com/luigirizzo/netmap.git
netmap官网:http://info.iet.unipi.it/~luigi/netmap/
netmap的githab网址:https://github.com/luigirizzo/netmap
netmap手册:man /root/netmap/share/man/man4/netmap.4
通过GitHub将netmap克隆到本地,使用命令:git clone https://github.com/luigirizzo/netmap.git
进入netmap/LINUX
执行./configure命令,这个时候会出现以下提示:
主要是因为内核文件不全,netmap需要在内核目录的driver目录下查找“.c”文件,而我的系统中没有,所以要进行下面的第三大步。
3. 下载内核源代码
参考链接:https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source
如果你真的因为某个原因需要整个内核的源代码,它是有被提供的。
以一个不是 root 用户的用户,创建一个以 ~/rpmbuild 为基础的目录树:
[user@host]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} [user@host]$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
我们强烈推荐你不要以 root 的身份构建软件包。(见:Building Source RPM as non-root under CentOS)
要在 CentOS-7 安装源代码组件及工具:
以 root 的身份安装 rpm-build、redhat-rpm-config、asciidoc、bison、hmaccalc、cpatchutils、perl-ExtUtils-Embed、pesign、xmlto、audit-libs-devel、binutils-devel、elfutils-devel、elfutils-libelf-devel、ncurses-devel,newt-devel、numactl-devel、pciutils-dedvel、python-devel 及 zlib-devel 组件:
yum install rpm-build redhat-rpm-config asciidoc bison hmaccalc patchutils perl-ExtUtils-Embed pesign xmlto audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel
从这些地方找寻内核的源代码组件:
(请以相关的副版本编号、年度及月份取代 N.YYMM。)
以一个不是 root的普通户口,执行以下指令来安装源代码组件:
[user@host]$ rpm -i http://vault.centos.org/7.2.1511/updates/Source/SPackages/kernel-3.10.0-327.10.1.el7.src.rpm 2>&1 | grep -v exist
好吧如果你没有严格按照上面的命令写的话可能会出现警告信息:
这是说当前用户与见rpm的用户不一致,所以不用去管它,我们的文件已经生成了。
现在源代码组件已经安装了,请解压及预备源代码文件:
[user@host]$ cd ~/rpmbuild/SPECS [user@host SPECS]$ rpmbuild -bp --nodeps --target=$(uname -m) kernel.spec
$(uname -m) 这个值将目标结构设置为你的现有内核的结构。一般来说这是可行的,因为多数人需要以 i686 或 x86_64 为目标。
现在内核的源代码目录树可以在 ~/rpmbuild/BUILD/kernel*/linux*/ 这个目录内找得到。
我将这个目录拷贝移到了我的usr文件夹下,使用命令:mv ~/rpmbuild/BUILD/kernel-3.10.0-123.el7/linux-3.10.0-123.el7.x86_64/ /usr/src/kernels/
现在可以在netmap/LINUX下使用configure生成Makefile文件了,这里有几点要注意:
1. Centos7的内核为3.10.0-123.el7.x86_64,这个版本的virtio_net的patch有问题,make的时候会报错:
cp -Rp /usr/src/kernels/linux-3.10.0-123.el7.x86_64/drivers/net/virtio_net.c virtio_net.c
patch --posix --quiet --force -p1 < patches/diff--virtio_net.c--30900--30b00;
4 out of 7 hunks FAILED -- saving rejects to file virtio_net.c.rej
我因为只用到ixgbe,所以也只编译了这个, 关于如何处理patch的方法,请参考我的另一篇文章:http://blog.csdn.net/superbfly/article/details/51226532
这里面有一点注意,强烈建议使用kernel版本为3.10.0-123.el7.x86_64的内核,我试了3.10.0-123.el7.x86_64,3.10.0-229.el7.x86_64,3.10.0-327.el7.x86_64这3个版本,只有这个版本的ixgbe驱动不需要更改就可以直接编译通过。
2. 需要使用--kernel-sources指定源码目录,就是我们上面解压出来的目录。
ok,现在进入netmap/LINUX执行命令:./configure --drivers=ixgbe --kernel-sources=/usr/src/kernels/linux-3.10.0-229.el7.centos.x86_64 --kernel-dir=/usr/src/kernels/linux-3.10.0-229.el7.centos.x86_64
使用--drivers=来指定要编译的驱动
如果报如下错误,就将红色方框中的命令执行一下就可以了
执行make
就会看到生成的ixgbe.ko和netmap.ko文件了。
好吧现在我们要安装驱动了
执行以下命令
rmmod ixgbe
insmod /root/netmap/LINUX/netmap.ko
insmod /root/netmap/LINUX/ixgeb/ixgbe.ko
lsmod |grep ixgbe
这样就把驱动装上了
这里还遇到一些问题,另开一篇博客做了记录:https://blog.csdn.net/superbfly/article/details/52279793
如果装netmap.ko是报“insmod: ERROR: could not insert module ./netmap.ko: Invalid module format”的错误。
用dmesg | grep netmap命令可会查到如下错误信息
解决方法参考:http://blog.csdn.net/superbfly/article/details/64439630
要注意:因为会网卡驱动,会导致某些链接无效,所以建议以上命令及后续的测试命令都通过虚拟机本机操作,不要通过ssh工具操作
还有就是安装完驱动之后需要重启网卡,这里使用"ifconfig 网卡名(p6p1) up" 来启动。
使用pkt-gen程序进行收发包测试
使用./pkt-gen -i eth2 -f rx可以进行收包测试,使用./pkt-gen -i eth1 -f tx -l 64 -d 192.168.33.58可以进行netmap的 发送测试