在我們知道了原始碼的相關資訊之後,再來要瞭解的自然就是如何使用具有原始碼的Tarball 來建立一個屬於自己的軟體囉!從前面幾個小節的說明當中,我們曉得其實Tarball 的安裝是可以跨平台的,因為 C 語言的程式碼在各個平台上面是可以共通的,只是需要的編譯器可能並不相同而已。例如Linux 上面用 gcc 而 Windows 上面也有相關的 C 編譯器啊~所以呢,同樣的一組原始碼,既可以在CentOS Linux 上面編譯,也可以在 SuSE Linux 上面編譯,當然,也可以在大部分的 Unix 平台上面編譯成功的!
如果萬一沒有編譯成功怎麼辦?很簡單啊,透過修改小部分的程式碼 (通常是因為很小部分的異動而已) 就可以進行跨平台的移植了!也就是說,剛剛我們在 Linux 底下寫的程式『理論上,是可以在Windows 上面編譯的!』這就是原始碼的好處啦!所以說,如果朋友們想要學習程式語言的話,鳥哥個人是比較建議學習『具有跨平台能力的程式語言』,例如C 就是很不錯的一個!
唉啊!又扯遠了~趕緊拉回來繼續說明我們的 Tarball 啦!
從原始碼的說明我們曉得要製作一個 binary program 需要很多咚咚的呢!這包括底下這些基礎的軟體:
雖然 Tarball 的安裝上面相當的簡單,如同我們前面幾個小節的例子,只要順著開發商提供的README 與 INSTALL 檔案所載明的步驟來進行,安裝是很容易的。但是我們卻還是常常會在BBS 或者是新聞群組當中發現這些留言:『我在執行某個程式的偵測檔案時,他都會告訴我沒有gcc 這個軟體,這是怎麼回事?』還有:『我沒有辦法使用 make 耶!這是什麼問題?』呵呵!這就是沒有安裝上面提到的那些基礎軟體啦!
咦!為什麼使用者不安裝這些軟體啊?這是因為目前的 Linux distribution大多已經偏向於桌上型電腦的使用 (非伺服器端),他們希望使用者能夠按照廠商自己的希望來安裝相關的軟體即可,所以通常『預設』是沒有安裝 gcc 或者是 make 等軟體的。所以啦,如果你希望未來可以自行安裝一些以Tarball 方式釋出的軟體時,記得請自行挑選想要安裝的軟體名稱喔!例如在CentOS 或者是 Red Hat 當中記得選擇 Development Tools以及 Kernel Source Development 等相關字眼的軟體群集呢。
那萬一我已經安裝好一部 Linux 主機,但是使用的是預設值所安裝的軟體,所以沒有make, gcc 等咚咚,該如何是好?呵呵!問題其實不大啦,目前使用最廣泛的 CentOS/Fedora或者是 Red Hat 大多是以 RPM (下一章會介紹) 來安裝軟體的,所以,你只要拿出當初安裝Linux 時的原版光碟,然後以下一章介紹的 RPM 來一個一個的加入到你的 Linux 主機裡面就好啦!很簡單的啦!尤其現在又有 yum 這玩意兒,更方便吶!
在 CentOS 當中,如果你已經有網路可以連上 Internet 的話,那麼就可以使用下一章會談到的 yum 囉!透過 yum 的軟體群組安裝功能,你可以這樣做:
大概就是這樣,更多的資訊請參考下一章的介紹喔。
Tarball 安裝的基本步驟
我們提過以 Tarball 方式釋出的軟體是需要重新編譯可執行的binary program 的。而 Tarball 是以 tar 這個指令來打包與壓縮的檔案,所以啦,當然就需要先將Tarball 解壓縮,然後到原始碼所在的目錄下進行 makefile 的建立,再以 make來進行編譯與安裝的動作啊!所以整個安裝的基礎動作大多是這樣的:
注意到上面的第二個步驟,通常在每個軟體在釋出的時候,都會附上 INSTALL 或者是 README 這種檔名的說明檔,這些說明檔請『確實詳細的』閱讀過一遍,通常這些檔案會記錄這個軟體的安裝要求、軟體的工作項目、與軟體的安裝參數設定及技巧等,只要仔細的讀完這些檔案,基本上,要安裝好tarball 的檔案,都不會有什麼大問題囉。
至於 makefile 在製作出來之後,裡頭會有相當多的標的 (target),最常見的就是 install 與 clean 囉!通常『make clean』代表著將目標檔 (object file) 清除掉,『make』則是將原始碼進行編譯而已。注意喔!編譯完成的可執行檔與相關的設定檔還在原始碼所在的目錄當中喔!因此,最後要進行『makeinstall』來將編譯完成的所有咚咚都給他安裝到正確的路徑去,這樣就可以使用該軟體啦!
OK!我們底下約略提一下大部分的 tarball 軟體之安裝的指令下達方式:
請注意,上面的步驟是一步一步來進行的,而其中只要一個步驟無法成功,那麼後續的步驟就完全沒有辦法進行的!因此,要確定每一的步驟都是成功的才可以!舉個例子來說,萬一今天你在 ./configure 就不成功了,那麼就表示 Makefile無法被建立起來,要知道,後面的步驟都是根據 Makefile 來進行的,既然無法建立 Makefile,後續的步驟當然無法成功囉!
另外,如果在 make 無法成功的話,那就表示原始檔案無法被編譯成可執行檔,那麼 make install主要是將編譯完成的檔案給他放置到檔案系統中的,既然都沒有可用的執行檔了,怎麼進行安裝?所以囉,要每一個步驟都正確無誤才能往下繼續做!此外,如果安裝成功,並且是安裝在獨立的一個目錄中,例如 /usr/local/packages 這個目錄中好了,那麼你就必需手動的將這個軟體的man page 給他寫入 /etc/man.config 裡面去。
一般Tarball 軟體安裝的建議事項 (如何移除?升級?)
或許你已經發現了也說不定,那就是為什麼前一個小節裡面,Tarball 要在 /usr/local/src 裡面解壓縮呢?基本上,在預設的情況下,原本的Linux distribution 釋出安裝的軟體大多是在 /usr 裡面的,而使用者自行安裝的軟體則建議放置在/usr/local 裡面。這是考量到管理使用者所安裝軟體的便利性。
怎麼說呢?我們曉得幾乎每個軟體都會提供線上說明的服務,那就是info 與 man 的功能。在預設的情況下, man 會去搜尋 /usr/local/man 裡面的說明文件,因此,如果我們將軟體安裝在 /usr/local 底下的話,那麼自然安裝完成之後,該軟體的說明文件就可以被找到了。此外,如果你所管理的主機其實是由多人共同管理的,或者是如同學校裡面,一部主機是由學生管理的,但是學生總會畢業吧?所以需要進行交接,如果大家都將軟體安裝在/usr/local 底下,那麼管理上不就顯的特別的容易嗎!
所以囉,通常我們會建議大家將自己安裝的軟體放置在 /usr/local 下,至於原始碼(Tarball)則建議放置在 /usr/local/src (src 為 source 的縮寫)底下啊。
再來,讓我們先來看一看 Linux distribution 預設的安裝軟體的路徑會用到哪些?我們以apache 這個軟體來說明的話 (apache 是 WWW 伺服器軟體,詳細的資料請參考伺服器架設篇。你的系統不見得有裝這個軟體):
我們會發現軟體的內容大致上是擺在 etc, lib, bin, man等目錄當中,分別代表『設定檔、函式庫、執行檔、線上說明檔』。好了,那麼你是以 tarball 來安裝時呢?如果是放在預設的 /usr/local 裡面,由於 /usr/local 原本就預設這幾個目錄了,所以你的資料就會被放在:
但是如果你每個軟體都選擇在這個預設的路徑下安裝的話,那麼所有的軟體的檔案都將放置在這四個目錄當中,因此,如果你都安裝在這個目錄下的話,那麼未來再想要升級或移除的時候,就會比較難以追查檔案的來源囉!而如果你在安裝的時候選擇的是單獨的目錄,例如我將apache 安裝在 /usr/local/apache 當中,那麼你的檔案目錄就會變成:
呵呵!單一軟體的檔案都在同一個目錄之下,那麼要移除該軟體就簡單的多了!只要將該目錄移除即可視為該軟體已經被移除囉!以上面為例,我想要移除apache 只要下達『rm -rf /usr/local/apache』就算移除這個軟體啦!當然囉,實際安裝的時候還是得視該軟體的Makefile 裡頭的 install 資訊才能知道到底他的安裝情況為何的。因為例如 sendmail的安裝就很麻煩......
這個方式雖然有利於軟體的移除,但不曉得你有沒有發現,我們在執行某些指令的時候,與該指令是否在PATH 這個環境變數所記錄的路徑有關,以上面為例,我的 /usr/local/apache/bin肯定是不在 PATH 裡面的,所以執行 apache 的指令就得要利用絕對路徑了,否則就得將這個/usr/local/apache/bin 加入 PATH 裡面。另外,那個 /usr/local/apache/man也需要加入 man page 搜尋的路徑當中啊!
除此之外, Tarball 在升級的時候也是挺困擾的,怎麼說呢?我們還是以 apache來說明好了。WWW 伺服器為了考慮互動性,所以通常會將 PHP+MySQL+Apache 一起安裝起來 (詳細的資訊請參考伺服器架設篇),果真如此的話,那麼每個軟體在安裝的時候『都有一定的順序與程序!』因為他們三者之間具有相關性,所以安裝時必需要三者同時考慮到他們的函式庫與相關的編譯參數。
假設今天我只要升級 PHP 呢?有的時候因為只有涉及動態函式庫的升級,那麼我只要升級 PHP 即可!其他的部分或許影響不大。但是如果今天 PHP 需要重新編譯的模組比較多,那麼可能會連帶的,連 Apache 這個程式也需要重新編譯過才行!真是有點給他頭痛的!沒辦法啦!使用tarball 確實有他的優點啦,但是在這方面,確實也有他一定的傷腦筋程度。
由於 Tarball 在升級與安裝上面具有這些特色,亦即 Tarball 在反安裝上面具有比較高的難度 (如果你沒有好好規劃的話~),所以,為了方便 Tarball 的管理,通常鳥哥會這樣建議使用者:
MANPATH /usr/local/software/man這樣才可以使用 man 來查詢該軟體的線上文件囉!
一個簡單的範例、利用ntp 來示範
讀萬卷書不如行萬里路啊!所以當然我們就來給他測試看看,看你是否真的瞭解了如何利用Tarball 來安裝軟體呢?我們利用時間伺服器 (network time protocol) ntp 這個軟體來測試安裝看看。先請到http://www.ntp.org/downloads.html這個目錄去下載檔案,請下載最新版本的檔案即可。或者直接到鳥哥的網站下載 2009/05 公告釋出的穩定版本:
http://linux.vbird.org/linux_basic/0520source/ntp-4.2.4p7.tar.gz
假設我對這個軟體的要求是這樣的:
那麼你可以依照底下的步驟來安裝測試看看 (如果可以的話,請你不要參考底下的文件資料,先自行安裝過一遍這個軟體,然後再來對照一下鳥哥的步驟喔!)。
[root@www ~]# cd /usr/local/src <==切換目錄 [root@www src]# tar -zxvf /root/ntp-4.2.4p7.tar.gz <==解壓縮到此目錄 ntp-4.2.4p7/ <==會建立這個目錄喔! ntp-4.2.4p7/libopts/ ....(底下省略).... [root@www src]# cd ntp-4.2.4p7/ [root@www ntp-4.2.4p7]# vi INSTALL <==記得 README 也要看一下! # 特別看一下 28 行到 54 行之間的安裝簡介!可以瞭解如何安裝的流程喔! |
[root@www ntp*]# ./configure --help | more <==查詢可用的參數有哪些 --prefix=PREFIX install architecture-independent files in PREFIX --enable-all-clocks + include all suitable non-PARSE clocks: --enable-parse-clocks - include all suitable PARSE clocks: # 上面列出的是比較重要的,或者是你可能需要的參數功能! [root@www ntp*]# ./configure --prefix=/usr/local/ntp \ > --enable-all-clocks --enable-parse-clocks <==開始建立makefile checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes ....(中間省略).... checking for gcc... gcc <==也有找到 gcc 編譯器了! ....(中間省略).... config.status: creating Makefile <==現在知道這個重要性了吧? config.status: creating config.h config.status: executing depfiles commands |
一般來說 configure 設定參數較重要的就是那個 --prefix=/path 了,--prefix 後面接的路徑就是『這個軟體未來要安裝到那個目錄去?』如果你沒有指定 --prefix=/path 這個參數,通常預設參數就是 /usr/local 至於其他的參數意義就得要參考 ./configure --help 了!這個動作完成之後會產生 makefile 或 Makefile 這個檔案。當然啦,這個偵測檢查的過程會顯示在螢幕上,特別留意關於 gcc 的檢查,還有最重要的是最後需要成功的建立起 Makefile 才行!
[root@www ntp*]# make clean; make [root@www ntp*]# make check [root@www ntp*]# make install # 將資料給他安裝在 /usr/local/ntp 底下 |
整個動作就這麼簡單,你完成了嗎?完成之後到 /usr/local/ntp 你發現了什麼?