背景介绍:
最近因工作需要对lldp进行验证,以确认我们的系统是否支持lldp协议。lldp协议全称为链路层发现协议(Link Layer Discovery Protocol),
在baidu、bing以及aol后发现介绍协议本身的博客内容较多,但真正介绍如何验证的可谓是凤毛麟角。
为了不让将近1周的汗水白流,特把这次验证过程记录下来写成如下这篇博文。
验证前准备:
通过搜索发现有网上目前有两种支持lldp的开源软件,一种叫open-lldp,另一种叫lldpd。经过查证分析,open-lldp较长时间没有再更新且不完全支持lldp,
因此决定采用另外一种,即:lldpd来进行验证。我使用的版本为:lldpd-0.7.19.tar.gz,如果下载可以在网上搜一下可以找到,另外这个地址对如何安装进行了介绍,
是我在验证过程中很重要的一份参考资料地址为:http://vincentbernat.github.io/lldpd/usage.html#lldpd8。
需要的软件已经找到了,验证环境呢?环境使用部门常用的arm单板,看PCB上面的丝印是IMX6S,飞思卡尔的单板。
单板上OS已经配置好,主要需要把lldpd进行交叉编译后安装到单板上然后启动运行。
用到的工具有网口,串口。其中串口是USB转的串口。
验证过程:
交叉编译的过程很费劲,这里耗的时间将近50%。主要是我对单板上的c库和我使用的工具链自带的库不够了解。
原来单板自带的buildroot环境中由于缺乏相关的库,导致没办法直接使用自带的工具链进行编译运行,于是不得不退而求其次,
使用另外一种也是部门常用的工具链进行编译。但是编译解决了,问题也随之而来。
什么问题呢?主要就是实际编译出的可执行程序需要的.so文件在单板环境上找不到,导致目标程序无法运行。
这里顺便介绍一下在嵌入式环境下如何解决使用源代码安装的问题。在PC/服务器上,我们安装开源软件的方法真的很简单,按照三部曲进行即可。
./configure
make
make install
然而在嵌入式环境下,编译器就不能直接使用PC/服务器自带的GCC,否则生成的目标文件还是x86的文件,这样把可执行文件下载到单板上后就会无法运行。那如何解决呢?
我一开始也没想到解决的办法,在上了N次度娘和实操后,发现了一种可行的办法。
./configure --host=xxx --prefix=yyy ;xxx是编译器的前缀,比如用的交叉编译工具是arm-linux-gcc,那么host就是arm-linux
;yyy是安装到的路径,默认好像是/usr/local/
make
make install
然后将yyy目录拷贝到目标单板环境上。这里要注意一点:虽然指定了host可能找不到,这种情况下需要在环境变量中指定一下路径,环境变量为LD_LIBRARY_PATH
解决了编译问题,现在验证能否正常运行。
这里有个小技巧,可以先编译一个小程序验证一下库是否支持,能否运行。内容随便,比如helloworld
通常不会是一下子就支持的,至少需要对应的ld-linux.so.3和libc.so.6,这两个ok的话,helloworld应该是可以正常运行的。
但是如果想要整个应用程序可以运行的话,那还得需要很多库,这里我也没有好办法,采用的笨办法是把交叉编译器里面的库全部拷过来,然后指定好环境变量。
虽然ldd工具有时候可以告诉我们运行程序要哪些.so,但是有的情况下ldd也报不了。
闲话说了一堆,现在步入正题,如何把lldpd跑起来。
在前面解决了交叉编译和运行所需要的库的前提下,现在就可以运行lldpd程序了,lldpd有2个部分,一个是daemon即lldpd,一个是客户端工具lldpcli
运行之前我们必须要先添加_lldpd用户和组,否则不能正常运行。
然后使用ifconfig查询单板环境的eth端口,比如需要通过eth0查看对端信息,那么就如下操作
./lldpd -i eth0 ; -i指定端口
./lldpcli ; 打开客户端
打开客户端后会进入客户端提示符,在该提示符下输入
show neighbors ports eth0
如果对端支持并且也打开了lldpd,那么就会看到对端返回的信息,否则返回错误提示或者为空
同样的道理,我们在对端单板上也按上面的操作就能看到对端的对端(也就是本端单板)返回的信息
信息就是下面的样子。
[lldpcli] # show neighbors ports eth0
-------------------------------------------------------------------------------
LLDP neighbors:
-------------------------------------------------------------------------------
Interface: eth0, via: LLDP, RID: 1, Time: 0 day, 00:00:11
Chassis:
ChassisID: mac 00:04:9f:03:53:1e
SysName: bw
SysDescr: Buildroot 2015.08.1 Linux 3.10.55-XXXX-5.01.20.P0 #2 SMP PREEMPT RT Thu Apr 23 08:53:38 CST 2015 armv7l
MgmtIP: 192.168.1.100
MgmtIP: fe80::204:9fff:fe03:531e
Capability: Bridge, off
Capability: Router, off
Capability: Wlan, off
Capability: Station, on
Port:
PortID: mac 00:04:9f:03:53:1e
PortDescr: eth0
-------------------------------------------------------------------------------
验证总结:
这里主要简单记录了一下验证的过程和要注意的问题。比如如何更好更快的解决交叉编译和库的问题,还需要再思考,有了结果再补充上来。如果大家有好的方法也请回复告诉我一下。