Wireshark是个优秀的网络包嗅探工具,对于学习理解网络知识有很大的帮助。中标麒麟桌面版本没有集成这一软件,所以想自己试着安装并学习一下如何制作RPM包。
学习了《fedora官网RPM包制作指南》后,觉得事情比较简单,主要就是编辑一个SPEC配置文件嘛,加上configure、make、make install等指令,修改修改描述说明什么的就完活了。于是想先找个wireshark源码包,再找一个现成的SPEC文件,比如fedora21的SRPM包中就有,然后稍作修改就可以用rpmbuild工具制作出二进制安装包。实际一动手,远不是那么回事:一运行报出一大堆错误,光是这个现成的SPEC文件就有1000多行,竟是%和$,看都看晕了,别说修改了。怎么办?老老实实地手工编译安装一下吧。
0、准备环境
用前两篇所写的中标麒麟桌面版7.0+全部的SDK环境。wireshark源码包为2.2.2版,解压到家目录下。
1、研究 README和INSTALL文件
通过研究分析README.*和INSTALL.*文件,得知wireshark依赖下列软件包:
gtk3(版本号 >=3.0.0)或 qt,用于生成图形操作界面,有一个就可以。
gtk3-devel
glib2(版本号 >= 2.16.0)
libpcap和libpcap-devel
Perl
Python
flex(版本号 >= 2.5.1)
bison 或yacc
运行命令yum list installed gtk*等查看系统中是否有这些包,用pkg-config --modversion查看库版本是否符合要求。得知系统还缺少libpcap-devel,幸运的是最近中标麒麟官网下载网站更新了,这个包可以直接yum install。
再分析:
“you need to make the dumpcap program set-UID to root”,说明wireshark需要调用dumpcap程序捕获网络包,这需要root权限,因此要为configure命令指定--enable-setuid-install参数。
“Wireshark needs a modern version of zlib to be able to use zlib to read gzipped files; version 1.1.3 is known to work.”,说明wireshark需要1.1.3以上版本的zlib包来读取存在压缩文件中的网络包。
“Wireshark can do some basic decoding of SNMP packets; it can also use the libsmi library to do more sophisticated decoding, by reading MIB files and using the information in those files to display OIDs and variable binding values in a friendlier fashion. ”,说明wireshark需要libsmi包来分析SNMP协议。
“make rpm-package # Builds a binary package using rpm”,好极了,说明wireshark本身就提供了制作RPM包的方法。
2、运行查看./configure --help 编译参数
“--with-gnutls=[yes/no] use GnuTLS library [default=yes, if available]”,运行命令yum info gnutls,得知是个SSL、TLS等安全通信协议库,系统已安装。
“--with-gcrypt=[yes/no] use gcrypt library [default=yes, if available]”,是个GPG加密库,已安装。
“--with-libnl[=VERSION] use libnl (force version VERSION, if supplied)[default: yes, if available]”,是内核网络连接套接字库,已安装。
“--with-lua[=DIR] use liblua (located in directory DIR, if supplied) for the Lua scripting plugin [default=yes, if available]”,是一种脚本语言库,没找到这个软件包,先暂时放下。
“--with-portaudio[=DIR] use libportaudio (located in directory DIR, if supplied) for the GTK+ RTP player [default=yes, if available]”,是音频库,系统未安装,包名叫portaudio。
“--with-ssl[=DIR] use SSL crypto library (located in directory DIR, if supplied) [default=no]”,是SSL加密库,wireshark默认不启用,这里改为启用,即给configure加上--with-ssl参数。
“--with-krb5[=DIR] use Kerberos library (located in directory DIR, if supplied) to use in Kerberos dissection [default=yes]”,是加密验证库,不知道包的名字,先放下。
“--with-c-ares[=DIR] use c-ares (located in directory DIR, if supplied)[default=yes, if present]”,是异步DNS查询库,已安装。
“--with-geoip[=DIR] use GeoIP (located in directory DIR, if supplied)[default=yes, if present]”,是查询IP地址地理位置的库,未安装。
“ --with-libssh[=DIR] use libssh (located in directory DIR, if supplied)[default=yes, if present]”,是SSH协议库,未安装。
“--with-sbc=[yes/no] use SBC codec to play Bluetooth A2DP stream[default=yes, if available]”,是一种蓝牙编码协议,已安装。
“--with-extcap[=DIR] use extcap for external capture sources (installed in DIR, if supplied) [default=yes, if possible]”,不知道是什么包,先放下。
“--enable-tfshark”和“--enable-echld”,是两个专家级的选项,默认不启用。通过查看configure脚本等,最后发现这是wireshark将要生成的功能模块。不管3721,先加上再说。
综上,本着全功能、多多益善的原则,缺少的包全部安装上,未开启的选项全部开启,形成了configure的4个运行参数,即:
configure --enable-setuid-install --enable-tfshark --enable-echld --with-ssl
3.实际运行configure
制作的RPM包默认安装到/usr/local目录,为便于测试调整,试验阶段增加--prefix参数指定一个属于自己的独立安装目录,防止和系统文件混在一起。最后实际制作时再取消这个参数。
运行结果报出错误:“couldn‘t find lrelease-qt5 or lrelease”。到处找不到这是哪个包的程序,只查出是QT的一个组件,最后在一个叫Rpmfind的网站找到了包名是qt5-linguist,与语言转换有关的软件包,安装上。这个Rpmfind网站可以通过程序名、库名查出软件是在哪个包中,值得收藏!
最后得到编译参数结果,有几个“no”:
Use c-ares library : no
Use SMI MIB library : no
Use GeoIP library : no
Use nl library : no
Use SBC codec library : no
Use Lua library : no
Build sshdump : no
Build Qt RTP player : no
Build GTK+ RTP player : no
以上均是系统缺少相应软件的开发包(devel包),安装上。查找确认这些问题时,主要是看软件本身是否已安装,configure脚本中有什么要求,config.log(configure在当前目录下产生的结果日志)中有什么提示信息。挺费劲:(
“Install dumpcap with capabilities : no”,查看INSTALL和config.log文件,这个参数是指当dumpcap提升为root权限时,是否具有cap_net_admin和cap_net_raw两种网络管理权限,默认不具有。从安全考虑,用默认值吧。
重新运行configure,终于出现“全功能”参数配置:
其中“Use dumpcap group”估计是与setuid相同的作用,所以没设置;“Build profile binaries”估计是将wireshark程序配置文件保存为二进制格式,取默认值不启用这个选项。
4、运行make查看编译结果
又报出了错误:/usr/bin/ld: echld_test-cfile.o: undefined reference to symbol ‘wtap_block_get_string_option_value‘ ,/试验目录/lib/libwiretap.so.6: error adding symbols: DSO missing from command line,collect2: error: ld returned 1 exit status。
这个编译错误恐怕是源程序、连接库方面的问题,非菜鸟所能为,放弃了,取消 configure中的--enable-echld参数,再重新configure、make。
5、make install
然后在测试目录里运行一下,OK!
6、用make rpm-package命令制作RPM包
幸运的是,wireshark源码包中居然提供了制作RPM包的命令,这可省不少事。运行之后在wireshark-2.2.2/packaging/rpm目录下生成了如下目录文件,与rpmbuild工具的目录结构一模一样:
可以看到生成了3个版本的RPM包、1个SRPM包、1个SPEC文件。3个RPM包分别是命令行版、gtk版、qt版,gtk和qt版分别依赖命令行版。
7、测试安装各个RPM包
在测试机器上运行yum install wireshark-2.2.2*.rpm,所依赖的软件包自动从官网下载安装。
8、测试运行
运行wireshark之前要注意setuid问题:
可以看到普通用户不能执行dumpcap,也就是不能捕获网络包,只有root用户和wireshark组的用户才行,因此需要将普通用户加入wireshark组:usermod -G wireshark XXX。
测试中,命令行版和qt版的wireshark都没什么问题,但gtk版的工具栏太宽了,且安装并重启后系统开始菜单栏里还没有wireshark-gtk项,需要手工运行,不知是什么原因。在命令行中可通过wireshark-gtk启动这个程序:
但在命令行中显示了一些参数失效的提示,感觉是gtk库的问题,似乎gtk不如qt发展的好。反正两者都是提供图形界面功能,用哪个都行,因此gtk版的可以删除。
算是对自己的奖励,赶快将Wireshark2.2.2命令行和QT版RPM包上传至51CTO下载中心:)
9、遗留问题
甲、费了好几天的劲,RPM包是作出来了,但常规的用rpmbuild工具配合SPEC文件的方法还没研究。
乙、echld功能因编译错误,没有实现出来。
丙、gtk版本不理想。
10、感悟
甲、制作RPM包相当于程序开发,需要一定的程序员功底。
乙、对要制作的对象最好有相当程度地熟悉,否则要走很多冤枉路,还稀里糊涂。
丙、安装依赖包时,要一并安装其devel包。
丁、要认真研究INSTALL、README和configure --help。
戊、要熟练掌握yum search、list、info,rpm -q,pkg-config,Rpmfind网站等工具。
己、善用configure脚本、config.log查错,当然少不了baidu。
庚、对linux要报有深厚的感情,并愿意为其的自由付出辛苦的代价,总之要有hacker精神。
辛、源代码和机器软硬件架构一样,但二进制代码和功能可能不一样,就像上述选择参数的过程。软件所依赖的包同样有这个问题,这恐怕也是各发行版RPM包无法顺利互通的主要原因。对此,没有统一的标准和规范,这个问题无解,有了统一的标准和规范,linux也就不是linux了:)。
原文地址:http://speedwind.blog.51cto.com/11475188/1876883