作者简介:李晓云,Intel 软件工程师,主要从事DPDK PMD的开发工作
文章转载自DPDK与SPDK开源社区
- 接线
使用HDMI线连接盒子与显示器,将其中一个网络端口(下文以ETH0为例)接入有线网,并将电源插入电源接口,将USB外接键盘插入盒子的USB接口。DPDK盒子及接口示意图如图1所示。
- 启动登录
接通电源后,待盒子里的系统启动完毕,输入用户名和密码:
用户名: test 密码:tester - 登陆后获取根用户权限: sudo bash,这里会提示需要输入密码,密码同上:tester
- 安装igb网卡驱动
a. 使用其他电脑设备将igb 驱动下载保存至USB存储设备,并将其拷贝至盒子[1]。igb驱动下载链接:
https://sourceforge.net/projects/e1000/files/igb%20stable/5.3.5.15/
进入页面后下载对应版本的压缩包文件。
b. 安装:
tar –xvzf igb-xxxx.tar.gz
cd /igb-xxxx/src
make install - 将接入有线网的端口绑到igb驱动上
a. 查看端口状态信息,如图2所示:
cd dpdk
./usertools/dpdk-devbind.py -s图2 端口状态信息(绑定igb_uio驱动) b. 绑定igb驱动:
./usertools/dpdk-devbind.py -b igb 02:00.0
从图3可以看到,02:00.0口被绑到了igb上,接口名为eth0图3 端口状态信息(绑定igb驱动)
6.为eth0设置动态分配IP地址:
dhclient eth0
7.设置网络代理
export http_proxy=xxx
export https_proxy=xxx
8.从Github上下载 TRex
git clone href="https://github.com/cisco-system-traffic-generator/trex-core.git">https://github.com/cisco-system-traffic-generator/trex-core.git
9.安装TRex必需的库:
yum install zlib-devel
(如果提示由于网络问题yum install 失败, 编辑/etc/yum.conf, 加上一行设置代理: proxy= xxx)
10.不论实际使用1个还是多个端口,TRex需要至少两个端口,因此需要将绑到igb驱动的eth0绑回到原来的igb_uio(内核空间的驱动)上:
cd dpdk
./usertools/dpdk-devbind.py -b igb_uio 02:00.0
11.编辑TRex的配置文件:
vi /etc/trex_cfg.yaml(注意yaml文件的缩进格式)
在/trex-core/scripts/cfg下有一些配置文件示例可供参考。
也可使用TRex中的脚本dpdk_setup_ports.py来创建一个简单的文件,内容如图4所示。具体如何创建配置文件请参考TRex的官方网站[2]。
cd /trex-core/linux_dpdk
./b configure
./b build
13.启动 TRex 服务器端,结果如图5所示:
cd /trex-core/scripts
./t-rex-64 -i -c 2(盒子的两个端口都需要有连接,不然会报错,详细的命令行参数请参考官方网站[2],另hugepage错误参见[3])
cd /trex-core/scripts
./trex-console
(由于当前终端被服务器端占有,切换新的终端用来启动TRex客户端:CTRL+ALT+F2,CTRL+ALT+F1可切换回TRex服务器端)
trex> help(帮助命令,显示所支持的命令,如:发包命令start,停止发包stop,图形化显示命令tui)
trex> start -h (对于每条命令,加上-h或—help可以显示具体的帮助信息)
TRex客户端发包示例命令:
trex> start -f stl/bench.py -t size=64,vm=cached —port 0 -m 100%
(如果将ETH0和ETH1用网线互连,则该命令可实现从 port 0发送64 bytes长度的数据包到 port 1,结果如图6和图7所示。具体的参数用法参见start -h,下面给出该示例参数的含义。)
其中,-f表示加载的发包脚本文件,这里指定了文件stl/bench.py;
-t表示发包脚本bench.py可传递的参数,这里指定了数据包长度size=64,Virtual OS模式vm=cached;
-p或 —port表示发包端口,这里指定从0号端口发包;
-m 或 —multiplier表示发包速率,这里指定用线速的100%发包。
步骤14指定发包脚本为bench.py,而用户可以参照示例根据需求编辑自己的发包脚本。scripts/stl目录下包含多种发包脚本示例,各个脚本的具体写法和用法参见
https://github.com/cisco-system-traffic-generator/trex-core/blob/master/doc/trex_stateless.asciidoc
接下来,以stl/udp_1pkt_simple.py为例稍作介绍。
其中register()和get_streams()两个函数是必须定义的。
STLPktBuilder()是构造数据包的函数,会构造出pkt数据包,并以mode模式进行发包。Trex采用scapy构造数据包,因此数据包pkt的构造与scapy一致,通过layer的叠加从而达到构造数据包的目的。scapy构造数据包的具体规则参见:http://scapy.readthedocs.io/en/latest/
STLTXCont()是连续发包模式,可携带参数指定发包速率,默认是10 pps。此外,还有STLTXSingleBurst()和STLTXMultiBurst()两种模式。模式的函数定义在rex库中,如果感兴趣,可以阅读注释了解更详细的内容:scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_streams.py
注:
[1] 从外接USB设备拷贝文件:
插入USB设备后,可以使用 dmesg 命令找到设备的路径。
以/dev/sdb1 为例,挂载该设备: mount /dev/sdb1 /mnt
加载后用常规的命令将文件拷贝至任意路径 (cp, mv等)
拷贝完毕后,取消USB设备挂载并拔除: umount /mnt
[2] TRex 官方手册: https://trex-tgn.cisco.com/trex/doc/trex_manual.html#
[3] 如何解决 hugepage相关报错:
在TRex的dpdk-setup_ports.py 脚本中,有hugepage配置函数config_hugepages()
由于盒子本身的空间不够会导致hugepage配置失败,该函数会报错。 可以将 “wanted_count = 2048” 中的数字改小, 如:“wanted_count = 512”, 从而使hugepage配置成功。