4.5. 使用 Ports 套件集

Ports 套件集是指一系列儲存在 /usr/portsMakefiles、修補及描述檔,這一系列檔案用來編譯與安裝在 FreeBSD 上的應用程式。在使用 Port 安裝應用程式前,必須先安裝 Ports 套件集,若未在安裝 FreeBSD 的過程式中安裝,可使用下列其中一種方法來安裝:

過程 4.1. Portsnap 方法

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

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

    # portsnap fetch
  2. 當第一次執行 Portsnap 時,要先解壓縮快照到 /usr/ports

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

    # portsnap fetch
    # portsnap update

    當使用 fetch 時也可同時執行 extractupdate 如:

    # portsnap fetch update
過程 4.2. Subversion 方法

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

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

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

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

    # pkg install subversion
  2. 取出 Ports 樹的複本:

    # svn checkout https://svn.FreeBSD.org/ports/head /usr/ports
  3. 若需要,在第一次 Subversion 取出後可使用以下指令更新 /usr/ports

    # svn update /usr/ports

Ports 套件集會安裝一系列代表軟體分類的目錄,每個分類底下的子目錄代表每隻應用程式。 這些子目錄又稱做 Ports Skeleton,裡面檔案是用來告訴 FreeBSD 如何編譯與安裝該程式,每個 Port Skeleton 會含有以下檔案及目錄:

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

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

4.5.1. 安裝 Ports

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

警告:

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

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

要編譯並安裝 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. 自訂 Ports 安裝

部份 Ports 提供編譯選項,可用來開啟或關閉應用程式中的元件、安全選項、或其他允許自訂的項目。這類的應用程式例子包括 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 選項都已定義,直到 Ports 的選項畫面不會再出現,來確定所有相依的選項都已經設定。

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

Ports 系統使用 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 有任何的相依,在分類或 Ports 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

也可使用 WRKDIRPREFIXPREFIX 變數來覆蓋預設的工作及目標目錄。例如:

# 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. 移除已安裝的 Ports

安裝的 Ports 可以使用 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. 升級 Ports

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

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

# pkg version -l "<"

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

# pkg_version -l "<"

重要:

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

要執行實際的升級,可使用 PortmasterPortupgrade

4.5.3.1. 使用 Portmaster 升級 Ports

ports-mgmt/portmaster 是可用來升級已安裝 Port 的小巧工具,它可不需要相依其他 Ports 或資料庫便可在 FreeBSD 使用,要使用 Port 安裝此工具可:

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

Portmaster 將 Ports 定義成四種類型:

  • 根 Port:沒有相依且也不被任何其他 Ports 相依。

  • 主幹 Port:沒有相依,但被其他 Ports 相依。

  • 分支 Port:有相依,且其被其他 Ports 相依。

  • 枝 Port:有相依,但沒有被其他 Ports 相依。

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

# 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 來升級並重新編譯所有 Ports:

# portmaster -af

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

# portmaster shells/bash

4.5.3.2. 使用 Portupgrade 升級 Ports

另一個可以用來升級 Ports 的工具是 Portupgrade,可在 ports-mgmt/portupgrade 取得套件或 Ports,此工具會安裝一套可以用來管理 Ports 的應用程式,但是它需要相依 Ruby。要安裝該 Port:

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

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

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

# portupgrade -ai

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

# portupgrade -R firefox

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

# portupgrade -PP gnome3

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

4.5.4. Ports 與磁碟空間

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

# portsclean -C

除此之外,許多過時的原始碼發行檔案會儲存在 /usr/ports/distfiles。若有安裝 Portupgrade,此指令將會刪除所有不再被任何 Ports 所引用的 distfiles:

# portsclean -D

要使用 Portupgrade 來移除所有未被任何安裝在系統上的 Port 所引用的 distfiles:

# portsclean -DD

若有安裝 Portmaster,則可使用:

# portmaster --clean-distfiles

預設這個指令會互動的方式詢問使用者確認是否要刪除 distfile。

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

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

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

關於本文件的問題,請洽詢 <doc@FreeBSD.org>。