首页 > 代码库 > 中标麒麟学习笔记3:试验制作wireshark二进制安装包

中标麒麟学习笔记3:试验制作wireshark二进制安装包

    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了:)。


   



中标麒麟学习笔记3:试验制作wireshark二进制安装包