FreeBSD 使用手冊
Prev | Chapter 4 軟體套件管理篇：Packages 及 Ports 機制 | Next

# 4.5 使用 Ports 管理機制

下面我們會介紹如何使用 Ports Collection 來安裝、移除軟體的基本用法。 至於其他可用的 `make` 詳細用法與環境設定，可參閱 ports(7)。

## 4.5.1 記得安裝 Ports Collection

在安裝任一 ports 之前，必須先裝上 Ports Collection —— 它主要是由 `/usr/ports` 內一堆 `Makefiles`, patches 以及一些軟體簡介檔所組成的。

在裝 FreeBSD 時，若忘了在 sysinstall 內勾選要裝 Ports Collection 的話， 沒關係，可以照下列方式來安裝 ports collection：

CVSup 方式

使用 CVSup 是安裝、更新 Ports Collection 的快速方法之一。 若想更瞭解 CVSup 用法的話，請參閱 使用 CVSup。

> Note: csup 是以 C 語言對 CVSup 軟體的重寫，在 FreeBSD 6.2 及之後版本即有附在系統內。 可以直接用系統所附的 csup 即可跳過步驟一的動作， 並將本文相關提到 `cvsup` 之處， 都改為 `csup` 即可。 此外， FreeBSD 6.2 之前的版本，則可裝 `net/csup` 或者 package 來使用 csup。

第一次跑 CVSup 之前，請先確認 `/usr/ports` 是乾淨的！ 若你已經裝了 Ports Collection ，但又自行加上其他 patch 檔，那麼 CVSup 並不會刪除你自行加上的 patch 檔，這樣可能會導致要安裝某些軟體時， 發生 patch 失敗或編譯失敗。

1. 安裝 `net/cvsup-without-gui` package：

       # pkg_add -r cvsup-without-gui

   細節用法請參閱 安裝 CVSup(Section A.5.2)。

2. 執行 `cvsup`：

       # cvsup -L 2 -h cvsup.tw.FreeBSD.org /usr/share/examples/cvsup/ports-supfile

   請把 `cvsup.tw.FreeBSD.org` 請改成離你比較近 (快)的 CVSup 主機。 這部分可以參閱完整的 CVSup mirror 站列表(Section A.5.7)。

   > Note: 若想改用自己設的 `ports-supfile`，比如說， 不想每次都得打指令來指定所使用的 CVSup 主機。

   > 1. 這種情況下，請以 `root` 權限把 `/usr/share/examples/cvsup/ports-supfile` 複製到其他位置，比如 `/root` 或者自己帳號的家目錄。

   > 2. 修改新的 `ports-supfile` 檔。

   > 3. 把 `CHANGE_THIS.FreeBSD.org` 改為離你比較近(快)的 CVSup 主機。 這部分可以參閱完整的 CVSup Mirrors (Section A.5.7) 站列表

   > 4. 然後就開始以類似下列指令跑 `cvsup`：

   >        # cvsup -L 2 /root/ports-supfile

3. 執行 cvsup(1) 之後，就會開始更新 Ports Collection。 不過這動作只是『更新』並不是『升級』，不會把已裝的軟體重新編譯、升級。

Portsnap 方式

portsnap(8) 也是更新 Ports Collection 的方式之一。 FreeBSD 6.0 起開始內建 Portsnap 機制，而較舊的系統，則可透過 `ports-mgmt/portsnap` port 來安裝：

    # pkg_add -r portsnap

Portsnap 細節功能，請參閱 Portsnap 使用篇。

1. 若 `/usr/ports` 目錄不存在的話， 就建立一下吧：

       # mkdir /usr/ports

2. 接下來，下載壓縮的 Ports Collection 定期更新檔到 `/var/db/portsnap` 目錄。 完成下載後，要斷線與否都可以。

       # portsnap fetch

3. 若是第一次跑 Portsnap 的話， 則需要先解壓到 `/usr/ports`：

       # portsnap extract

   若已有 `/usr/ports` 而且只是想更新而已， 那麼就照下面作：

       # portsnap update

Sysinstall 方式

這方式要用 sysinstall 透過安裝來源來裝 Ports Collection。 請注意：所安裝的 Ports Collection 版本只是該 release 發佈時的版本而已，而非最新。 若能上網(Internet)的話，請使用上述方式之一會比較好。

1. 以 `root` 權限執行 `sysinstall` (在 FreeBSD 5.2 之前版本則是 `/stand/sysinstall`) ，方式如下：

       # sysinstall

2. 請以方向鍵移動選擇項目，選擇 Configure，然後按 Enter 鍵。

3. 選擇 Distributions，然後按 Enter 鍵。

4. 選擇 ports，然後按 Space 鍵。

5. 選 Exit，然後按 Enter 鍵。

6. 選擇要用的安裝來源，比如：CDROM(光碟)、FTP 等方式。

7. 選 Exit，然後按 Enter 鍵。

8. 按下 X 鍵就可離開 sysinstall 程式。

## 4.5.2 Ports 的安裝方式

提到 Ports Collection，首先要先說明的是：何謂 “skeleton”。 簡單來講，port skeleton 就是讓軟體如何在 FreeBSD 順利編譯、安裝的最基本檔案組合。 每份 port skeleton 基本上會有：

- `Makefile` 檔。 這個 `Makefile` 內容有分許多部分， 是用來指定要如何編譯，以及該裝在系統的何處。

- `distinfo` 檔。 編譯該軟體所需下載的檔案、checksum(使用 md5(1) 及 sha256(1) 來檢驗檔案)都會記錄在這檔， 以確保所下載的檔案是正確無誤的。

- `files` 目錄。 這目錄放的是讓軟體正常編譯、 安裝的 patch 檔。 Patches 檔基本上是一些小檔案，並針對特定檔案來做修改， 而且是純文字檔格式， 基本上內容通常會像是 “Remove line 10(刪除第 10 行)” 或 “Change line 26 to this ...(把第 26 行改為...)” 之類的。 這些 Patches 通常也稱為 “diffs” ，因為都是由 diff(1) 程式所產生的。

  此外，本目錄也可能會放一些協助編譯該 port 的檔案。

- `pkg-descr` 檔，內容是比較詳細的軟體介紹， 通常會寫得比較多行。

- `pkg-plist` 檔，該 port 會安裝的所有檔案清單。 也是告訴系統在移除該 port 時，需要刪除哪些檔案。

有些 port 還會有其他檔案，像是 `pkg-message` 檔。 port 系統在一些情況時，會用這些檔案。 如果想知道這些檔案的更多細節用途，以及 port 一般用法，請參閱 FreeBSD Porter's Handbook。

port 內寫的是告訴系統如何編譯 source code 的相關指令， 但並不是真正的 source code。 而 source code 可以從光碟或網路(Internet)來取得， 該軟體開發者可能會把 source code 以各種格式來發佈。 通常是以 tar 以及 gzip 這兩者工具一起壓縮的檔案， 也有可能是以其他工具壓縮，或根本沒壓縮。 而軟體的 source code 無論是以哪一種壓縮檔型態，我們都稱之為 “distfile”。 下面將介紹兩種安裝 FreeBSD port 的方式。

> Note: 要安裝 port 的話，請務必切為 `root` 身份。

> Warning: 在安裝任何 port 之前，請務必確認有更新 Ports Collection 到最新版， 此外請檢閱 http://vuxml.freebsd.org/ 來檢查所要裝的 port 是否有相關安全漏洞議題需要注意的。

> portaudit 會在安裝任何 port 之前， 先自動檢查是否有相關已知的安全漏洞。這個工具在 Ports Collection 內有 (`ports-mgmt/portaudit`)。 在安裝 port 之前，可以先跑 `portaudit -F` 指令， 如此一來就會抓最新的資安漏洞資料庫回來核對。 每天的系統定期安檢會自動更新資料庫，並作安全稽核。 詳情請參閱 portaudit(1) 以及 periodic(8) 的線上說明。

Ports Collection 會假設你的網路是可正常連線的。 如果沒有的話，那麼需手動把所需的 distfile 檔複製到 `/usr/ports/distfiles` 才行。

開始操作之前，要先進入打算安裝的 port 目錄內：

    # cd /usr/ports/sysutils/lsof

一旦進入 `lsof` 目錄後，就可以看到這個 port 的 skeleton 結構。 接下來，就是編譯，也就是 “build” 這個 port。 只需簡單輸入 `make` 指令，就可輕鬆完成編譯。 完成後，應該可以看到類似下面訊息：

    # make
    >> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
    >> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/.
    ===>  Extracting for lsof-4.57
    ...
    [extraction output snipped]
    ...
    >> Checksum OK for lsof_4.57D.freebsd.tar.gz.
    ===>  Patching for lsof-4.57
    ===>  Applying FreeBSD patches for lsof-4.57
    ===>  Configuring for lsof-4.57
    ...
    [configure output snipped]
    ...
    ===>  Building for lsof-4.57
    ...
    [compilation output snipped]
    ...
    #

請注意：編譯完成後，就會回到提示列(prompt)。接下來就是安裝該 port 了，要裝的話，只需在原本的 `make` 指令後面再加上一個字即可， 那個字就是 `install`：

    # make install
    ===>  Installing for lsof-4.57
    ...
    [installation output snipped]
    ...
    ===>   Generating temporary packing list
    ===>   Compressing manual pages for lsof-4.57
    ===>   Registering installation for lsof-4.57
    ===>  SECURITY NOTE:
          This port has installed the following binaries which execute with
          increased privileges.
    #

一旦回到提示列(prompt)，就可以執行剛裝的程式了。 另外，因為 `lsof` 這程式執行時會有額外權限， 所以會出現安全警告。在編譯、安裝 port 的時候， 請留意任何出現的警告。

此外，建議刪除編譯用的工作目錄(預設是 `work`)， 這目錄內為在編譯過程中所用到的一些臨時檔案， 這些檔案不只佔硬碟空間，而且也可能會在該 port 升級新版時， 造成不必要的困擾。

    # make clean
    ===>  Cleaning for lsof-4.57
    #

> Note: 用 `make install clean` 就可以一口氣完成剛所說 `make`、`make install`、 `make clean` 這三個步驟了。

> Note: 有些 shell 會依據 `PATH` 環境變數的路徑， 把那些路徑的執行檔 cache 起來，來加速搜尋執行檔。 如果你用的是這類的 shell，那麼在裝完 port 後需要打 `rehash` 指令，才能執行新裝的執行檔，而 `rehash` 指令可以在 `tcsh` 之類的 shell 上使用，若是 `sh` 的話，則是 `hash -r`。 詳情請參閱你所使用的 shell 相關文件。

有些由所謂 third-party 所發行的 DVD-ROM 產品，像是 FreeBSD Mall 所發行的 FreeBSD Toolkit 會包括 distfiles 檔案， 這些檔案可用來搭配 Ports Collection。 把 DVD-ROM 掛載在 `/cdrom`。 若使用其他掛載點的話，要記得設定 `CD_MOUNTPTS` 環境變數為相對應的掛載點。 如此一來，光碟上若有所需的 distfiles 就會自動使用光碟的檔案。

> Note: 請注意，有少數 port 並不允許透過光碟來發佈檔案。 可能的原因有：需先填註冊單才能下載或散佈檔案，或其他原因。 如果想安裝在光碟上沒附上的 port，就需連上網路才能繼續進行安裝。

ports 系統採用 fetch(1) 來下載檔案， 它有許多可調整的環境變數，包括： `FTP_PASSIVE_MODE`、`FTP_PROXY`、 `FTP_PASSWORD`。 如果是處於有防火牆的環境， 或者需要使用 FTP/HTTP proxy，那麼就需要設定這些變數。 使用細節請參閱 fetch(3) 說明。

若無法隨時一直上網的話，那麼可以利用 `make `fetch``。 只要在 port 的最上層路徑(`/usr/ports`) 打這指令，那麼所有需要用到的檔案都會下載。 這指令也可以在下層目錄使用，例如： `/usr/ports/net`。 請注意，若該 port 有相依的 library 或者其他 port 的話， 那麼它並不會跟著一起下載其他所相依的檔案。 若想一次下載所有相依的 port 所有檔案，那麼指令參數請改用 `fetch-recursive` 而非 `fetch`。

> Note: 可以在某類別或最上層路徑打 `make` 指令來編譯所有的 port，或者以上述的 `make `fetch`` 指令來下載所有檔案。 然而，這樣是相當危險，因為有些 port 不能並存。 也有另一種情況，有些 port 可能會以相同檔名， 但是實際上卻是不同內容的檔案。

在某些罕見情況，可能需加上 `MASTER_SITES` (檔案的原始下載處)之外的下載點，以下載所需的檔案。 可以用下列指令，來更改預設的 `MASTER_SITES` 下載點：

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

上面這例子，是把 `MASTER_SITES` 改設 `ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/` 為下載點。

> Note: 有些 port 允許(或要求)您得指定編譯選項， 以啟用、停用該軟體中非必須的功能、安全選項以及其他可自訂的選項。 具有代表性的包括了 `www/mozilla`、`security/gpgme`、`mail/sylpheed-claws`。 若有這類選項時，通常在編譯時會出現相關提示訊息。

### 4.5.2.1 更改(Override)預設的 Ports 目錄

有時候，會發現到使用其他目錄作為 port、distfiles 目錄可能相當有用(甚至是必須)，可以設定 `PORTSDIR` 及 `PREFIX` 環境變數以修改預設的 port 目錄。舉例：

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

以上會在 `/usr/home/example/ports` 內進行編譯， 並把所有檔案安裝到 `/usr/local` 內。

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

則會在 `/usr/ports` 目錄內編譯， 並把所有檔案安裝到 `/usr/home/example/local` 內。

當然囉，

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

則會同時包含兩種設定(還有很多變化以致無法在本頁全部都有寫到， 但您應該已經有抓到大概概念了吧)。

此外，這些變數也以作為環境變數來設定。 請依您所使用的 shell 去參閱相關說明，以瞭解如何設定。

### 4.5.2.2 處理 `imake`

有些 port 會使用 `imake`(X Window 系統的一部份) 無法正常運用 `PREFIX` 變數， 它們會堅持把檔案都安裝到 `/usr/X11R6` 目錄。 同樣地，也有一些 Perl port 會忽略 `PREFIX` 並把檔案安裝到 Perl 目錄架構內。 讓這些 ports respect `PREFIX` 是相當困難，甚至是不可能的事。

### 4.5.2.3 重新設定 Ports 選項

在編譯某些 port 時會出現選單畫面(ncurses-based)， 可以用來選擇安裝選項。 通常裝好該 port 之後，便不太會需要重加、 移除、更改一些當初安裝的選項。 但日後若有需要的話， 也有許多方式可以調整這些選項。 其中一種方式便是切到該 port 目錄， 並打 `make` `config` 即可再次回到選項畫面去作調整。 另外還可用 `make` `showconfig` 以顯示該 port 安裝時所用的選項。 也可以用 `make` `rmconfig` 來把所有選項回到初始設定。 這些選項跟其他動作都可參閱 ports(7) 內的詳細說明。

## 4.5.3 移除已安裝的 Ports

現在您已經知道如何安裝 port，而開始想瞭解如何移除。 比如裝了一個 port 後才意識到裝錯 port 了。 在此，我們將移除前面例子所裝的那個 port (沒仔細注意的話，我們再提醒一下就是 `lsof`)。 跟移除 package 時相當類似(在 Packages section 有介紹)，都是使用 pkg_delete(1) 指令：

    # pkg_delete lsof-4.57

## 4.5.4 升級已安裝的 Ports

首先，用 pkg_version(1) 指令來列出目前 Ports Collection 中提供了那些可升級的 port 版本：

    # pkg_version -v

### 4.5.4.1 `/usr/ports/UPDATING`

每次更新完 Ports Collection 之後，請務必記得在升級 port 前， 先看看 `/usr/ports/UPDATING`， 這裡會寫升級方面的各式問題，比如：檔案格式改變、變更設定檔位置、 與舊版不相容的問題等，以及怎麼解決的完整步驟。

若 `UPDATING` 內容與你看到的其他文件有些不同 、相衝的話， 那麼請以 `UPDATING` 為準。

### 4.5.4.2 以 Portupgrade 來升級已安裝的 Ports

portupgrade 可以輕鬆升級已裝的軟體。 該工具可從 `ports-mgmt/portupgrade` port 安裝， 安裝方式就如同其他 port 一樣，用 `make `install clean`` 指令就可以了：

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

首先最好先以 `pkgdb -F` 來掃瞄已裝的 ports 資料庫是否有誤，並修正有問題的地方。 在每次做升級之前，最好定期做一下 `pkgdb -F` 動作會較為妥當。

跑 `portupgrade -a` 的話， portupgrade 會升級系統上所有已裝的過舊 ports。 若用 `-i` 則在升級每個 port 過程當中， 會要求確認相關動作是否符合所需。

    # portupgrade -ai

若只想升級某特定程式而非全部，那麼可以用 `portupgrade `pkgname`` 來做指定。 若想要 portupgrade 優先升級某 port 所相依的相關套件，則請用 `-R` 參數即可。

    # portupgrade -R firefox

若要用 package 而非 port 來安裝，則需指定 `-P` 才可以。 若有指定這選項，則 portupgrade 會搜尋 `PKG_PATH` 變數所指定的本機目錄， 若找不到則透過網路來下載安裝。 若本機跟網路都沒有可用的 package 的話，則 portupgrade 會使用 port 方式安裝。 若不想如此又變成使用 port 方式安裝，則用 `-PP` 即可強制避免使用 port 方式安裝。

    # portupgrade -PP gnome2

若只想下載 distfiles(或者若指定 `-P` 的話，則是 package)而不想編譯或安裝檔案，可以使用 `-F`。 詳情請參閱 portupgrade(1) 的說明。

### 4.5.4.3 以 Portmanager 來升級已安裝的 Ports

Portmanager 也可以用來輕鬆升級已裝的軟體。 該工具可從 `ports-mgmt/portmanager` port 安裝：

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

所有已裝的軟體，都可以輕鬆用類似下列指令來升級：

    # portmanager -u

此外，使用參數可以改為 `-ui`，如此一來 Portmanager 在升級一些有特殊選項的軟體時 ，就會詢問該如何升級。 Portmanager 也可以用來裝新 port。與以往常用的 `make install clean` 指令不同之處在於： 它會先升級你要裝的 port 所相依的所有 ports，然後才開始編譯、 安裝要裝的 port。

    # portmanager x11/gnome2

若要裝的 port 之軟體相依關係有問題時，也可以用 Portmanager 使它們重歸正軌。 而 Portmanager 解決相依問題完畢之後，該 port 也會重新編譯，以因應正確的相依關係。

    # portmanager graphics/gimp -f

其餘運用法門，請參閱 portmanager(1) 說明。

## 4.5.5 Ports 與硬碟空間

因為使用 Ports Collection 遲早可能會用光硬碟空間， 所以在裝完軟體後，記得要以 `make `clean`` 指令來清除臨時的 `work` 目錄。 此外，可以用下列指令來清除整個 Ports Collection 內的臨時目錄：

    # portsclean -C

ports 用久了，您可能會在 `distfiles` 目錄內會累積著許多的原始碼檔案。 可以手動刪除這些檔案， 或者用下列指令來清除所有 port 都不使用的舊檔：

    # portsclean -D

或者要清除所有已裝的 port 都不再使用的舊檔：

    # portsclean -DD

> Note: `portsclean` 這工具乃是 portupgrade 套件的一部分。

不要忘了移除那些已經安裝，但不再需要用到的 ports。 有個 `ports-mgmt/pkg_cutleaves` port，正是可自動完成這功能的好工具。

Prev | Home | Next
使用 Packages 管理機制 | Up | 安裝之後，有什麼後續注意事項嗎？

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

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