1329 lines
46 KiB
XML
1329 lines
46 KiB
XML
<?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; 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; 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><</entry>
|
||
<entry>與目前機器上 port tree 版本相比起來,已裝的版本較舊。</entry>
|
||
</row>
|
||
|
||
<row><entry>></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; 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>
|
||
>> 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;</screen>
|
||
|
||
<para>請注意:編譯完成後,就會回到提示列(prompt)。接下來就是安裝該
|
||
port 了,要裝的話,只需在原本的 <command>make</command>
|
||
指令後面再加上一個字即可,
|
||
那個字就是 <command>install</command>:</para>
|
||
|
||
<screen>&prompt.root; <userinput>make install</userinput>
|
||
===> 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;</screen>
|
||
|
||
<para>一旦回到提示列(prompt),就可以執行剛裝的程式了。
|
||
另外,因為 <command>lsof</command> 這程式執行時會有額外權限,
|
||
所以會出現安全警告。在編譯、安裝 port 的時候,
|
||
請留意任何出現的警告。</para>
|
||
|
||
<para>此外,建議刪除編譯用的工作目錄(預設是 <filename>work</filename>),
|
||
這目錄內為在編譯過程中所用到的一些臨時檔案,
|
||
這些檔案不只佔硬碟空間,而且也可能會在該 port 升級新版時,
|
||
造成不必要的困擾。</para>
|
||
|
||
<screen>&prompt.root; <userinput>make clean</userinput>
|
||
===> 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>$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>
|