doc/zh_TW.Big5/books/handbook/ports/chapter.xml
Gabor Kovesdan a6684b4306 - Reduce the misuse of role attribute; role="directory" should actually be
class="directory"
- Add constraint to enforce this
2013-04-04 11:40:58 +00:00

1329 lines
46 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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