5.5. 使用 Ports 管理機制

The Ports Collection is a set of Makefiles, patches, and description files stored in /usr/ports. This set of files is used to compile and install applications on FreeBSD. Before an application can be compiled using a port, the Ports Collection must first be installed. If it was not installed during the installation of FreeBSD, use one of the following methods to install it:

過程 5.1. Portsnap 方式

The base system of FreeBSD includes Portsnap. This is a fast and user-friendly tool for retrieving the Ports Collection and is the recommended choice for most users. This utility connects to a FreeBSD site, verifies the secure key, and downloads a new copy of the Ports Collection. The key is used to verify the integrity of all downloaded files.

  1. To download a compressed snapshot of the Ports Collection into /var/db/portsnap:

    # portsnap fetch
  2. 若是第一次跑 Portsnap 的話, 則需要先解壓到 /usr/ports

    # portsnap extract
  3. After the first use of Portsnap has been completed as shown above, /usr/ports can be updated as needed by running:

    # portsnap fetch
    # portsnap update

    When using fetch, the extract or the update operation may be run consecutively, like so:

    # portsnap fetch update
過程 5.2. Subversion Method

If more control over the ports tree is needed or if local changes need to be maintained, Subversion can be used to obtain the Ports Collection. Refer to the Subversion Primer for a detailed description of Subversion.

  1. Subversion must be installed before it can be used to check out the ports tree. If a copy of the ports tree is already present, install Subversion like this:

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

    If the ports tree is not available, or pkg is being used to manage packages, Subversion can be installed as a package:

    # pkg install subversion
  2. Check out a copy of the ports tree. For better performance, replace svn0.us-east.FreeBSD.org with a Subversion mirror close to your geographic location:

    # svn checkout https://svn0.us-east.FreeBSD.org/ports/head /usr/ports
  3. As needed, update /usr/ports after the initial Subversion checkout:

    # svn update /usr/ports

The Ports Collection installs a series of directories representing software categories with each category having a subdirectory for each application. Each subdirectory, also referred to as a ports skeleton, contains a set of files that tell FreeBSD how to compile and install that program. Each port skeleton includes these files and directories:

Some ports include pkg-message or other files to handle special situations. For more details on these files, and on ports in general, refer to the FreeBSD Porter's Handbook.

The port does not include the actual source code, also known as a distfile. The extract portion of building a port will automatically save the downloaded source to /usr/ports/distfiles.

5.5.1. Ports 的安裝方式

下面我們會介紹如何使用 Ports Collection 來安裝、移除軟體的基本用法。 至於其他可用的 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 http://vuxml.freebsd.org/ for known security issues related to the port. Alternately, if ports-mgmt/portaudit is installed, run portaudit -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 the manual page for portaudit and periodic(8).

提到 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 的方式。

注意:

要安裝 port 的話,請務必切為 root 身份。

警告:

在安裝任何 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
#

注意:

make install clean 就可以一口氣完成剛所說 makemake installmake clean 這三個步驟了。

注意:

有些 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 就會自動使用光碟的檔案。

注意:

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

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

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

注意:

可以在某類別或最上層路徑打 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/ 為下載點。

注意:

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

5.5.1.1. 更改(Override)預設的 Ports 目錄

有時候,會發現到使用其他目錄作為 port、distfiles 目錄可能相當有用(甚至是必須),可以設定 PORTSDIRPREFIX 環境變數以修改預設的 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 去參閱相關說明,以瞭解如何設定。

5.5.1.2. 處理 imake

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

5.5.1.3. 重新設定 Ports 選項

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

5.5.2. 移除已安裝的 Ports

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

# pkg_delete lsof-4.57

5.5.3. 升級已安裝的 Ports

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

# pkg_version -v

5.5.3.1. /usr/ports/UPDATING

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

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

5.5.3.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) 的說明。

5.5.3.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) 說明。

5.5.4. Ports 與硬碟空間

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

# portsclean -C

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

# portsclean -D

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

# portsclean -DD

注意:

portsclean 這工具乃是 portupgrade 套件的一部分。

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

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

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

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