2015年1月4日 星期日

用VirtualBox建立Linux開發環境(四) 軟體安裝

安裝完Ubuntu系統後我們仍得再安裝一些常用的工具軟體,就如同安裝完Windows後我們也要安裝Office或其他工具軟體的道理一樣。在Ubuntu要安裝軟體雖然不像Windows平台只要滑鼠點兩下就好,但只要花點時間熟悉一下安裝步驟其實也不會困難到哪裡去。Linux世界裡有著包羅萬象的好用軟體,而且大多是免費的,學會這些安裝技巧往後遇到自己感興趣的軟體就能輕鬆抓下來自己安裝了。接下來我們就來介紹Ubuntu系統中常用的兩種軟體安裝方式:
  • 透過apt套件管理系統
  • 從source code安裝
不過在正式開始之前有個前置作業要先完成,我們檢查一下/bin/sh
$ ls -al /bin/sh可以看到Ubuntu 10.04 server預設的/bin/sh是個symbolic link到dash。

雖然在Linux系統上你可以選用任何喜歡的shell,但是bash仍為目前主流,甚至有些軟體的shell script是用bash特有語法寫的而無法相容於其他的shell,在安裝或使用上遇到這種不相容的shell script就會產生奇奇怪怪難以解釋的錯誤,為了以防萬一我們還是先把它改為bash吧!
$ sudo ln -svf /bin/bash /bin/sh 接著再檢查一次 $ ls -al /bin/sh 現在就link到bash了


apt套件管理系統

第一種安裝軟體的方式是透過apt (Advanced Package Tool),它是一種源自Debian的套件管理系統,功能強大而且操作簡單容易上手。主要提供的功能有:
  • 解決dependency問題:現在軟體功能愈來愈強大,更新速度愈來愈快,幾乎已經不可能自己獨立開發、從輪子開始造起了,而是必須依賴及使用其他人開發好的軟體。舉例來說Git這個版本控制軟體為了可以存取遠端資料庫必須透過Curl套件來完成網路連線,而Curl又使用了OpenSSL套件來完成SSL/TLS安全性認證、使用zlib套件來壓縮資料。在安裝Git的同時它的相依套件以及這些套件的相依套件…全都得一一安裝後Git才能正常運作。當軟體愈大可想像的套件相依問題就愈加讓人困擾,這就是所謂的「dependency hell」。套件管理系統最大的功能就是可以自動搜尋這些相依套件,並幫我們一併安裝。
  • 軟體的追蹤:安裝過的軟體會記錄在資料庫裡,包括安裝了哪些檔案,軟體的版本等記錄,一旦需要升級或移除軟體套件管理系統就會根據這些資料做最適當的處理。

Ubuntu server預設是沒安裝gcc (GNU Compiler Collection)的,gcc可以用來編譯我們寫的程式,算是程式開發最重要的工具軟體之一。下一階段我們介紹第二種安裝軟體的方法 -- 從source code安裝,也會用到gcc,所以現在就先用apt來安裝它吧
$ sudo apt-get install gcc g++ bison flex
只需要短短一行指令就能安裝四套軟體,夠簡單了吧。但仔細觀察log就能發現apt可是幫我們額外安裝及升級了很多軟體呢

P.S. 1 g++是GNU C++ compiler,其實它與gcc是源自於同一包source code。套件管理系統通常會把同一包source code產生出來的東西打包成不同套件,這種做法有比較高的彈性,我們可以只挑自己真正需要的部分來安裝就好。通常從source code會產生執行檔(binary)、函式庫(library)、標頭檔(header file)及文件,套件管理者會將它分開打包為XXX-core, XXX-utils, XXX-dev, XXX-doc,有些甚至還會依不同功能將執行檔拆成更多包套件。
P.S. 2 bison及flex也是軟體開發會用到的工具。

接著我們安裝Git,這是個超好用的版本控制系統,同樣一行簡單指令就搞定了
$ sudo apt-get install git-core

從source code安裝

第二種軟體安裝方式就是直接去抓source code下來自己compile,這有點像我們上程式語言課程寫HelloWorld程式,然後編譯成執行檔再去執行一樣。前面提到的套件管理系統功能既然那麼強大,為什麼要我們還要費功夫去抓source code下來自己compile呢?首先是軟體更新速度太快,而套件管理系統在建構套件有一定的程序,套件維護者也不可能不停的去追最新版軟體(除非發現重大bug),因此透過套件管理系統拿到的軟體通常不會是最新的,想安裝特定的新版軟體通常就只能透過source code了。再者我們有時候會有客製化軟體的需求,必須去修改source code或一些config,這可能也無法透過現成套件做到。以OpenSSL為例,為了因應最近爆出的POODLE attack我們可能想關閉SSLv3,或者是覺得MD5已經不夠安全而想停用它,這些需求不見得現成的套件能滿足我們,這時我們就必須去抓OpenSSL的source code,然後在configure時去下"no-ssl3 no-md5"去做客製化了。

要從source code安裝軟體需要兩個東西,首先是compiler及相關的工具軟體,這個我們已經透過apt裝好了,另外我們還需要從各軟體的官網去下載source code,這裡選了三套軟體來當範例:(當然我們也可以使用apt來安裝它們,只是apt的套件版本比較舊,有些功能不支援。)
GDB, The GNU Project Debugger
    gdb-7.8.tar.gz
    http://ftp.gnu.org/gnu/gdb/gdb-7.8.tar.gz
xz 資料壓縮軟體
    xz-5.0.5.tar.gz
    http://tukaani.org/xz/xz-5.0.5.tar.gz
gawk, GNU awk
    gawk-4.1.0.tar.xz
    http://ftp.gnu.org/gnu/gawk/gawk-4.1.0.tar.xz

請先下載好這些檔案,並透過Samba放在home directory底下
(不曉得如何設定Samba server請參考VirtualBox建立Linux開發環境(三) Samba server設定)
確認在Ubuntu底下也看得到它們

在安裝之前我們先建一個資料夾專門放經由source code產生的程式
$ sudo mkdir /usr/otherTools
$ sudo chown -v [user_id]:[user_id] /usr/otherTools
請把兩個[user_id]換成你的使用者帳號
接著檢查一下
$ ls -al /usr/otherTools 確認directory的owner已換成你的使用者帳號了

之所以要建一個額外的資料夾是有原因的。主要是因為套件管理系統與source code安裝的軟體不該混用,因為apt系統是根據本身所建的資料庫來判斷程式是否已安裝,它是無法查覺到從source code安裝的軟體。想像以下情節:我們抓了最新版xz的source code,並compile安裝到/usr/bin底下,接著透過apt系統準備安裝dpkg-dev套件,dpkg-dev套件是需要xz,於是apt系統去比對它的資料庫,發覺xz-utils尚未被安裝(因為source code安裝的程式不會加進apt的資料庫之中),於是它就自動幫我們把xz安裝在/usr/bin底下,我們從source code安裝的新版本就這樣不知不覺被覆蓋掉了。Linux的程式按慣例會放置在以下幾個地方:/bin, /usr/bin/, /usr/local/bin, /sbin/, /usr/sbin/, /usr/local/sbin/,使用apt套件管理系統也會遵循這樣的慣例,所以為了避免混用造成的問題我們還是建一個新的資料夾來放source code編出來的程式比較安全一點。

gdb

gdb的TextUI模式需要用到ncurses,Ubuntu預設只安裝ncurses library但卻沒安裝header files ,這是因為header files只有在compile階段會用到,程式執行時是不需要的(只要有library就可以了)。因為我們要自行compile所以得先取得header files,它是放在libncurses5-dev套件之中,所以先使用apt來安裝它
$ sudo apt-get install libncurses5-dev 接著我們在先前建的/usr/otherTools裡再建個subdirectory來安裝gdb
$ mkdir -v /usr/otherTools/gdb-7.8 並將gdb tarball解壓縮,然後進入source code目錄
$ tar zxf gdb-7.8.tar.gz
$ cd gdb-7.8/


$ ./configure --prefix=/usr/otherTools/gdb-7.8/configure指令會自動偵測我們要安裝的系統平台,也可以讓使用者做一些額外的設定,像是這裡的--prefix就是用來指定要安裝到哪個地方,以我們的例子來看就是把程式安裝到剛建的/usr/otherTools/gdb-7.8/底下(沒額外指定--prefix通常會預設會安裝在/usr/local/bin或是/usr/bin,這就會發生前面提到的與apt套件混用的問題)。這種configure設定方式也算是一種慣例,大多數Linux平台的軟體都會遵循這規則,不過偶爾也會遇到例外,最好養成好習慣在安裝前先閱讀一下README或INSTALL文件比較保險。接著
$ make 就開始compile程式了,這會花一點時間,等到完成後再
$ make install 程式就會安裝在/usr/otherTools/gdb-7.8/底下了,現在source code已經不再需要了,就順手砍掉吧。
$ cd ..
$ rm -rf gdb-7.8 gdb-7.8.tar.gz

檢查一下
$ ls -al /usr/otherTools/gdb-7.8/
裡面有幾個sub directory:
  • bin裡放的是執行檔,也就是我們的主程式"gdb"。
  • include裡放的是header files,先前有提過程式執行時不需要它們,這只有在compile source code才會用到。
  • lib裡放的是library,通常我們會把程式可共用的部份打包成一個library,以供bin底下的執行檔(可能不止一個)依不同需求來整合使用。除了本身套件的執行檔外,這些共用部份還能被其他套件的執行檔使用。
  • share裡放的是文件及設定檔。

因為我們不是安裝在傳統的路徑,所以還要額外做個設定:
首先要在環境變數PATH的設定,我們在shell底下輸入的command會依PATH指定的路徑搜尋,因為我們不是安裝在傳統的路徑裡,所以直接打"gdb"會找不到程式,必須輸入絕對路徑才行。

但每次都輸入絕對路徑實在太麻煩了,解決方法是修改~/.bashrc,把gdb安裝目錄加進PATH裡,這樣每次login就會自動生效了。所以打開~/.bashrc,在最底下加入這幾行
# path for gdb
OTHERPATH=/usr/otherTools/gdb-7.8/bin:$OTHERPATH

PATH=$OTHERPATH:$PATH
然後重新login再試試看

xz

仿照gdb的方式安裝xz,指令如下:
$ mkdir -v /usr/otherTools/xz-5.0.5
$ tar zxf xz-5.0.5.tar.gz
$ cd xz-5.0.5
$ ./configure --prefix=/usr/otherTools/xz-5.0.5
$ make
$ make install
接著在~/.bashrc裡加入
# path for xz
OTHERPATH=/usr/otherTools/xz-5.0.5/bin:$OTHERPATH
(要加在那行PATH=$OTHERPATH:$PATH的前面)

gawk

gawk也差不多:
$ mkdir -v /usr/otherTools/gawk-4.1.0
$ tar Jxf gawk-4.1.0.tar.xz
$ cd gawk-4.1.0/
$ ./configure --prefix=/usr/otherTools/gawk-4.1.0/
$ make
$ make install
修改.bashrc,加入
# path for gawk
OTHERPATH=/usr/otherTools/gawk-4.1.0/bin:$OTHERPATH
除了以上標準步驟外,還有個symbolic link要修改
$ sudo ln -svf /usr/otherTools/gawk-4.1.0/bin/gawk /usr/bin/awk
這個有點像是一開始把/usr/bin/sh從指向dash改為bash一樣。我們希望系統的awk會指向自己安裝的gawk


最後秀一下.bashrc新增的部份
以及我們這次安裝的程式

沒有留言:

張貼留言