diff --git a/zh_TW.Big5/books/handbook/ports/chapter.sgml b/zh_TW.Big5/books/handbook/ports/chapter.sgml index ec86c7b788..51752f19a2 100644 --- a/zh_TW.Big5/books/handbook/ports/chapter.sgml +++ b/zh_TW.Big5/books/handbook/ports/chapter.sgml @@ -1,1337 +1,1339 @@ 軟體套件管理篇:Packages 及 Ports 機制 概述 ports packages 儘管 FreeBSD 在 base system 已加了很多系統工具。 然而,在實務運用上,您可能仍需要安裝額外的軟體。 FreeBSD 提供了 2 種安裝應用程式的套件管理系統︰Ports Collection (以 soucre 來編譯、安裝) 和 package(預先編譯好的 binary 檔)。 上述的方式,無論要用哪一種,都可以由像是 CDROM 等或網路上來安裝想裝的最新版軟體。 讀完這章,您將了解: 如何以 packages 來安裝軟體。 如何以 ports 來安裝軟體。 已安裝的 packages 或 ports 要如何移除。 如何更改(override) ports collection 所使用的預設值。 如何在套件管理系統中,找出想裝的軟體。 如何升級已安裝的軟體。 安裝軟體的各種方式介紹 通常要在 &unix; 系統上安裝軟體時,有幾個步驟要作: 先下載該軟體壓縮檔(tarball),有可能是原始碼或是 binary 執行檔。 解開該壓縮檔。(通常是以 &man.compress.1; , &man.gzip.1; 或 &man.bzip2.1; 壓縮的) 閱讀相關文件檔,以了解如何安裝。(通常檔名是 INSTALLREADME ,或在 doc/ 目錄下的一些文件) 如果所下載的是原始碼,可能要先修改 Makefile 或是執行 ./configure 之類的 script ,接著再編譯該軟體。 最後測試再測試與安裝。 如果一切順利的話,就這麼簡單。 如果在安裝非專門設計(移植)給 FreeBSD 的軟體時出問題, 那可能需要修改一下它的程式碼,才能正常使用。 當然,我們可以在 FreeBSD 上使用上述的傳統方式來安裝軟體, 但是,我們還有更簡單的選擇。 FreeBSD 提供了兩種省事的軟體管理機制: packages 和 ports。 就在寫這篇文章的時候, 已經有超過 &os.numports; 個 port 軟體可以使用。 所謂的 FreeBSD package 就是別人把該應用程式編譯、打包完畢。 該 package 會包括該應用程式的所有執行檔、設定檔、文件等。 而下載到硬碟上的 package 都可透過 FreeBSD 套件管理指令來進行管理,比如: &man.pkg.add.1;、&man.pkg.delete.1;、&man.pkg.info.1; 等指令。 所以,只需簡單打個指令就可輕鬆安裝新的應用程式了。 而 FreeBSD port 則是用一些檔案,來自動處理應用程式的安裝流程。 請記住:如果打算自己來編譯的話,需要執行很多操作步驟 (下載、解壓、patch、編譯、安裝)。 而 port 呢,則是涵蓋所有需要完成這些工作的必備步驟, 所以只需打一些簡單的指令,那些原始程式碼就會自動下載、解壓、 patch、編譯,直至安裝完畢。 事實上,ports 機制還可以用來產生 packages,以便他人可以用 pkg_add 來安裝, 或是稍後會介紹到的其他套件管理指令。 而 packages 以及 ports 它們都是一樣會認 dependencies(軟體相依關係)。 假設:您想安裝某程式,但它有相依另一個已裝的函式庫(library), 而在 FreeBSD 的 port 以及 package 都有這程式以及該函式庫了。 所以無論是用 pkg_add 指令或者 port 方式來裝該程式, 這兩者(package、port)都會先檢查有沒有裝該函式庫, 若沒有就會自動先裝該函式庫了。 這兩種技術都很相似,您可能會好奇為什麼 FreeBSD 會弄出這兩種技術來呢。 其實,packages 和 ports 都有它們各自的長處, 使用哪一種完全取決於您自己的喜好。 Package 好處在於: 同樣是壓縮過的 package 與原始碼 tarball 相比, 前者通常會比後者小多了。 package 並不需再進行編譯。 對大型應用程式如 MozillaKDEGNOME 而言,這點顯得相當重要, 尤其是使用速度緩慢的機器。 不需要瞭解如何在 FreeBSD 上編譯軟體的相關細節過程, 即可使用 package。 Ports 好處在於: 為了讓 package 能在大多數系統上順利執行, 通常在編譯時會使用比較保守的選項。 然而, 透過 port 安裝的話,則可針對特定環境(比如: Pentium 4 或 Athlon CPU) 來調整選項,以符合需求。 有些程式在編譯時,會有一些選項可以選擇。 舉例來說,Apache 可以設定一大堆的編譯選項。 若透過 port 來安裝的話, 會比較彈性多了,可以自己選而不必使用預設的編譯選項。 在某些情況,同樣的程式但不同編譯選項,則會分成不同的 package。 比如: Ghostscript 會因為是否要裝 X11 server, 而劃分為 ghostscript 以及 ghostscript-nox11 這兩種 package。 如此的調整對 package 算是可成立的, 但若該程式有一個以上或兩種不同的編譯選項時, 這對 package 就沒辦法了。 某些軟體的禁止以 binary 方式散佈, 或者說必須以原始碼方式散佈才可。 有些人並不信任 binary 套件機制,因為他們覺得至少有原始碼, (理論上)就可以自己檢閱,並尋找是否有潛在的問題。 若要對軟體加上自己改過的 patch, 那麼就必須要先有原始碼才能去上相關 patch 修正。 有些人喜歡有原始碼在手邊, 所以他們無聊時就可以自己閱讀、鑽研、借用 (當然要符合原始碼本身的授權規定)原始碼等等。 若想注意 port 更新動態的話,可以訂閱 &a.ports; 以及 &a.ports-bugs;。 在安裝軟體前,最好先看 內是否有該軟體的安全漏洞通報。 此外,也可以裝 ports-mgmt/portaudit,它會自動檢查所有已裝的 的軟體是否有已知的安全漏洞,另外,它還會在裝軟體的編譯過程前先行檢查。 也可以在裝了某些軟體之後,用 portaudit -F -a 來作全面強制安檢。 本章接下來將介紹如何在 FreeBSD 使用 package 及 port 來安裝、管理 third-party 軟體。 尋找想裝的軟體 在安裝任何軟體之前,你必須先了解你想要什麼的軟體, 以及該軟體叫做什麼名稱。 FreeBSD 上可裝的軟體清單不斷在增加中, 不過,我們很慶幸有幾種方式可以來找你想裝的軟體: FreeBSD 網站上有更新頻繁的軟體清單,在 http://www.FreeBSD.org/ports/ 。 各 ports 皆依其性質而分門別類,既可以透過軟體名稱來搜尋 (如果知道名字的話), 也可以在分類中列出所有可用的軟體。 FreshPorts 由 Dan Langille 所維護 FreshPorts 網站,網址在 。 FreshPorts 會不斷追蹤 port tree 中的各種變化, 也可以針對某些 port 以列入 追蹤名單(watch) 內, 當有任何軟體升級時,就會發 email 提醒。 FreshMeat 如果不知道想裝的軟體名稱,那麼可透過像是 FreshMeat () 這類的網站來找, 如果找到了,可以回 FreeBSD 網站去看一下這個應用程式是否已經被 port 進去了。 若知道該 port 的正確名稱,但不知道放在哪個分類目錄,可以用 &man.whereis.1; 指令來找出來。 只要打 whereis file 即可,而 file 的地方請改為想裝的軟體名稱。 若找到該軟體,就會告訴你,就像下面這樣: &prompt.root; whereis lsof lsof: /usr/ports/sysutils/lsof 如此一來,就會知道 lsof (系統工具程式) 是放在 /usr/ports/sysutils/lsof 目錄。 此外,也可以用 &man.echo.1; 輕鬆找出該 port 是位於 porte tree 的何處。 舉例來說: &prompt.root; echo /usr/ports/*/*lsof* /usr/ports/sysutils/lsof + + 請注意,這也會顯示 /usr/ports/distfiles 目錄內有符合檔名的檔案。 還有另一招,就是用 Ports Collection 本身內建的搜尋機制。 要用的時候,請先切換到 /usr/ports 目錄。 然後,打 make search name=程式名稱 ,其中 程式名稱 請改為想找的軟體名稱。 舉例來說,若要找的是 lsof 的話,那麼就是: &prompt.root; cd /usr/ports &prompt.root; make search name=lsof Port: lsof-4.56.4 Path: /usr/ports/sysutils/lsof Info: Lists information about open files (similar to fstat(1)) Maint: obrien@FreeBSD.org Index: sysutils B-deps: R-deps: 這些搜尋結果中,要注意的是 Path: 這行, 因為這行會告訴你可以在哪邊找到該 port。 而搜尋結果的其他部分,因為與 port 安裝較無關係,所以這裡就不講了。 若要更徹底的搜尋,那麼可以改用 make search key=string,其中 string 請改為想搜尋的關鍵字。 如此一來會找 port 名稱、軟體簡介(comments)、軟體敘述檔(descriptions) 以及軟體相依關係(dependencies)裡面是否有符合關鍵字, 此外,不清楚軟體名稱的話,也可以拿來找有符合關鍵字主題的 port。 剛講的這兩種方式,搜尋字眼都是 case-insensitive(不必區分大小寫)。 比如,搜尋 LSOFlsof 兩者結果都會是一樣的。 Chern Lee Contributed by 使用 Packages 管理機制 Package 的安裝方式 packages installing pkg_add 可以用 &man.pkg.add.1; 從本機上或者透過網路來安裝任一 FreeBSD package。 手動下載、安裝 Package &prompt.root; ftp -a ftp2.FreeBSD.org Connected to ftp2.FreeBSD.org. 220 ftp2.FreeBSD.org FTP server (Version 6.00LS) ready. 331 Guest login ok, send your email address as password. 230- 230- This machine is in Vienna, VA, USA, hosted by Verio. 230- Questions? E-mail freebsd@vienna.verio.net. 230- 230- 230 Guest login ok, access restrictions apply. 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.56.4.tgz local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz 200 PORT command successful. 150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes). 100% |**************************************************| 92375 00:00 ETA 226 Transfer complete. 92375 bytes received in 5.60 seconds (16.11 KB/s) ftp> exit &prompt.root; pkg_add lsof-4.56.4.tgz 若手邊沒有 package 來源(像是 FreeBSD 光碟)的話, 那麼建議使用 &man.pkg.add.1; 時,加上 選項來更輕鬆安裝 package。如此一來,就會自動判斷正確的 package 格式、 以及所搭配的作業系統 release 版本, 然後會自己從 FTP 站抓回、安裝相對應的 package。 pkg_add &prompt.root; pkg_add -r lsof 上面這例子會自動下載正確的 package 並安裝。 若想改換用其他 &os; Packages Mirror 站,那麼就要設定 PACKAGESITE 環境變數, 如此一來才會取代預設設定。 &man.pkg.add.1; 會用 &man.fetch.3; 指令來下載檔案,而 &man.fetch.3; 本身則會使用相關環境變數的設定, 像是: FTP_PASSIVE_MODEFTP_PROXY 以及 FTP_PASSWORD。 如果你網路環境處於 firewall 後面,或者需要用 FTP/HTTP proxy 的話,那麼就需要設定。 設定細節請參閱 &man.fetch.3;。 請注意:上面所說的例子是寫 lsof 而非 lsof-4.56.4。 當使用遠端抓取功能時,該 package 版號就不必加上去了。 &man.pkg.add.1; 會自動下載該軟體的最新版回來安裝。 若用的是 &os.current; 或 &os.stable; 的話,&man.pkg.add.1; 會自動下載該軟體最新版回來。 若用的是屬於 -RELEASE 版本,那麼他會抓回屬於該 release 上所編譯的 package。 也可以更改 PACKAGESITE 環境變數,以改變下載方式。 舉例來說,如果是 &os; 5.4-RELEASE 的話,那麼 &man.pkg.add.1; 預設會從 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5.4-release/Latest/ 來抓 package。若要強制 &man.pkg.add.1; 下載 &os; 5-STABLE 所用的 package,那麼就把 PACKAGESITE 改設為 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/Latest/ 即可。 Package 檔有 .tgz 以及 .tbz 兩種格式。 這些都可透過 ,或者 FreeBSD 光碟內取得。 每張 4 片裝的 FreeBSD 光碟(以及 PowerPak 包等等)內都會在 /packages 目錄內放 package。 裡面的目錄架構類似 /usr/ports 的目錄架構。 每個分類都各自有專屬目錄,且每份 package 都會放在 All 目錄內。 package 目錄架構與 port 的都一致;它們共同構成整個 package/port 系統機制。 管理 Packages packages managing &man.pkg.info.1; 可用來列出所有已安裝的軟體、軟體簡介。 pkg_info &prompt.root; pkg_info cvsup-16.1 A general network file distribution system optimized for CV docbook-1.2 Meta-port for the different versions of the DocBook DTD ... &man.pkg.version.1; 則是列出所有已安裝的軟體版本。 它會顯示已裝版本以及目前機器上 port tree 的版本差異。 pkg_version &prompt.root; pkg_version cvsup = docbook = ... 第二欄的符號表示:已安裝的軟體版本與目前機器上 port tree 的版本差異。 符號 代表意義 = 已裝的版本與目前機器上 port tree 的版本是同一版的。 < 與目前機器上 port tree 版本相比起來,已裝的版本較舊。 >與目前機器上 port tree 版本相比起來, 已裝的版本較新。(可能是目前機器上 port tree 尚未更新。) ?已裝的軟體在 ports 索引內找無相關資料。 (通常可能是,舉例來說:已安裝的該 port 已從 Ports Collection 中移除或改名了。) *該軟體同時有許多版本。 移除已安裝的 Package pkg_delete packages deleting 若要移除已裝的軟體,那麼請多利用 &man.pkg.delete.1; 工具,比如: &prompt.root; pkg_delete xchat-1.7.1 請注意 &man.pkg.delete.1; 須要放上完整的軟體名稱以及版本, 若只輸入 xchat 就不行,必須換成 xchat-1.7.1 才可。 然而,我們可以用 &man.pkg.version.1; 輕鬆找出已裝的所有軟體版本,或者以 wildcard (萬用字元) 的方式: &prompt.root; pkg_delete xchat\* 以上面例子而言,將會移除所有以 xchat 開頭的軟體。 其他細節部份 所有已裝的 package 資訊都會存到 /var/db/pkg 目錄內,在該目錄下可以找到記載已裝的軟體檔案清單及該軟體簡介的檔案。 使用 Ports 管理機制 下面我們會介紹如何使用 Ports Collection 來安裝、移除軟體的基本用法。 至於其他可用的 make 詳細用法與環境設定,可參閱 &man.ports.7;。 記得安裝 Ports Collection 在安裝任一 ports 之前,必須先裝上 Ports Collection —— 它主要是由 /usr/ports 內一堆 Makefiles, patches 以及一些軟體簡介檔所組成的。 在裝 FreeBSD 時,若忘了在 sysinstall 內勾選要裝 Ports Collection 的話, 沒關係,可以照下列方式來安裝 ports collection: CVSup 方式 使用 CVSup 是安裝、更新 Ports Collection 的快速方法之一。 若想更瞭解 CVSup 用法的話,請參閱 使用 CVSup。 csup 是以 C 語言對 CVSup 軟體的重寫,在 &os; 6.2 及之後版本即有附在系統內。 可以直接用系統所附的 csup 即可跳過步驟一的動作, 並將本文相關提到 cvsup 之處, 都改為 csup 即可。 此外, &os; 6.2 之前的版本,則可裝 net/csup 或者 package 來使用 csup 第一次跑 CVSup 之前,請先確認 /usr/ports 是乾淨的! 若你已經裝了 Ports Collection ,但又自行加上其他 patch 檔,那麼 CVSup 並不會刪除你自行加上的 patch 檔,這樣可能會導致要安裝某些軟體時, 發生 patch 失敗或編譯失敗。 安裝 net/cvsup-without-gui package: &prompt.root; pkg_add -r cvsup-without-gui 細節用法請參閱 安裝 CVSup()。 執行 cvsup &prompt.root; cvsup -L 2 -h cvsup.tw.FreeBSD.org /usr/share/examples/cvsup/ports-supfile 請把 cvsup.tw.FreeBSD.org 請改成離你比較近 (快)的 CVSup 主機。 這部分可以參閱完整的 CVSup mirror 站列表()。 若想改用自己設的 ports-supfile,比如說, 不想每次都得打指令來指定所使用的 CVSup 主機。 這種情況下,請以 root 權限把 /usr/share/examples/cvsup/ports-supfile 複製到其他位置,比如 /root 或者自己帳號的家目錄。 修改新的 ports-supfile 檔。 CHANGE_THIS.FreeBSD.org 改為離你比較近(快)的 CVSup 主機。 這部分可以參閱完整的 CVSup Mirrors () 站列表 然後就開始以類似下列指令跑 cvsup &prompt.root; cvsup -L 2 /root/ports-supfile 執行 &man.cvsup.1; 之後,就會開始更新 Ports Collection。 不過這動作只是『更新』並不是『升級』,不會把已裝的軟體重新編譯、升級。 Portsnap 方式 &man.portsnap.8; 也是更新 Ports Collection 的方式之一。 &os; 6.0 起開始內建 Portsnap 機制,而較舊的系統,則可透過 ports-mgmt/portsnap port 來安裝: &prompt.root; pkg_add -r portsnap Portsnap 細節功能,請參閱 Portsnap 使用篇。 /usr/ports 目錄不存在的話, 就建立一下吧: &prompt.root; mkdir /usr/ports 接下來,下載壓縮的 Ports Collection 定期更新檔到 /var/db/portsnap 目錄。 完成下載後,要斷線與否都可以。 &prompt.root; portsnap fetch 若是第一次跑 Portsnap 的話, 則需要先解壓到 /usr/ports &prompt.root; portsnap extract 若已有 /usr/ports 而且只是想更新而已, 那麼就照下面作: &prompt.root; portsnap update Sysinstall 方式 這方式要用 sysinstall 透過安裝來源來裝 Ports Collection。 請注意:所安裝的 Ports Collection 版本只是該 release 發佈時的版本而已,而非最新。 若能上網(Internet)的話,請使用上述方式之一會比較好。 root 權限執行 sysinstall (在 &os; 5.2 之前版本則是 /stand/sysinstall) ,方式如下: &prompt.root; sysinstall 請以方向鍵移動選擇項目,選擇 Configure,然後按 Enter 鍵。 選擇 Distributions,然後按 Enter 鍵。 選擇 ports,然後按 Space 鍵。 Exit,然後按 Enter 鍵。 選擇要用的安裝來源,比如:CDROM(光碟)、FTP 等方式。 Exit,然後按 Enter 鍵。 按下 X 鍵就可離開 sysinstall 程式。 Ports 的安裝方式 ports installing 提到 Ports Collection,首先要先說明的是:何謂 skeleton。 簡單來講,port skeleton 就是讓軟體如何在 FreeBSD 順利編譯、安裝的最基本檔案組合。 每份 port skeleton 基本上會有: Makefile 檔。 這個 Makefile 內容有分許多部分, 是用來指定要如何編譯,以及該裝在系統的何處。 distinfo 檔。 編譯該軟體所需下載的檔案、checksum(使用 &man.md5.1; 及 &man.sha256.1; 來檢驗檔案)都會記錄在這檔, 以確保所下載的檔案是正確無誤的。 files 目錄。 這目錄放的是讓軟體正常編譯、 安裝的 patch 檔。 Patches 檔基本上是一些小檔案,並針對特定檔案來做修改, 而且是純文字檔格式, 基本上內容通常會像是 Remove line 10(刪除第 10 行)Change line 26 to this ...(把第 26 行改為...) 之類的。 這些 Patches 通常也稱為 diffs ,因為都是由 &man.diff.1; 程式所產生的。 此外,本目錄也可能會放一些協助編譯該 port 的檔案。 pkg-descr 檔,內容是比較詳細的軟體介紹, 通常會寫得比較多行。 pkg-plist 檔,該 port 會安裝的所有檔案清單。 也是告訴系統在移除該 port 時,需要刪除哪些檔案。 有些 port 還會有其他檔案,像是 pkg-message 檔。 port 系統在一些情況時,會用這些檔案。 如果想知道這些檔案的更多細節用途,以及 port 一般用法,請參閱 FreeBSD Porter's Handbook port 內寫的是告訴系統如何編譯 source code 的相關指令, 但並不是真正的 source code。 而 source code 可以從光碟或網路(Internet)來取得, 該軟體開發者可能會把 source code 以各種格式來發佈。 通常是以 tar 以及 gzip 這兩者工具一起壓縮的檔案, 也有可能是以其他工具壓縮,或根本沒壓縮。 而軟體的 source code 無論是以哪一種壓縮檔型態,我們都稱之為 distfile。 下面將介紹兩種安裝 &os; port 的方式。 要安裝 port 的話,請務必切為 root 身份。 在安裝任何 port 之前,請務必確認有更新 Ports Collection 到最新版, 此外請檢閱 來檢查所要裝的 port 是否有相關安全漏洞議題需要注意的。 portaudit 會在安裝任何 port 之前, 先自動檢查是否有相關已知的安全漏洞。這個工具在 Ports Collection 內有 (ports-mgmt/portaudit)。 在安裝 port 之前,可以先跑 portaudit -F 指令, 如此一來就會抓最新的資安漏洞資料庫回來核對。 每天的系統定期安檢會自動更新資料庫,並作安全稽核。 詳情請參閱 &man.portaudit.1; 以及 &man.periodic.8; 的線上說明。 Ports Collection 會假設你的網路是可正常連線的。 如果沒有的話,那麼需手動把所需的 distfile 檔複製到 /usr/ports/distfiles 才行。 開始操作之前,要先進入打算安裝的 port 目錄內: &prompt.root; cd /usr/ports/sysutils/lsof 一旦進入 lsof 目錄後,就可以看到這個 port 的 skeleton 結構。 接下來,就是編譯,也就是 build 這個 port。 只需簡單輸入 make 指令,就可輕鬆完成編譯。 完成後,應該可以看到類似下面訊息: &prompt.root; make >> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/. >> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/. ===> Extracting for lsof-4.57 ... [extraction output snipped] ... >> Checksum OK for lsof_4.57D.freebsd.tar.gz. ===> Patching for lsof-4.57 ===> Applying FreeBSD patches for lsof-4.57 ===> Configuring for lsof-4.57 ... [configure output snipped] ... ===> Building for lsof-4.57 ... [compilation output snipped] ... &prompt.root; 請注意:編譯完成後,就會回到提示列(prompt)。接下來就是安裝該 port 了,要裝的話,只需在原本的 make 指令後面再加上一個字即可, 那個字就是 install &prompt.root; make install ===> Installing for lsof-4.57 ... [installation output snipped] ... ===> Generating temporary packing list ===> Compressing manual pages for lsof-4.57 ===> Registering installation for lsof-4.57 ===> SECURITY NOTE: This port has installed the following binaries which execute with increased privileges. &prompt.root; 一旦回到提示列(prompt),就可以執行剛裝的程式了。 另外,因為 lsof 這程式執行時會有額外權限, 所以會出現安全警告。在編譯、安裝 port 的時候, 請留意任何出現的警告。 此外,建議刪除編譯用的工作目錄(預設是 work), 這目錄內為在編譯過程中所用到的一些臨時檔案, 這些檔案不只佔硬碟空間,而且也可能會在該 port 升級新版時, 造成不必要的困擾。 &prompt.root; make clean ===> Cleaning for lsof-4.57 &prompt.root; make install clean 就可以一口氣完成剛所說 makemake installmake clean 這三個步驟了。 有些 shell 會依據 PATH 環境變數的路徑, 把那些路徑的執行檔 cache 起來,來加速搜尋執行檔。 如果你用的是這類的 shell,那麼在裝完 port 後需要打 rehash 指令,才能執行新裝的執行檔,而 rehash 指令可以在 tcsh 之類的 shell 上使用,若是 sh 的話,則是 hash -r。 詳情請參閱你所使用的 shell 相關文件。 有些由所謂 third-party 所發行的 DVD-ROM 產品,像是 FreeBSD Mall 所發行的 FreeBSD Toolkit 會包括 distfiles 檔案, 這些檔案可用來搭配 Ports Collection。 把 DVD-ROM 掛載在 /cdrom。 若使用其他掛載點的話,要記得設定 CD_MOUNTPTS 環境變數為相對應的掛載點。 如此一來,光碟上若有所需的 distfiles 就會自動使用光碟的檔案。 請注意,有少數 port 並不允許透過光碟來發佈檔案。 可能的原因有:需先填註冊單才能下載或散佈檔案,或其他原因。 如果想安裝在光碟上沒附上的 port,就需連上網路才能繼續進行安裝。 ports 系統採用 &man.fetch.1; 來下載檔案, 它有許多可調整的環境變數,包括: FTP_PASSIVE_MODEFTP_PROXYFTP_PASSWORD。 如果是處於有防火牆的環境, 或者需要使用 FTP/HTTP proxy,那麼就需要設定這些變數。 使用細節請參閱 &man.fetch.3; 說明。 若無法隨時一直上網的話,那麼可以利用 make fetch。 只要在 port 的最上層路徑(/usr/ports) 打這指令,那麼所有需要用到的檔案都會下載。 這指令也可以在下層目錄使用,例如: /usr/ports/net。 請注意,若該 port 有相依的 library 或者其他 port 的話, 那麼它並不會跟著一起下載其他所相依的檔案。 若想一次下載所有相依的 port 所有檔案,那麼指令參數請改用 fetch-recursive 而非 fetch 可以在某類別或最上層路徑打 make 指令來編譯所有的 port,或者以上述的 make fetch 指令來下載所有檔案。 然而,這樣是相當危險,因為有些 port 不能並存。 也有另一種情況,有些 port 可能會以相同檔名, 但是實際上卻是不同內容的檔案。 在某些罕見情況,可能需加上 MASTER_SITES (檔案的原始下載處)之外的下載點,以下載所需的檔案。 可以用下列指令,來更改預設的 MASTER_SITES 下載點: &prompt.root; cd /usr/ports/directory &prompt.root; make MASTER_SITE_OVERRIDE= \ ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch 上面這例子,是把 MASTER_SITES 改設 ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ 為下載點。 有些 port 允許(或要求)您得指定編譯選項, 以啟用、停用該軟體中非必須的功能、安全選項以及其他可自訂的選項。 具有代表性的包括了 www/mozillasecurity/gpgmemail/sylpheed-claws。 若有這類選項時,通常在編譯時會出現相關提示訊息。 更改(Override)預設的 Ports 目錄 有時候,會發現到使用其他目錄作為 port、distfiles 目錄可能相當有用(甚至是必須),可以設定 PORTSDIRPREFIX 環境變數以修改預設的 port 目錄。舉例: &prompt.root; make PORTSDIR=/usr/home/example/ports install 以上會在 /usr/home/example/ports 內進行編譯, 並把所有檔案安裝到 /usr/local 內。 &prompt.root; make PREFIX=/usr/home/example/local install 則會在 /usr/ports 目錄內編譯, 並把所有檔案安裝到 /usr/home/example/local 內。 當然囉, &prompt.root; make PORTSDIR=../ports PREFIX=../local install 則會同時包含兩種設定(還有很多變化以致無法在本頁全部都有寫到, 但您應該已經有抓到大概概念了吧)。 此外,這些變數也以作為環境變數來設定。 請依您所使用的 shell 去參閱相關說明,以瞭解如何設定。 處理 <command>imake</command> 有些 port 會使用 imake(X Window 系統的一部份) 無法正常運用 PREFIX 變數, 它們會堅持把檔案都安裝到 /usr/X11R6 目錄。 同樣地,也有一些 Perl port 會忽略 PREFIX 並把檔案安裝到 Perl 目錄架構內。 讓這些 ports respect PREFIX 是相當困難,甚至是不可能的事。 重新設定 Ports 選項 在編譯某些 port 時會出現選單畫面(ncurses-based), 可以用來選擇安裝選項。 通常裝好該 port 之後,便不太會需要重加、 移除、更改一些當初安裝的選項。 但日後若有需要的話, 也有許多方式可以調整這些選項。 其中一種方式便是切到該 port 目錄, 並打 make config 即可再次回到選項畫面去作調整。 另外還可用 make showconfig 以顯示該 port 安裝時所用的選項。 也可以用 make rmconfig 來把所有選項回到初始設定。 這些選項跟其他動作都可參閱 &man.ports.7; 內的詳細說明。 移除已安裝的 Ports ports removing 現在您已經知道如何安裝 port,而開始想瞭解如何移除。 比如裝了一個 port 後才意識到裝錯 port 了。 在此,我們將移除前面例子所裝的那個 port (沒仔細注意的話,我們再提醒一下就是 lsof)。 跟移除 package 時相當類似(在 Packages section 有介紹),都是使用 &man.pkg.delete.1; 指令: &prompt.root; pkg_delete lsof-4.57 升級已安裝的 Ports ports upgrading 首先,用 &man.pkg.version.1; 指令來列出目前 Ports Collection 中提供了那些可升級的 port 版本: &prompt.root; pkg_version -v <filename>/usr/ports/UPDATING</filename> 每次更新完 Ports Collection 之後,請務必記得在升級 port 前, 先看看 /usr/ports/UPDATING, 這裡會寫升級方面的各式問題,比如:檔案格式改變、變更設定檔位置、 與舊版不相容的問題等,以及怎麼解決的完整步驟。 UPDATING 內容與你看到的其他文件有些不同 、相衝的話, 那麼請以 UPDATING 為準。 以 Portupgrade 來升級已安裝的 Ports portupgrade portupgrade 可以輕鬆升級已裝的軟體。 該工具可從 ports-mgmt/portupgrade port 安裝, 安裝方式就如同其他 port 一樣,用 make install clean 指令就可以了: &prompt.root; cd /usr/ports/ports-mgmt/portupgrade &prompt.root; make install clean 首先最好先以 pkgdb -F 來掃瞄已裝的 ports 資料庫是否有誤,並修正有問題的地方。 在每次做升級之前,最好定期做一下 pkgdb -F 動作會較為妥當。 portupgrade -a 的話, portupgrade 會升級系統上所有已裝的過舊 ports。 若用 則在升級每個 port 過程當中, 會要求確認相關動作是否符合所需。 &prompt.root; portupgrade -ai 若只想升級某特定程式而非全部,那麼可以用 portupgrade pkgname 來做指定。 若想要 portupgrade 優先升級某 port 所相依的相關套件,則請用 參數即可。 &prompt.root; portupgrade -R firefox 若要用 package 而非 port 來安裝,則需指定 才可以。 若有指定這選項,則 portupgrade 會搜尋 PKG_PATH 變數所指定的本機目錄, 若找不到則透過網路來下載安裝。 若本機跟網路都沒有可用的 package 的話,則 portupgrade 會使用 port 方式安裝。 若不想如此又變成使用 port 方式安裝,則用 即可強制避免使用 port 方式安裝。 &prompt.root; portupgrade -PP gnome2 若只想下載 distfiles(或者若指定 的話,則是 package)而不想編譯或安裝檔案,可以使用 。 詳情請參閱 &man.portupgrade.1; 的說明。 以 Portmanager 來升級已安裝的 Ports portmanager Portmanager 也可以用來輕鬆升級已裝的軟體。 該工具可從 ports-mgmt/portmanager port 安裝: &prompt.root; cd /usr/ports/ports-mgmt/portmanager &prompt.root; make install clean 所有已裝的軟體,都可以輕鬆用類似下列指令來升級: &prompt.root; portmanager -u 此外,使用參數可以改為 ,如此一來 Portmanager 在升級一些有特殊選項的軟體時 ,就會詢問該如何升級。 Portmanager 也可以用來裝新 port。與以往常用的 make install clean 指令不同之處在於: 它會先升級你要裝的 port 所相依的所有 ports,然後才開始編譯、 安裝要裝的 port。 &prompt.root; portmanager x11/gnome2 若要裝的 port 之軟體相依關係有問題時,也可以用 Portmanager 使它們重歸正軌。 而 Portmanager 解決相依問題完畢之後,該 port 也會重新編譯,以因應正確的相依關係。 &prompt.root; portmanager graphics/gimp -f 其餘運用法門,請參閱 &man.portmanager.1; 說明。 Ports 與硬碟空間 ports disk-space 因為使用 Ports Collection 遲早可能會用光硬碟空間, 所以在裝完軟體後,記得要以 make clean 指令來清除臨時的 work 目錄。 此外,可以用下列指令來清除整個 Ports Collection 內的臨時目錄: &prompt.root; portsclean -C ports 用久了,您可能會在 distfiles 目錄內會累積著許多的原始碼檔案。 可以手動刪除這些檔案, 或者用下列指令來清除所有 port 都不使用的舊檔: &prompt.root; portsclean -D 或者要清除所有已裝的 port 都不再使用的舊檔: &prompt.root; portsclean -DD portsclean 這工具乃是 portupgrade 套件的一部分。 不要忘了移除那些已經安裝,但不再需要用到的 ports。 有個 ports-mgmt/pkg_cutleaves port,正是可自動完成這功能的好工具。 安裝之後,有什麼後續注意事項嗎? 通常,安裝完軟體後,我們可以閱讀所附的一些文件,或需要編輯設定檔, 來確保這個軟體能順利運作,或在機器開機的時候啟動(如果是 daemon 的話) 等等。 不同的軟體會有不同的設定步驟。不管怎樣,如果裝好了軟體, 但是不知道下一步怎麼辦的時候, 可以試試看這些小技巧: 善用 &man.pkg.info.1; ,這指令可以顯示:透過套件管理系統 (Packages/Ports)裝了哪些軟體、檔案裝在哪邊。舉例來說,若剛裝了 FooPackage (版本 1.0.0),那麼下面這指令: &prompt.root; pkg_info -L foopackage-1.0.0 | less 就會顯示這軟體所安裝的檔案清單。 請特別注意在 man/ 目錄內是說明檔、 etc/ 目錄內是設定檔、 doc/ 目錄內是完整文件。 若不確定已裝的套件版本為何,可以用類似下列指令來查: &prompt.root; pkg_info | grep -i foopackage 以上將會搜尋所有已裝的套件,列出有符合 foopackage 的套件名稱。 請自行依需求,修改 foopackage 為想找的套件名稱。 一旦確認該程式的線上說明有安裝,就可以用 &man.man.1; 來翻閱。 同樣地,若該程式有提供的話,也可以參考設定檔樣本,以及其他文件。 若該程式有官網的話,還可以透過網站來找文件、常見問答集(FAQ)等。 若不知道網址,請用下列指令: &prompt.root; pkg_info foopackage-1.0.0 若該程式有官網的話,則會有一行 WWW: 開頭的出現,這行會列出該程式的官網網址(URL)。 Port 若須在開機時就會啟動(就像 Internet 主機),通常都會安裝 script 到 /usr/local/etc/rc.d 目錄。 您可以檢閱這 script 的正確與否,或若有需要,也可以修改、改名。 詳情請參閱 啟動 Services。 如何處理爛掉(Broken)的 Ports? 如果發現某個 port 無法順利安裝、運作, 有幾種方法可以試試看: Problem Report 資料庫 中挖寶看看,說不定已經有人送可用的 patch 上去囉, 那麼或許就可以順利解決問題哩。 向該 port 的 maintainer 尋求協助:請打 make maintainer 或翻閱 Makefile 以查詢 maintainer 的 email address。記得寄信給 maintainer 時,要附註該 port 的名稱、版本(或是把 Makefile 內的 $FreeBSD: 那一整行附上) 以及相關錯誤訊息。 有些 port 不是由專門的單一 maintainer 負責,而是透過 mailing list 的專題討論。許多(但非全部)的聯絡 email 格式通常是 freebsd-list名稱@FreeBSD.org 。發問時,請記得把『freebsd-list名稱』改為相關討論的 mailing list 名稱。 尤其當 port 的 maintainer 欄位是 freebsd-ports@FreeBSD.org 時,事實上已經沒人當該 port maintainer 了。 因此若該 port 仍有修正或其他技術支援的話,相關討論都會在 freebsd-ports 郵遞論壇上出現。 喔,對了,如果有熟悉該軟體者,志願當該 port maintainer 的話,我們也都很歡迎您的加入喔。 若 port maintainer 沒有回覆您的信件, 則可以用 &man.send-pr.1; 來提交問題報告 PR。(請參閱 Writing FreeBSD Problem Reports)。 試試看修正它吧! Porter's Handbook 包括了 Ports 架構的細節部份,這些書中內容有助您修好有問題的 port 甚至提交自己的 port﹗ 從較近的 FTP 站點下載編譯好的 package。 package collection 的最上游站是在 ftp.FreeBSD.org 上的 packages 目錄內,但請記得先檢查是否已有 local mirror 站! 通常情況下這些 package 都可以直接使用, 而且應該比自行編譯快一些。 用 &man.pkg.add.1; 即可順利安裝 package 。