NetMap编译搭建

来源:互联网 发布:网易跟帖知乎 编辑:程序博客网 时间:2024/06/06 01:44

       netmap是Luigi Rizzo(牛人)在FreeBSD和linux下一个高性能抓包的平台.  据说在单核900MHZ的CPU上就能跑出14.8Mpps的性能. 

       前段时间配置研究了下, 现整理下文档. 


       基础工作

       安装tar解压工具 yum -y installtar

       安装lrzsz文件传输工具 yum -yinstall lrzsz 控制台中远程和服务器传输文件很方便

       安装编译工具 yum -y install gcc    yum -y install gcc-c++

       yum -yinstall  ncurses-devel

       编译内核

Netmap需要系统内核代码 并且要与运行的系统内核完全一致 包括小版本和补丁号 比较苛刻.

首先我安装的系统是Centos 6.2

[root@localhost ~]# uname -r

2.6.32-220.el6.x86_64

 

从网站http://rpm.pbone.net/  下载源代码rpm包 kernel-2.6.32-220.el6.src.rpm

放到TMP目录下

rpm2cpiokernel-2.6.32-220.el6.src.rpm | cpio –vi 导出一个源代码的压缩包

然后tmp目录下就多了个 linux-2.6.32-220.el6.tar.bz2

然后再解压这个包

tar –vxf linux-2.6.32-220.el6.tar.bz2

然后看到多了个目录linux-2.6.32-220.el6

 

这个目录里就是编译netmap需要的匹配的内核代码.  但是现在还不够

现在linux的代码 需要自己make下 有些文件才能自动生成 比如version文件 少文件后面netmap编译不过

但在make 之前还需要改下Makefile

 [root@localhost linux-2.6.32-220.el6]# viMakefile

 

VERSION = 2

PATCHLEVEL = 6

SUBLEVEL = 32

EXTRAVERSION= -220.e16.x86_64 //之前这里是空的填上我现在内核的版本不然后面netmapIGB模块编不过 . 其实这个很奇怪的事, 我既然下载的220.e16的代码为什么它这里不填220.e16?

NAME = Man-Eating Seals ofAntiquity

RHEL_MAJOR = 6

RHEL_MINOR = 2

RHEL_RELEASE = 219

 

改完Makefile可以开始编了

Make oldconfig 与我现在的系统配置一致

Make prepare

Make

整个内核编译过程大概半个小时以上.

最后编不过

CC      crypto/signature/ksign.o

  CC     crypto/signature/ksign-parse.o

  CC     crypto/signature/ksign-keyring.o

  CC     crypto/signature/ksign-publickey.o

crypto/signature/ksign-publickey.c:2:17:error: key.h: No such file or directory

crypto/signature/ksign-publickey.c:In function ?.sign_init?.

crypto/signature/ksign-publickey.c:10:error: ?.sign_def_public_key?.undeclared (first use in this function)

crypto/signature/ksign-publickey.c:10:error: (Each undeclared identifier is reported only once

crypto/signature/ksign-publickey.c:10:error: for each function it appears in.)

crypto/signature/ksign-publickey.c:11:error: ?.sign_def_public_key_size?.undeclared (first use in this function)

make[2]: ***[crypto/signature/ksign-publickey.o] Error 1

 

这是第二个我很奇怪的地方啥都没动居然编不过

第一个是小版本补丁号没填. 前面提到

最后我把netmap环境搭起来后发现极为不稳定我怀疑整个系统的代码包有较大嫌疑

不过我找几天也只能找到这个RMP的包版本匹配centos 6.2.

 

话说回来.为什么我开始要用Centos? Netmap不限制系统版本, 我其实可以用ubuntu其他的.

因为在linux服务器系统中 红帽的一直是企业级别中的黄金版. 稳定压倒一切.

其实我也可以自己编个内核 比如3.2的, 然后make install 装一个新的系统, 这样相当于把centos内核全部换了. 其实我也这么干过, netmap还是配起来了. 但后来综合考虑还是算了. 原因还是稳定. 自己编的内核跟centos没法比, 后期如果只有我一个人根本没有精力和能力维护一个内核, 如果产品化后客户环境系统不稳定, 我恐怕也是没有能力解决. 如果有红帽这样一个团队维护的内核可以大幅降低这种风险, 而且是0成本的.

因此netmap方案的路线就是采用centos, 然后找一个匹配的内核代码 只编译不安装.

 

接着前面说, 这个包编不过怎么办?  我编译内核的目的只有两个

1 是拿到需要编译才自动生成的文件 比如version.h 后面编netmap需要

2 系统编完后会生成一个Module.symvers文件. 如果没有这个文件后面加载netmap内核模块时系统报错. 大概意思是版本信息没有.

因为我不安装编译的内核我并不是要真正全部编过.

第一个目的 开始make 1分钟就搞定了 后面可以Ctrl+c停了

第二个目的 只能通过其他方式得到

  网站http://rpm.pbone.net/上下载 kernel-devel-2.6.32-220.el6.x86_64.rpm

Rmp –i kernel-devel-2.6.32-220.el6.x86_64.rpm

安装完成后在  /usr/src/kernels/2.6.32-220.el6.x86_64目录下把Module.symvers文件复制到我准备的内核代码目录中

 

整个内核代码的准备完成


编译netmap


装一个libpcap-devel

Yum install libpcap-devel

 

进入Netmap/Linux目录下

Make KSRC=/tmp/ linux-2.6.32-220.el6

编完后可以看到有几个模块

Netmap_lin.ko  //netmap的模块

后面是驱动的

Igb.ko

E1000e.ko

````````

全部加载 insmod

编译demo

Make KSRC=/tmp/ linux-2.6.32-220.el6apps

有个编不过testlock 不要紧 没用到

主要是用pkt-gen来测试

Pkt-gen –i ethx –f rx

 

 

整个netmap的代码量很少, 不过并不是少就简单了. 因为它要和系统内核代码 还有网卡驱动一起编.

也就是说大部分的代码你得自己找. 有些过程作者压根也没提, 他以为你都懂.

而pf_ring商业化就比较好, 文档很细, 代码全套

举个简单的例子 netmap系统重启后你就得重新把所有模块都insmod一遍

而pf_ring 通过make install里面就安装好了. 重启后就自动配好.  Netmap你就得自己写这写脚本了

 

 

 

 

 

可以看到它的MAKEFILE里面主要分两部

第一步是查看内核代码目录中的内核版本, 根据版本将内核和驱动所需的代码复制到自己目录并打上补丁. 然后才是真正的编译.

 

虽然netmap的作者很牛, 而且免费, 官方性能报告和稳定性都很高.

经过最后的实际测试发现效果比预期的差太远, 极为不稳定

 

 

是netmap对2.6.32支持不好吗?

还是我找的内核代码有问题?

或者整个版本是linux下的第一版还有bug?

 

 

或许再等等, 年底centos 7出来后在测试下 希望性能能达到预期