參考的是這個大牛的文章:http://blog.csdn.net/fan_hai_ping/article/details/6705170
系統環境:centos6.5 開發版
PF_RING版本:PF_RING-5.6.2
0. 卸載系統自帶的網卡驅動
編譯安裝PF_RING之前需要卸載原來的網卡驅動,卸載之前使用ethtool命令查看當前網卡的類型和驅動版本。
# ifconfig //查看網卡的名稱,如果是單網卡一般是eth0,雙網卡的話,找到你要使用pf_ring的網卡名字替換下面的eth0
# ethtool -i eth0 //查看網卡的驅動名稱
# lsmod | grep e1000e //查看網卡驅動是否存在
# rmmod e1000e //卸載電腦自動安裝的網卡驅動 此處為e1000e驅動
注:如果使用ssh遠程卸載驅動會造成網絡不能連接,務必現場操作。
1. 首先安裝:numactl-2.0.3
2. 編譯安裝PF_RING內核模塊
解壓縮PF_RING安裝包,進入到Kernel目錄下編譯和安裝內核補丁。
# tar -zxf PF_RING.4.7.0.tar.gz # cd PF_RING.4.7.0/ # make //直接在跟目錄下面make,進行全部編譯
# cd PF_RING.4.7.0/kernel # make # sudo make install //內核安裝需要root用戶權限
insmod <PF_RINGPATH>/kernel/pf_ring.ko [transparent_mode=0|1|2] [min_num_slots=x][enable_tx_capture=1|0][enable_ip_defrag=1|0][quick_mode=1|0]
加載pf_ring內核模塊,進入/lib/modules/<redhat-version>/kernel/net目錄,可以看到有pf_ring目錄,進入到該目錄下進行PF_RING模塊的安裝。
# sodu insmod pf_ring.ko transparent_mode=1 //最好設置一下,官方解釋是2的性能最好,但是有大神測試后發現差別並不是很大
具體的mode取值的測試可以參考這個鏈接:
http://jaseywang.me/2015/02/28/%E9%80%9A%E8%BF%87-tcpcopypf_ring-%E5%AF%B9-bcm-5719-%E5%B0%8F%E5%8C%85%E5%81%9A%E7%9A%84%E5%A4%9A%E7%BB%84-benchmark/
當PF_RING激活時,會創建/proc/net/pf_ring目錄,使用cat命令查看pf_ring的屬性信息:
# cat /proc/net/pf_ring/info
注:為了編譯PF_RING內核模塊,你需要安裝Linux內核的頭文件(或者內核源代碼)。
3. 編譯安裝PF_RING所需依賴庫
進入到用戶空間庫userland/lib下,編譯和安裝。
# cd ../userland/lib # ./configure # make # sodu make install
如果需要使用libpcap抓包分析,請卸載之前安裝的libpcap,然后進入/userland/libpcap-xxx-ring/目錄下配置、編譯和安裝驅動。
卸載原來的libpcap:
# rpm -qa libpcap //查看安裝的libpcap,如果有libpcap則強制卸載
# rpm --nodeps -e libpcap //按照原文的報錯,沒有--nodefs選項,使用的是--nodeps,不驗證包依賴性, –e 選項,意思是擦除erase
安裝pf_ring的libpcap:
# cd ../libpcap # ./configure # make # sudo make install
注:為了使用PF_RING的優點,請使用PF_RING使能的libpcap.a重新編譯應用。
4. 編譯網卡的驅動
進入到drivers目錄下,根據ethtool -i ethx命令查看的網卡類型和驅動進入指定的目錄進行編譯和安裝。
# cd /root/soft/PF_RING/PF_RING-5.6.2/drivers/PF_RING_aware/intel/e1000e/e1000e-2.0.0.1/src # make # sodu make install
安裝網卡驅動,進入到目錄lib/modules/<redhat-version>/kernel/drivers/net下進行網卡驅動安裝。
//網卡所在目錄: /root/soft/PF_RING/PF_RING-5.6.2/drivers/PF_RING_aware/intel/e1000e/e1000e-2.0.0.1/src
# sodu insmod e1000e.ko //安裝pf_ring網卡驅動
# sodu modprobe e1000e //只能載入/lib/modules/<kernel ver>/中模塊
安裝完畢,使用dmesg命令查看驅動信息:
# dmesg | grep Ethernet
5. 測試網絡的接收的包數
進入到userland/examples目錄編譯例子程序。
# cd <PF_RING PATH>/userland/examples # make # ./pfcount -i eth0 //捕獲eth0網口的數據報文
注:使用drivers/intel/ixgbe下的驅動(支持DNA的ixgbe驅動的網卡)+DNA驅動技術可以達到線速采集,PF_RING模塊必須在DNA驅動之前加載。
6. 常見錯誤及解決方法
1. 編譯網卡模塊驅動錯誤
驅動所在目錄:/root/soft/PF_RING/PF_RING-5.6.2/drivers/PF_RING_aware/intel/e1000e/e1000e-2.0.0.1/src
錯誤信息:/root/soft/PF_RING/PF_RING-5.6.2/drivers/PF_RING_aware/intel/e1000e/e1000e-2.0.0.1/src/kcompat.h:3039: error: conflicting types for ‘netdev_features_t’
解決方法:vim kcompat.h +3039 // 注釋掉第3039行
2. 網卡驅動模塊所在目錄:/root/soft/PF_RING/PF_RING-5.6.2/drivers/PF_RING_aware/intel/e1000e/e1000e-2.0.0.1/src
加載網卡驅動模塊:insmod e1000e.ko