天天看點

中标麒麟學習筆記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,終于出現“全功能”參數配置:

中标麒麟學習筆記3:試驗制作wireshark二進制安裝包

其中“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:試驗制作wireshark二進制安裝包

    可以看到生成了3個版本的RPM包、1個SRPM包、1個SPEC檔案。3個RPM包分别是指令行版、gtk版、qt版,gtk和qt版分别依賴指令行版。

    7、測試安裝各個RPM包

    在測試機器上運作yum install wireshark-2.2.2*.rpm,所依賴的軟體包自動從官網下載下傳安裝。

    8、測試運作

    運作wireshark之前要注意setuid問題:

中标麒麟學習筆記3:試驗制作wireshark二進制安裝包

    可以看到普通使用者不能執行dumpcap,也就是不能捕獲網絡包,隻有root使用者和wireshark組的使用者才行,是以需要将普通使用者加入wireshark組:usermod -G wireshark XXX。

    測試中,指令行版和qt版的wireshark都沒什麼問題,但gtk版的工具欄太寬了,且安裝并重新開機後系統開始菜單欄裡還沒有wireshark-gtk項,需要手工運作,不知是什麼原因。在指令行中可通過wireshark-gtk啟動這個程式:

中标麒麟學習筆記3:試驗制作wireshark二進制安裝包

    但在指令行中顯示了一些參數失效的提示,感覺是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了:)。