背景介绍:
最近因工作需要对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
				-------------------------------------------------------------------------------
			  
验证总结:
			  
			  这里主要简单记录了一下验证的过程和要注意的问题。比如如何更好更快的解决交叉编译和库的问题,还需要再思考,有了结果再补充上来。如果大家有好的方法也请回复告诉我一下。
 
                     
                    
                 
                    
                 
         
