4.5. 使用 Port 套件集
前一頁 | 章 4. 安裝應用程式：套件與 Port | 下一頁

## 4.5. 使用 Port 套件集

Port 套件集是指一數個 `Makefiles`、修補及描述檔案，每一組這些檔案可用來編譯與安裝在 FreeBSD 上的一個應用程式，即稱為一個 Port。

預設，Port 套件集儲存在 `/usr/ports` 的子目錄下。

在應用程式可以使用 Port 編譯之前，必須先安裝 Port 套件集。若在安裝 FreeBSD 時沒有安裝，可以使用以下其中一種方式安裝：

過程 4.1. Portsnap 方法

FreeBSD 的基礎系統內含 Portsnap，這是一個可用來取得 Port 套件集簡單又快速的工具，較建議多數使用者使用這個方式。此工具會連線到 FreeBSD 的網站，驗証密鑰，然後下載 Port 套件集的新複本。該金鑰是要用來檢驗所有已下載檔案的完整性。

1. 要下載壓縮後的 Port 套件集快照 (Snapshot) 到 `/var/db/portsnap`：

       # portsnap fetch

2. 當第一次執行 Portsnap 時，要先解壓縮快照到 `/usr/ports`：

       # portsnap extract

3. 在完成上述第一次使用 Portsnap 的動作之後，往後可隨需要執行以下指令來更新 `/usr/ports` ：

       # portsnap fetch
       # portsnap update

   當使用 `fetch` 時也可同時執行 `extract` 或 `update` 如：

       # portsnap fetch update

過程 4.2. Subversion 方法

若要取得更多對 Port 樹的控制，或若有本地的變更需要維護，可以使用 Subversion 來取得 Port 套件集。請參考 Subversion Primer 來取得 Subversion 的詳細說明。

1. 必須安裝 Subversion 才可用來取出 (Check out) Port 樹。若已存在 Port 樹的複本，可使用此方式安裝 Subversion：

       # cd /usr/ports/devel/subversion
       # make install clean

   若尚無法使用 Port 樹，或已經使用 pkg 來管理套件，可使用套件來安裝 Subversion：

       # pkg install subversion

2. 取出 Port 樹的複本：

       # svn checkout https://svn.FreeBSD.org/ports/head /usr/ports

3. 若需要，在第一次 Subversion 取出後可使用以下指令更新 `/usr/ports`：

       # svn update /usr/ports

Port 套件集中含有代表不同軟體分類的目錄，每個分類底下的子目錄代表每個應用程式，每個內含數個用來告訴 FreeBSD 如何編譯與安裝該程式檔案的應用程式子目錄即稱作 Port Skeleton，每個 Port Skeleton 會含有以下檔案及目錄：

- `Makefile`：內含用來說明應用程式要如何編譯、要安裝該程式到那的敘述句。

- `distinfo`：內含編譯 Port 必須下載的檔案名稱以及校驗碼 (Checksum)。

- `files/`：此目錄含有編譯與安裝程式到 FreeBSD 時所需的修補檔。此目錄也可能含有其他用來編譯 Port 的檔案。

- `pkg-descr`：提供程式更詳細的說明。

- `pkg-plist`：Port 安裝的所有檔案清單，也同時會告訴 Port 系統解除安裝時要移除那一些檔案。

部份 Port 含有 `pkg-message` 或其他檔案用來處理特殊情況。要取得有關這些檔案的詳細資訊，以及 Port 的概要可參考 FreeBSD Porter's Handbook。

Port 中並不含實際的原始碼，即為 `distfile`，在編譯 Port 解壓縮時會自動下載的原始碼到 `/usr/ports/distfiles`。

### 4.5.1. 安裝 Port

下面我們會介紹如何使用 Port 套件集來安裝、移除軟體的基本用法。 `make` 可用的目標及環境變數詳細說明可參閱 ports(7)。

### 警告:

在編譯任何 Port 套件前，請先確認已經如前章節所敘述之方法更新 Port 套件集。安裝任何第三方軟體皆可能會導致安全性漏洞，建議在安裝前先閱讀 https://vuxml.freebsd.org/ 了解 Port 已知的安全性問題。或者在每次安裝新 Port 前執行 `pkg audit -F`。此指令可以設定在每日系統安全性檢查時自動完成安全性稽查以及更新漏洞資料庫。要取得更多資訊，請參考 pkg-audit(8) 及 periodic(8)。

使用 Port 套件集會假設您擁有可正常連線的網路，同時也會需要超級使用者的權限。

要編譯並安裝 Port，需切換目錄到要安裝的 Port 底下，然後輸入 `make install`，訊息中會顯示安裝的進度：

    # cd /usr/ports/sysutils/lsof
    # make install
    >> lsof_4.88D.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.88
    ...
    [extraction output snipped]
    ...
    >> Checksum OK for lsof_4.88D.freebsd.tar.gz.
    ===>  Patching for lsof-4.88.d,8
    ===>  Applying FreeBSD patches for lsof-4.88.d,8
    ===>  Configuring for lsof-4.88.d,8
    ...
    [configure output snipped]
    ...
    ===>  Building for lsof-4.88.d,8
    ...
    [compilation output snipped]
    ...

    ===>  Installing for lsof-4.88.d,8
    ...
    [installation output snipped]
    ...
    ===>   Generating temporary packing list
    ===>   Compressing manual pages for lsof-4.88.d,8
    ===>   Registering installation for lsof-4.88.d,8
    ===>  SECURITY NOTE:
          This port has installed the following binaries which execute with
          increased privileges.
    /usr/local/sbin/lsof
    #

`lsof` 是需要進階權限才有辦法執行的程式，因此當該程式安裝完成時會顯示安全性警告。一旦安裝完成便會顯示指令提示。

有些 Shell 會將 `PATH` 環境變數中所列目錄中可用的指令做快取，來增加在執行指這些指令時的查詢速度。`tcsh` Shell 的使用者應輸入 `rehash` 來讓新安裝的指令不須指定完整路徑便可使用。若在 `sh` Shell 則使用 `hash -r`。請參考 Shell 的說明文件以取得更多資訊。

安裝過程中會建立工作用的子目錄用來儲存編譯時暫存的檔案。可移除此目錄來節省磁碟空間並漸少往後升級新版 Port 時造成問題：

    # make clean
    ===>  Cleaning for lsof-88.d,8
    #

### 注意:

若想要少做這個額外的步驟，可以編譯 Port 時使用 `make install clean`。

#### 4.5.1.1. 自訂 Port 安裝

部份 Port 提供編譯選項，可用來開啟或關閉應用程式中的元件、安全選項、或其他允許自訂的項目。這類的應用程式例子包括 www/firefox, security/gpgme 以及 mail/sylpheed-claws。若 Port 相依的其他 Port 有可設定的選項時，預設的模式會提示使用者選擇選單中的選項，這可能會讓安裝的過程暫停讓使用者操作數次。要避免這個情況，可一次設定所有選項，只要在 Port skeleton 中執行 `make config-recursive`，然後再執行 `make install [clean]` 編譯與安裝該 Port。

### 提示:

使用 `config-recursive` 時，會使用 `all-depends-list` Target 來收集所有要設定 Port 清單。建議執行 `make config-recursive` 直到所有相依的 Port 選項都已定義，直到 Port 的選項畫面不會再出現，來確定所有相依的選項都已經設定。

有許多方式可以重新進入 Port 的編譯選項清單，以便在編譯 Port 之後加入、移除或更改這些選項。方法之一是 `cd` 進入含有 Port 的目錄並輸入 `make config`。還有另一個方法是使用 `make showconfig`。最後一個方法是執行 `make rmconfig` 來移除所有曾選擇過的選項，讓您能夠重新設定。這些方法在 ports(7) 中都有詳細的說明。

Port 系統使用 fetch(1) 來下載檔案，它支援許多的環境變數可設定。若 FreeBSD 系統在防火牆或 FTP/HTTP 代理伺服器後面，可以設定 `FTP_PASSIVE_MODE`, `FTP_PROXY` 以及 `FTP_PASSWORD` 變數。請參考 fetch(3) 取得完整支援的變數清單。

對於那些無法一直連線到網際網路的使用者，可在 `/usr/ports` 下執行 `make fetch` 來下載所有的 distfiles，或是可在某個分類的目錄中，例如 `/usr/ports/net`，或指定的 Port Skeleton 中執行。要注意的是，若 Port 有任何的相依，在分類或 Port Skeleton 中執行此指令並 不會 下載相依在其他分類的 Port distfiles。可使用 `make fetch-recursive` 來下載所有相依 Port 的 distfiles。

在部份少數情況，例如當公司或組織有自己的本地 distfiles 檔案庫，可使用 `MASTER_SITES` 變數來覆蓋在 `Makefile` 中指定的下載位址。當要指定替代的位址時可：

    # cd /usr/ports/directory
    # make MASTER_SITE_OVERRIDE= \
    ftp://ftp.organization.org/pub/FreeBSD/ports/distfiles/ fetch

也可使用 `WRKDIRPREFIX` 及 `PREFIX` 變數來覆蓋預設的工作及目標目錄。例如：

    # make WRKDIRPREFIX=/usr/home/example/ports install

會編譯在 `/usr/home/example/ports` 的 Port 並安裝所有東西到 `/usr/local` 下。

    # make PREFIX=/usr/home/example/local install

會編譯在 `/usr/ports` Port 並安裝到 `/usr/home/example/local`。然後：

    # make WRKDIRPREFIX=../ports PREFIX=../local install

來同時設定工作及目標目錄。

這些變數也可做為環境變數設定，請參考您使用的 Shell 操作手冊來取得如何設定環境變數的說明。

### 4.5.2. 移除已安裝的 Port

安裝的 Port 可以使用 `pkg delete` 解除安裝。 使用這個指令的範例可以在 pkg-delete(8) 操作手冊找到。

或者，可在 Port 的目錄下執行 `make deinstall`：

    # cd /usr/ports/sysutils/lsof
    make deinstall
    ===>  Deinstalling for sysutils/lsof
    ===>   Deinstalling
    Deinstallation has been requested for the following 1 packages:

    	lsof-4.88.d,8

    The deinstallation will free 229 kB
    [1/1] Deleting lsof-4.88.d,8... done

建議閱讀 Port 解除安裝後的訊息，若有任何相依該 Port 的應用程式，這些資訊會被顯示出來，但解除安裝的程序仍會繼續。在這種情況下最好重新安裝應用程式來避免破壞相依性。

### 4.5.3. 升級 Port

隨著時間推移，Port 套件集中會有新版的軟體可用。本節將說明如何檢查是否有可以升級的軟體及如何升級。

要檢查已安裝 Port 是否有新版可用，請先確定已安裝最新版本的 Port 樹，使用 過程 4.1, “Portsnap 方法” 或 過程 4.2, “Subversion 方法” 中說明的指令來更新。在 FreeBSD 10 與更新的版本，或若套件系統已轉換為 pkg，可以使用下列指令列出已經安裝的 Port 中有那些已過時：

    # pkg version -l "<"

在 FreeBSD 9.`X` 與較舊的版本，可以使用下列指令列出已經安裝的 Port 中有那些已過時：

    # pkg_version -l "<"

### 重要:

在嘗試升級之前，請先從檔首閱讀 `/usr/ports/UPDATING` 來取得最近有那些 Port 已升級或系統已安裝。這個檔案中會說明各種問題及在升級 Port 時可能會需要使用者執行的額外步驟，例如檔案格式更改、設定檔位置更改、或任何與先前版本不相容的問題。留意那些與您要升級 Port 相關的指示，並依照這些指示執行升級。

#### 4.5.3.1. 升級與管理 Port 的工具

Port 套件集含有數個工具可以進行升級，每一種工具都有其優點及缺點。

以往大多 Port 安裝會使用 Portmaster 或 Portupgrade，現在有較新的 Synth 可使用。

### 注意:

那一種工具對特定系統是最佳的選擇取決於系統管理員。建議在使用任何這些工具之前先備份資料。

#### 4.5.3.2. 使用 Portmaster 升級 Port

ports-mgmt/portmaster 是可用來升級已安裝 Port 的小巧工具，它只使用了隨 FreeBSD 基礎系統安裝的工具，不需要相依其他 Port 或資料庫便可在 FreeBSD 使用，要使用 Port 安裝此工具可：

    # cd /usr/ports/ports-mgmt/portmaster
    # make install clean

Portmaster 將 Port 定義成四種類型：

- 根 Port：沒有相依且也不被任何其他 Port 相依。

- 主幹 Port：沒有相依，但被其他 Port 相依。

- 分支 Port：有相依，且其被其他 Port 相依。

- 枝 Port：有相依，但沒有被其他 Port 相依。

要列出這幾個分類並搜尋是否有新版：

    # portmaster -L
    ===>>> Root ports (No dependencies, not depended on)
    ===>>> ispell-3.2.06_18
    ===>>> screen-4.0.3
            ===>>> New version available: screen-4.0.3_1
    ===>>> tcpflow-0.21_1
    ===>>> 7 root ports
    ...
    ===>>> Branch ports (Have dependencies, are depended on)
    ===>>> apache22-2.2.3
            ===>>> New version available: apache22-2.2.8
    ...
    ===>>> Leaf ports (Have dependencies, not depended on)
    ===>>> automake-1.9.6_2
    ===>>> bash-3.1.17
            ===>>> New version available: bash-3.2.33
    ...
    ===>>> 32 leaf ports

    ===>>> 137 total installed ports
            ===>>> 83 have new versions available

此指令用來升級所有過時的 Port：

    # portmaster -a

### 注意:

預設 Portmaster 會在刪除已存在的 Port 前備份套件，若成功安裝新版 Portmaster 會刪除該備份。使用 `-b` 來讓 Portmaster 不會自動刪除備份。加入 `-i` 可啟動 Portmaster 的互動模式，會在升級每個 Port 前提示訊息。尚有許多可用的其他選項，請閱讀 portmaster(8) 的操作手冊來取得詳細的用法。

若升級的過程發生錯誤，可加入 `-f` 來升級並重新編譯所有 Port：

    # portmaster -af

Portmaster 也可用來安裝新的 Port 到系統，在編譯及安裝新 Port 前升級所有相依模組。要使用這個功能，要指定 Port 位於 Port 套件集中的位置：

    # portmaster shells/bash

更多有關 ports-mgmt/portmaster 的資訊可至其 `pkg-descr` 取得。

#### 4.5.3.3. 使用 Portupgrade 升級 Port

ports-mgmt/portupgrade 是另一個可以用來升級 Port 的工具，此工具會安裝一套可以用來管理 Port 的應用程式，它需要相依 Ruby。要安裝該 Port：

    # cd /usr/ports/ports-mgmt/portupgrade
    # make install clean

在執行升級之前使用此工具，建議使用 `pkgdb -F` 掃描已安裝的 Port 並修正該指令回報的所有資訊不一致的套件。

要升級所有安裝在系統上過時的 Port，可使用 `portupgrade -a`，或者加上 `-i` 會在每個套件升級時詢問確認：

    # portupgrade -ai

要升級指定的應用程式而非所有可用 Port 可使用 `portupgrade `pkgname``，非常重要的是，要加上 `-R` 來先升級指定應用程式所有相依的 Port：

    # portupgrade -R firefox

若使用 `-P`，Portupgrade 會先在 `PKG_PATH` 清單中的本地目錄中搜尋可用的套件。若本地沒有可用的套件，則會從遠端下載。若套件無法在本地或遠端找到，Portupgrade 則會使用 Port 來安裝。要避免完全使用 Port 安裝，可使用 `-PP`，這個選項會告訴 Portupgrade 若沒有套件可用時放棄安裝：

    # portupgrade -PP gnome3

若只想要下載 Port distfiles 或套件，使用 `-P` 參數。若不要編譯或安裝任何東西，使用 `-F`。請參考 `portupgrade` 的操作手冊來取得所有可用選項的更多資訊。

更多有關 ports-mgmt/portupgrade 的資訊可至其 `pkg-descr` 取得。

### 4.5.4. Port 與磁碟空間

使用 Port 套件集會隨著時間消耗磁碟空間。在編譯與安裝 Port 完之後，在 Port Skeleton 中執行 `make clean` 可清除暫存的 `work` 目錄。若使用 Portmaster 來安裝 Port，則會自動移除該目錄，除非使用 `-K`。若有安裝 Portupgrade，此指令將會移除所有在 Port 套件集的本地複本中找到的 `work` 目錄：

    # portsclean -C

除此之外，許多過時的原始碼發行檔案會儲存在 `/usr/ports/distfiles`。使用 Portupgrade 刪除所有不再被任何 Port 所引用的 distfiles：

    # portsclean -D

Portupgrade 可以移除所有未被任何安裝在系統上的 Port 所引用的 distfiles：

    # portsclean -DD

若有安裝 Portmaster，則可使用：

    # portmaster --clean-distfiles

預設，若 distfile 應要被刪除，這個指令會以互動的方式向使用者確認。

除了以上指令外，ports-mgmt/pkg_cutleaves 可自動移除不再需要使用的 Port。

前一頁 | 上一層 | 下一頁
4.4. 使用 pkg 管理 Binary 套件 | 起始頁 | 4.6. 使用 Poudriere 編譯套件

本文及其他文件，可由此下載： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。

若有 FreeBSD 方面疑問，請先閱讀 FreeBSD 相關文件，如不能解決的話，再洽詢 <questions@FreeBSD.org>。
關於本文件的問題，請洽詢 <doc@FreeBSD.org>。