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)。

### 警告:

Before compiling any port, be sure to update the Ports Collection as described in the previous section. Since the installation of any third-party software can introduce security vulnerabilities, it is recommended to first check https://vuxml.freebsd.org/ for known security issues related to the port. Alternately, run `pkg audit -F` before installing a new port. This command can be configured to automatically perform a security audit and an update of the vulnerability database during the daily security system check. For more information, refer to pkg-audit(8) and 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. Tools to Upgrade and Manage Ports

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>。