安裝了 FreeBSD 後,您一定還會需要安裝其它非 FreeBSD 內附的軟件。在 FreeBSD 上安裝軟件有許多種方法,我們將一一為各位介紹。
本章包含了下列軟件安裝必備的課題:
* 各種安裝方式的優缺點。
* 如何使用 package。
* 如何使用 port。
* 如何使用傳統安裝方法自行編譯軟件。
10.1 概論
傳統上,要在一個 UNIX 系統上安裝其它軟件時,有幾個步驟:
* 下載該軟件,有可能是 binary 檔或是原始碼。
* 解壓縮該檔案,通常是以 tar 或 gzip 壓縮的。
* 讀一下該目錄中的說明文件,可能是 readme 或是 doc/ 的文件,來了解如何安裝該軟件。
* 如果所下載的是原始碼,可能要先編輯一下 Makefile 或是執行 configure,接著再編譯該軟件。
* 最後再測試與安裝。
當然,我們可以在 FreeBSD 上使用傳統的方式來安裝軟件,但是還有更簡單的選擇。FreeBSD提供了 package 和 ports 這二種簡單的安裝軟件方式。
所謂的 pakcage 是別人幫你將程序編譯成 binary 文件,並定義了該安裝在什麼地方。我們只要下載一個壓縮檔,並使用 pkg_add 這個指令就可以快速的將軟件安裝在 FreeBSD 上。這是安裝軟件最簡單的步驟,所安裝的東西也是最標准的,和自己依需求修改並編譯原始碼比較起來較缺乏彈性。
而 port 就是使用原始碼來安裝軟件。我們只要進入 /usr/ports/ 裡想要安裝的軟件目錄中,打指令 make install 就可以完成安裝了。FreeBSD 己經幫我們定義了安裝該軟件所須的步驟、所要求的其它套件。不管是 package 或是 ports,當安裝的軟件需要依靠其它軟件才能繼續安裝時,它們會自動幫你安裝該軟件。所有安裝好的軟件都將記錄在 /var/db/pkg 中,日後如果我們想要移除軟件時,可以用一個簡單的指令 pkg_delete 加上軟件名稱就可以了。
即然 port 這麼好用,為什麼 FreeBSD 要同時有 package 和 ports 呢?我們來比較一下 ports 和 package 的優點:
package 的優點:
* 一個己經編譯過的壓縮檔通常比包含原始碼的檔案還要小。
* 使用 pakcage 並不需要再做任何的編譯動作,如果你的計算機速度很慢,在安裝像 KDE、GNOME 等大型軟件時,不用編譯可以省下很多時間。
* 使用 package 來安裝軟件時,你不必事先了解在 FreeBSD 上編譯時所使用的軟件及其過程。
ports 的優點:
* package 為了要在多數的計算機執行,考慮兼容性問題,通常編譯的比較保守。而使用 ports 你可以依自己的系統修改,例如選擇使用 Pentium III 或是 Athlon 的處理器。
* 在編譯 package 時,就已經限制了該軟件的功能,無法再依自己需求擴充。例如 Apache 這套軟件就有許多的功能可以在編譯時掛進來,使用 ports 來安裝時,你可以依自己的需求來加以修改。
* 我們可以經由更新 Port Tree 來使用較新的軟件,而 package 通常只和系統一起 release。
* 有些軟件不允許使用 binary 文件的方式散播,只能下載原始碼。
* 有了原始碼,你可以自己修改並加以應用。
* 有的人喜歡擁有原始碼,他們可以讀它、從中學習。
接著我們就針對 package 及 ports 來說明它們的使用方式。
10.2 使用 package
10.2.1 安裝 Package
安裝package 有二種方式,第一種是使用 sysinstall (也就是我們安裝 FreeBSD 時所看到的畫面) 來安裝,另一種是使用手動安裝。使用 sysinstall 安裝時,我們必需選擇安裝的來源,最常使用的來源是網絡及光盤片。但是由於光盤片容量有限,所以在 FreeBSD 安裝光盤中所含的 package 軟件數量並不多,因此我通常都選擇使用網絡安裝。而使用手動安裝必須自行抓回所需的檔案,並以指令安裝。以下我們就分別針對這二種方式來說明:
方式一:使用 sysinstall
假設我們要安裝在 FreeBSD 上收信的軟件 pine,首先我們要執行 sysinstall 以進入安裝時的畫面:
# sysinstall
圖 10-1
接著選取 Configure選項,進入圖 10-2 的畫面:
圖 10-2
我們選 Packages 選項來安裝 package:
圖 10-3
在圖 10-3 中,我們必須選擇安裝來源,在這裡我們選擇 FTP ,從 FTP 中我們可以找到較多的軟件。選擇了 FTP 之後,將出現圖 10-4 的畫面,讓我們選擇要使用哪一個 FTP 站台:
圖 10-4
我們選擇「URL」來自訂要使用的 FTP 站台。接著便會出現一個要求我們輸入站台地址的窗口,如圖 10-5 所示,假設我們要使用交大資工的站台,則輸入 freebsd.csie.nctu.edu.tw/pub/releases/i386/:
圖 10-5
輸入站台後,會問您是否要使用目前的網絡設定。如果我們己經連上網絡,則選 YES,否則請選 NO 來設定網絡。接著會出現一個軟件分類選單,這一份分類選單將各個軟件分門別類放在不同的選項下,其中 All 是所有軟件的所在,如圖 10-6。
圖 10-6
我們以安裝郵件軟件 pine 為例,由於 pine 位於 mail 分類下,所以我們選擇mail。如果您要安裝中文版本的 pine ,應該選擇 Chinese 選項而非 mail。選擇了 mail 之後,將出現 mail 分類下的所有軟件,我們選 pine-4.58 這一項,如圖 10-7:
圖 10-7
選了pine 之後,就可以選 OK 回到前一個分類畫面,接著按照這種方式選了其它我們要安裝的軟件之後,就可以選「Install」來安裝了。選了 Install 之後,將出現所有我們已選取的軟件列表,如圖 10-8,如果要繼續安裝則選 OK 即可。
圖 10-8
方式二:使用手動安裝
如果以手動的方式安裝,我們必須先取回所要安裝的package。只要是 package ,它的擴展名就是 .tgz。我們可以用 pkg_add 這個指令來安裝它。下面是一個簡單的范例,使用 package 來安裝 lsof-4.66.1.tgz:
# ftp -a freebsd.csie.nctu.edu.tw
Connected to freebsd.csie.nctu.edu.tw.
220---------- Welcome to Pure-FTPd ----------
220-You are user number 139 of 200 allowed.
220-Local time is now 17:49. Server port: 21.
220-Only anonymous FTP is allowed here
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
331 Any password will work
230 Any password will work
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /pub/FreeBSD/ports/packages/sysutils/
250 CWD command successful.
ftp> get lsof-4.71.tgz
local: lsof-4.71.tgz remote: lsof-4.71.tgz
227 Entering Passive Mode (140,113,17,209,189,16)
150-Accepted data connection
150 96.1 kbytes to download
100% |*********************************************************| 98372 136.87 KB/s 00:00 ETA
226-File successfully transferred
226 0.362 seconds (measured here), 265.35 Kbytes per second
98372 bytes received in 00:00 (136.70 KB/s)
ftp> bye
221-Goodbye. You uploaded 0 and downloaded 97 kbytes.
221 Logout.
# pkg_add lsof-4.71.tgz
要使用 package 安裝軟件,首先必須取得想要安裝的軟件。我們可以先 ftp 到各大學 FTP 站台去取得。packaeg 的副檔案是 .tgz,可以在各 FTP 站台的 ports/packages 中取得。以交大資工的 FTP 站而言是放在 ftp://freebsd.csie.nctu.edu.tw/pub/ports/packages ;而中央資工的 FTP 是放在 ftp://freebsd.csie.ncu.edu.tw/FreeBSD/ports/packages 。當進入 ports 的目錄後,我們會發現還有一堆目錄,您可以依您的系統版本選擇要使用哪一個目錄,其中 packages 這個目錄包含了最新的 packages。如果您想要使用 packages-5.4-release 的 packages,我們就可以選擇進入 packages-5.4-release 這個目錄。進入這個目錄後,又有一堆目錄,這裡的目錄結構和你系統中 /usr/ports/ 下的目錄一樣,每個目錄都是軟件的分類,而 All 這個目錄是所有軟件。
如果您只知道想要安裝的軟件名稱,卻不知道版本及完整的檔名,例如您要下載 popa3d 這個軟件,但不知道是哪一版的,你可以先進入 All 的目錄下,再以下列方式查詢:
ftp> ls popa3d*
227 Entering Passive Mode (140,113,209,200,159,54)
150 Opening ASCII mode data connection for /bin/ls.
-r--r--r-- 1 FTP CSIE 19007 Nov 11 12:43 popa3d-0.6.4.1.tgz
226 Transfer complete.
ftp> get popa3d-0.6.4.1.tgz
找到了想要下載的版本是 0.6.4.1,接著就以 get 指令去取回該軟件,最後下 exit 離開。
接著你就可以使用 pkg_add popa3d-0.6.4.1.tgz 來安裝該軟件。
10.2.2 管理 Package
如果我們後悔了,想要移除之前安裝過的軟件,可以下指令 pkg_delete popa3d-0.6.4.1 來移除 popa3d-0.6.4.1 這套軟件,所有我們安裝過的軟件都會記錄在 /var/db/pkg 的目錄中。
我們可以使用 pkg_info 這個指令來得到軟件的信息。例如在我們下載完一個 package 後,你想要知道這個軟件的信息,以 popa3d-0.6.4.1.tgz 而言,如果我們想知道它的信息,你使用下列指令來取得:
# pkg_info popa3d-0.6.4.1.tgz
您也可以只打 pkg_info 來得知所有你安裝過的軟件有哪些。
10.3 使用 ports
如果你要使用 ports 安裝軟件,你必須先確認 /usr/ports 這個目錄是否有安裝。如果沒有的話,使用 /stand/sysinstall 來安裝 ports 的目錄:
1. 以 root 執行 /stand/sysinstall
2. 選擇 Configure 後按 Enter
3. 選擇 Distributions 後按 Enter
4. 選擇 ports 後按空格鍵
5. 選擇 Exit 後按 Enter
6. 選擇你要從 CDROM 或 FTP 安裝等
7. 跟著選單照做,最後離開 sysinstall
或者我們也可以到 http://www.freebsd.org/ports/ 去手動抓回 port.tar.gz 這個檔案,將它放在 /usr/ 下。並以下列指令來安裝:
# cd /usr
# tar zxvf port.tar.gz
現在可以進入 /usr/ports 的目錄中,安裝軟件了。
通常每一個軟件都有一個獨立的目錄,而目錄中都存在著一些檔案,每個檔案都有其特定用途,我們簡列如下:
Makefile 安裝軟件的編譯設定,您可以修改這個檔案來設定我們在編譯及安裝軟件時的參數。
README.html 我們可以經由浏覽 README.html 來查看所有 ports 目錄下的軟件說明。
distinfo 說明安裝所需要的檔案及其 MD5 的檢查數據。
pkg-comment 簡單的軟件描述。
pkg-descr 較詳細的描述,我們通常可以在裡面找到該軟件網頁的位置,使我們能到該網頁得到更多信息。
pkg-plist 列出軟件將安裝的清單,安裝後會放在硬盤中的什麼地方。
如果您想安裝某一個軟件,卻不知道它的目錄位置,您可以使用 whereis 這個指令來找出它來。例如我們想安裝 qpopper ,可以使用 whereis qpopper 來找出它所在的目錄。 或者果我們只知道某個程序的關鍵詞,確不知道它放在哪個目錄,我們可以使用下列指令:
# cd /usr/ports
# make search key='關鍵詞'
進入該目錄後,最簡單的安裝方式是直接打 make install,系統就會自動去網絡上抓取需要的軟件回來安裝。安裝 ports 時,make 時找檔案的順序是:先去 /usr/ports/distfiles 、再去找 /cdrom/ports/distfiles、最後是網絡中下載。如果您不使用網絡安裝的話,您可以自己去抓回軟件,並將它放在 /usr/ports/distfiles/ 下,這樣子在我們打 make install 時,就不會去網絡上抓取檔案。如果您所需檔案存在光盤中,在安裝軟件之前,必須先將光驅 mount 在 /cdrom 中。。但有的軟件並不會到光盤中去尋找檔案,所以建議您還是將光盤中 /ports/distfiles 目錄內容復制到 /usr/ports/distfiles 目錄中,或者先連上網絡吧。
當使用網絡取得檔案時,預設抓取檔案的服務器通常在國外,因此,您可以修改 /etc/make.conf 來指定使用國內的 FTP 站台,例如編輯 /etc/make.conf 並加入:
MASTER_SITE_BACKUP?= \
ftp://freebsd.csie.ncu.edu.tw/distfiles/${DIST_SUBDIR}/ \
ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}
當安裝完 ports 後,我們可以再下指令 make clean 來清除編譯過程產生的檔案,建議最好這麼做,否則有的過程中產生大量檔案可是很驚人的。如果您安裝了一堆軟件之後,才想到之前沒有 make clean,沒關系,在安裝 ports 時,編譯過程的檔案都存在於該軟件目錄下的 work 目錄中。我們可以使用下列指令來找出所有未 make clean 的軟件,並將暫存數據刪除:
# find /usr/ports -depth -name work -exec rm -rf {} \;
如果您使用網絡安裝,它會將所下載的原始碼存在 /usr/ports/distfiles 中,當你下 make clean 後,並不會將它們清除。
當你安裝完後,想要移除該軟件時,只要在該軟件的 ports 目錄中打 make deinstall 即可。請注意,不要在 /usr/ports 的目錄中打 make deinstall,這樣可是會將 "所有" 軟件都移除喔。
還有一些較不常用的 make 方式,簡述如下:
make fetch:抓回所需的原始檔。
make fetch-list:顯示安裝所需的檔案。
make checksum:抓回原始檔並以 MD5 檢查其正確性。
make extract:抓回並解開原始檔。
make configure:進行組態,但不繼續編譯。
make all install:抓回原始檔、編譯且安裝。
make reinstall:若先前發生意外中斷,以此命令繼續嘗試安裝。
make package:將做好的 ports 打包制作成 packages。
如果安裝完新的軟件之後,如果使用的 Shell 是 Csh 或 Tcsh,我們可能必須執行指令 rehash 來重建 hash table,之後才能在所設定的指令路徑中找到剛安裝的程序,不然的話就必須輸入該程序的完整路徑或重新登入才能使用。
我們可以在 /var/db/pkg 的目錄中看到我們已安裝的軟件,每一個軟件有一個目錄,目錄中存放著軟件安裝的信息,包含了軟件說明、安裝到哪些目錄中。有的軟件要安裝前,會要求先安裝某一套軟件,如果你事先沒有安裝它所要求的軟件,通常該軟件會自動幫你安裝。所以我們會在 /var/db/pkg 下看到一些不是我們主動安裝的軟件。既然軟件之間可能會相互依賴,我們要如何得知這些軟件彼此間的關系呢?pkg_tree 這套軟件可以讓我們檢視軟件間的關系。我們可以使用 port 來安裝這套軟件:
# cd /usr/ports/sysutils/pkg_tree
# make install clean
之後我們就可以使用 pkg_tree | more 來看各個軟件之間的關系了 (別忘了要 rehash 喔)。
10.4 更新 port tree
當 FreeBSD release 時,會事先測試過 ports 目錄中的所有軟件是否能正常安裝。因為不同軟件之間時常是相互依賴的,有的時候我們要安裝 A 軟件,系統會自動抓取所需要的其它軟件。這些軟件對於彼此的版本可能會有相互依賴,所以在 release 之前,ports 會暫停更新各個軟件的版本,以確保 release 的版本能正常運作。
但在 release 之後,ports 目錄中的軟件版本可能已有更新,有的軟件版本更新可能只是增加新的功能,而有的更新更涉及系統安全。如果您想使用 ports 安裝軟件最新的版本,在安裝軟件之前,我們可以先使用一些工具來更新整個 port tree。
有時候更新了 port tree 之後,因為版本相依問題,有些軟件可能會因此而無法順利安裝,您只要在過幾天後重新做一次 port tree 的更新應該就可以解決了。
更新 port tree 的方法很簡單,我們可以使用 CVSup 來保持 ports 在最新狀態。CVSup 是一套用來維持軟件原始碼和開發團隊同步的工具,在我們執行了 CVSup 之後,它會經由網絡向所設定的軟件服務器檢查並更新原始碼的版本。我們可以使用 CVSup 來更新 port tree,也可以用來更新 /usr/src 目錄下的 FreeBSD 原始碼。
首先,我們必須安裝 CVSup,因為我們不使用圖形接口,所以安裝 cvsup-without-gui:
# cd /usr/ports/net/cvsup-without-gui
# make install clean
在系統中有一份以 CVSup 更新 port tree 的設定文件范例,您可以直接加以修改或著先復制一份後再修改。我們將該設定文件范例復制到 /root 之後再加以修改:
# cp /usr/share/examples/cvsup/ports-supfile /root/
接著請以文書編輯軟件打開 /root/ports-supfile 後,找到 host 的部份來設定所要使用的 CVSup 服務器。
# Defaults that apply to all the collections
#
# IMPORTANT: Change the next line to use one of the CVSup mirror sites
# listed at http://www.freebsd.org/doc/handbook/mirrors.html.
*default host=cvsup.tw.freebsd.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
# If your network link is a T1 or faster, comment out the following line.
*default compress
## Ports Collection.
#
# The easiest way to get the ports tree is to use the "ports-all"
# mega-collection. It includes all of the individual "ports-*"
# collections,
ports-all
# These are the individual collections that make up "ports-all". If you
# use these, be sure to comment out "ports-all" above.
#
# Be sure to ALWAYS cvsup the ports-base collection if you use any of the
# other individual collections below. ports-base is a mandatory collection
# for the ports collection, and your ports may not build correctly if it
# is not kept up to date.
#ports-base
#ports-archivers
#ports-astro
#ports-audio
#ports-benchmarks
………略…………
上面的范例中,我們將 CVSup 服務器設為 cvsup.tw.freebsd.org,這一台服務器是由交大資工所維護,您可以依您所在位置使用其它 cvsup1 ~ cvsup13.tw.freebsd.org 的服務器。例如 cvsup3 位於中山大學,cvsup13 是 giga 和信超媒體的服務器。最後一行的 ports-all 表示我們要更新 /usr/ports 目錄下的所有檔案。您也可以只更新其中的部份目錄,只要將 ports-all 以井字號 "#" 標示起來,並將檔案中 ports-base 那一行的 # 移除,接著您就可以依您所要更新的目錄來要移除其它的 # 字號。例如,我們只要更新 /usr/ports/www 這個目錄,將 ports-all 以 # 標示起來之後,我們還要移除 ports-base 及 ports-www 開頭的 #。
設定完畢之後,我們就可以開始進行 ports 的更新了。
# cvsup -g -L 2 /root/ports-supfile
上述指令中,參數 g 表示不使用圖形接口,而參數 L 及其後所跟隨的數字 2 表示我們要看到更新過程的記錄的詳細程度,數字可以從 0 ~ 2,最後的檔名表示所要使用的設定檔。
在使用 ports 安裝軟件之前,先執行 CVSup 是一個不錯的習慣,您可以隨時取得軟件的最新版本,不過您的機器一定要連上因特網才能進行更新。
10.5 使用 portupgrade 更新軟件
在使用 Port 安裝了一堆軟件後,如果軟件有新的版本出來怎麼辦?FreeBSD 的 ports 管理工具中有一個好用的軟件 - portupgrade。
通常 ports 中的軟件都有相依性,例如安裝 Apache 會自動安裝 libexpat、安裝防垃圾信軟件會自動安裝一堆 Perl 模塊。而在更新軟件時,我們必須要確定更新過後,相依的軟件都一並更新,才不會造成更新後有東西不能運作的情形。不過這並不表示我們一定要常常更新軟件,建議您只有在必要時才使用 portupgrade 來更軟件,不要有事沒事就跑一次。因為軟件並不是最新的就最好,沒有人能保證更新的軟件是否還維持您原本期望的行為。
portupgrade 在更新軟件時,會保留您原本的設定檔。例如,在更新 Apache 時,它會保留 httpd.conf 的設定。使用 portupgrade 是更新 ports 軟件比較安全的方式。
在您使用 cvsup 更新 port tree 後,我們可以使用下列指令查看目前安裝的軟件版本是否和 port tree 中的版本一樣:
# pkg_version -v
ispell-3.2.06_12 = up-to-date with port
jasper-1.701.0 = up-to-date with port
jpeg-6b_3 = up-to-date with port
kde-3.3.0 < needs updating (port has 3.3.1)
kdeaccessibility-3.3.0 < needs updating (port has 3.3.1)
... 略 ...
上列輸出中需要更新的軟件會有「< needs updating」的字樣。您可以選擇想要更新的軟件,再使用 portupgrade 來更新。首先,我們必須使用 ports 來安裝 portupgrade:
# cd /usr/ports/sysutils/portupgrade
# make install clean
如果您只想要升級某一個軟件本身,而非所有相依的軟件,只要使用 portupgrade pkgname 即可。如果您要升級所有和該軟件相依的其它軟件,則可以加上參數 -r。如果您要更新包含相依軟件的相依軟件,則可以使用參數 -R。另外,您可以使用參數 -m 來要求編譯 (make) ports 時多傳入一些參數,還可以使用參數 -f 要求就算版本一樣也強制更新。
假設我們要更新的軟件是 perl-5.8,我們可以使用下列指令來更新:
# portupgrade -rf "perl-5.8.*" -m "ENABLE_SUIDPERL=yes"