FreeBSD Ports 套件用于從源代碼安裝,在 FreeBSD 中安裝,同時可以用于從本地介質(zhì), 或從網(wǎng)上直接安裝您喜歡的應用程序的最新版本。以下是關(guān)于如何安裝和管理 Ports 的簡要指南。
一、Ports套件優(yōu)勢
1、定制編譯選項:使用 Ports 安裝軟件時,用戶可以根據(jù)特定的硬件架構(gòu)(如 Pentium 4 或 AMD Athlon)來優(yōu)化編譯選項。
2、靈活性:用戶可以自定義配置選項,生成符合個人需求的軟件包。
3、源代碼可用性:某些軟件的許可條款要求提供源代碼,或用戶希望自行審查源代碼以確保安全性。
4、打補丁需求:需要對軟件進行修補時,源代碼是必需的。
5、直接接觸源代碼:許多用戶喜歡與源代碼互動,進行閱讀和修改。
二、使用Ports Collection
在使用 Ports 之前,需要獲得 Ports Collection,這實際上是 “/usr/ports” 目錄下的一系列 Makefile、補丁和描述文件。
1、獲得Ports Collection
在安裝 FreeBSD 時,”sysinstall” 會詢問是否要安裝 Ports Collection。如果選擇“否”,可以使用以下指令手動安裝:
2、使用CVSup方法
CVSup 是一種更新 Ports 套件的有效方式。在 FreeBSD 中,CVSup 的實現(xiàn)為 “csup”。
- 確認 “/usr/ports” 為空:首次運行 “csup” 前,請確保該目錄為空,以避免舊文件的干擾;
- 運行 csup:
csup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile
- 將 “cvsup.FreeBSD.org” 替換為離較近的服務器。
- 自定義 ports-supfile:若希望使用自己的配置文件,可以將 “/usr/share/examples/cvsup/ports-supfile” 復制到主目錄,并編輯其中的服務器地址,然后運行:
csup -L 2 /root/ports-supfile
3、使用Portsnap方法
Portsnap 提供另一種獲取 Ports 套件的方法。可使用以下命令:
獲取快照:
portsnap fetch
首次提取快照:
portsnap extract
更新已安裝的 Ports:
portsnap update
4、使用Sysinstall方法
這種方法通過安裝介質(zhì)安裝 Ports 套件,但通常是較舊版本。如果有 Internet 連接,建議使用上述方法之一。
運行 sysinstall:
sysinstall
- 配置選擇:依次選擇“Configure” -> “Distributions”,然后選中“ports”,按空格確認;
- 選擇安裝介質(zhì):選擇 CDROM、FTP 等安裝來源,完成后退出;
- 按 “X” 退出 “sysinstall”。
三、安裝Ports
在討論 Ports Collection 時,首先需要了解什么是 “skeleton”。簡單來說,port skeleton 是在 FreeBSD 上編譯和安裝程序所需的最小文件組合。每個 port skeleton 包含:
1、Makefile:此文件包含多個部分,指明應用程序的編譯方式及安裝位置。
2、distinfo 文件:該文件包含用于校驗下載文件完整性的哈希信息(使用 sha256(1)),以確保下載過程中文件未被損壞。
3、files 目錄:該目錄包含在 FreeBSD 系統(tǒng)上編譯和安裝程序所需的補丁。補丁通常是小文件,指示對特定文件的修改,例如 “刪除第 10 行” 或 “將第 26 行改為…”。這些補丁也稱為 “diffs”,由 diff(1) 程序生成。此外,該目錄還可能包含編譯 port 所需的其他文件。
4、pkg-descr 文件:提供有關(guān)軟件的多行詳細描述。
5、pkg-plist 文件:列出了即將安裝的所有文件,告知 ports 系統(tǒng)在卸載時需要刪除哪些文件。
有些 ports 可能還包括其他文件,例如 pkg-message,這些文件在特定情況下被 ports 系統(tǒng)使用。
port 中包含了編譯源代碼的指令,但不包括實際的源代碼??梢酝ㄟ^網(wǎng)絡或 CD-ROM 獲取源代碼。源代碼可能由開發(fā)者以各種格式發(fā)布,通常是經(jīng)過 tar 和 gzip 壓縮的文件,或者采用其他工具壓縮或未壓縮的文件。ports 中標識程序源代碼的文件稱為 “distfile”。安裝 FreeBSD port 的方法不僅限于上述兩種。
必須以 root 用戶身份登錄后才能安裝 ports。在安裝任何 port 之前,確保已更新到最新的 Ports Collection,并檢查 FreeBSD VuXML(http://vuxml.freebsd.org/) 中是否有與該 port 相關(guān)的安全問題。
在安裝應用程序之前,可以使用 “portaudit” 自動檢查是否存在已知的安全問題。此工具也可以在 Ports Collection (ports-mgmt/portaudit) 中找到。在安裝新的 port 之前,建議運行 “portaudit -F” 來獲取最新的漏洞數(shù)據(jù)庫。在每天的系統(tǒng)安全檢查中,數(shù)據(jù)庫會自動更新,并在此之后執(zhí)行安全審計。
Ports 套件假定有可用的 Internet 連接。如果沒有,需要手動將 distfile 放入 “/usr/ports/distfiles” 目錄。
要開始安裝,首先進入要安裝 port 的目錄:
cd /usr/ports/sysutils/lsof
進入 lsof 目錄后,將看到該 port 的結(jié)構(gòu)。接下來,只需在命令行輸入 “make” 命令以編譯該 port:
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] ...
一旦編譯完成,將返回到命令行。接下來要安裝 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.
返回到提示符后,可以運行剛安裝的程序。由于 lsof 是一個具有特殊權(quán)限的程序,系統(tǒng)會顯示安全警告。在編譯和安裝 ports 時,請注意任何出現(xiàn)的警告。
最后,刪除工作目錄是個好主意,因為其中包含了編譯過程中使用的臨時文件。這些文件可能占用寶貴的磁盤空間,并可能在升級新版本時造成麻煩。
make clean
使用 “make install clean” 命令可以一步完成 “make”、”make install” 和 “make clean” 的所有步驟。
一些 Shell 會緩存環(huán)境變量 PATH 中指定目錄下的可執(zhí)行文件,以加速查找速度。如果使用的是這類 Shell,在安裝 port 之后可能需要執(zhí)行 “rehash” 命令,才能運行新安裝的命令。這個命令適用于類似 “tcsh” 的 Shell;對于類似 “sh” 的 Shell,對應的命令是 “hash -r”。
某些第三方 DVD-ROM 產(chǎn)品(如 FreeBSD Mall 的 FreeBSD Toolkit)包含 distfiles。這些文件可以與 Ports 套件配合使用。將 DVD-ROM 掛載到 “/cdrom”。如果使用不同的掛載點,則應設置 “make” 變量 “CD_MOUNTPTS”。如果光盤上有所需的 distfiles,將會自動使用。
請注意,少數(shù) ports 并不允許通過 CD-ROM 進行分發(fā)。這可能是因為在下載之前需要填寫注冊表,或者不允許重新發(fā)布,或有其他原因。如果希望安裝在 CD-ROM 上沒有的 port,則需要在線操作。
Ports 系統(tǒng)使用 “fetch(1)” 下載文件,具有多個可設置的環(huán)境變量,包括 “FTP_PASSIVE_MODE”、”FTP_PROXY” 和 “FTP_PASSWORD”。如果在防火墻后面,或者使用 FTP/HTTP 代理,可能需要設置這些變量。
當用戶無法持續(xù)連接網(wǎng)絡時,可以使用 “make fetch”。只需在頂層目錄(”/usr/ports”)下運行該命令,所有需要的文件將被下載。此命令也可以在下級類別目錄中使用,例如 “/usr/ports/net”。注意,如果某個 port 有依賴庫或其他 port,它將不會下載這些依賴 port 的 distfile 文件。如果希望獲取所有依賴 port 的所有 distfile,請使用 “fetch-recursive” 命令替代 “fetch” 命令。
可以在一個類別或頂級目錄編譯所有 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 允許(或甚至要求)指定編譯選項,以啟用/禁用應用程序中的非必需功能、某些安全選項以及其他可定制內(nèi)容。典型的例子包括 “www/mozilla”、”security/gpgme” 和 “mail/sylpheed-claws”。如果存在這樣的選項,通常會在編譯時給出提示。
四、改變默認的Ports目錄
有時,使用不同的工作臨時目錄和目標目錄可能非常有用(甚至是必要的)??梢允褂?“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
這條命令將包含兩種設置(雖然在這一頁無法完全展開,但應該已對此有所了解)。
此外這些變量也可以通過環(huán)境變量進行設置。
某些 port 使用 imake(這是 X Window 系統(tǒng)的一部分),可能無法正常使用 PREFIX。它們會強制將文件安裝到 “/usr/X11R6” 下。同樣,一些 Perl port 也會忽視 PREFIX,直接安裝到 Perl 的目錄中。讓這些 port 尊重 PREFIX 有時困難,甚至是不可能的。
在編譯某些 ports 時,可能會遇到基于 ncurses 的菜單,以選擇編譯選項。用戶通常希望在某個 port 安裝后,能再次訪問菜單以添加、刪除或修改選項。實際上,有幾種方法可以實現(xiàn)這一點:
- 進入該 port 的目錄,輸入 “make config”,將再次顯示菜單及已選擇的項目;
- 使用 “make showconfig” 命令,顯示所有配置選項;
- 執(zhí)行 “make rmconfig”,刪除所有已選擇的項目。
五、卸載Ports
在錯誤地安裝某個 port 之后,可以使用 “pkg_delete” 命令卸載,例如:
pkg_delete lsof-4.57
六、升級Ports
首先,使用 “pkg_version” 命令列出 Ports Collection 中提供更新版本的 ports:
pkg_version -v
七、查看 /usr/ports/UPDATING
在更新 Ports 套件后,務必查看 “/usr/ports/UPDATING” 文件。該文件中描述了用戶在升級時需注意的問題,以及可能需要的操作。這可能包括文件格式更改、配置文件位置變動和與先前版本的兼容性等。如果 UPDATING 文件的內(nèi)容與本書中介紹的不同,請以 UPDATING 為準。
八、使用Portupgrade更新Ports
“portupgrade” 工具旨在簡化已安裝 port 的升級。通過 “ports-mgmt/portupgrade” port 安裝它:
cd /usr/ports/ports-mgmt/portupgrade make install clean
使用 “pkgdb -F” 命令掃描已安裝 port 的列表,并修正不一致之處。在每次升級前定期執(zhí)行此命令是個好主意。
運行 “portupgrade -a” 將升級系統(tǒng)中所有過時的 ports。若希望在每次升級時得到確認,需指定 “-i” 參數(shù):
portupgrade -ai
要升級特定應用程序,使用 “portupgrade pkgname”。若需優(yōu)先升級指定應用程序,使用 “-R” 參數(shù):
portupgrade -R firefox
若希望使用預編譯的 package 而非 ports 進行安裝,需指定 “-P”。此選項會使 “portupgrade” 在本地目錄和遠程站點中搜索預編譯包,如果都未找到,則使用 ports。若要禁止使用 ports,可以指定 “-PP”:
portupgrade -PP gnome2
若只想下載 distfiles(或在指定了 “-P” 的情況下下載 packages),而不進行構(gòu)建或安裝,可以使用 “-F”。
九、使用Portmanager升級Ports
“Portmanager” 是另一個用于簡化已安裝 port 升級的工具。可以通過 “ports-mgmt/portmanager” 安裝:
cd /usr/ports/ports-mgmt/portmanager make install clean
可以用以下命令升級所有已安裝的 port:
portmanager -u
若希望在每步操作前都得到提示,使用 “-ui” 參數(shù)。”Portmanager” 也可用于安裝新的 ports,它在編譯和安裝所選 port 前,會升級所有依賴包:
portmanager x11/gnome2
若關(guān)于所選 port 的依賴有任何問題,可以用 “Portmanager” 以正確的順序重新構(gòu)建它們:
portmanager graphics/gimp -f
十、使用Portmaster升級Ports
“Portmaster” 是另一個用于升級已安裝 ports 的工具。它設計成盡可能利用“基本”系統(tǒng)中的工具(不依賴其他 ports)以及 “/var/db/pkg/” 中的信息來檢測需要升級的 ports??梢栽?“ports-mgmt/portmaster” 找到它:
cd /usr/ports/ports-mgmt/portmaster make install clean
“Portmaster” 將 ports 分為四類:
- Root ports:不依賴其他 ports,也不被依賴
- Trunk ports:不依賴其他 ports,但被其他 ports 依賴
- Branch ports:依賴于其他 ports,同時也被依賴
- Leaf ports:依賴于其他 ports,但不被依賴
使用 “-L” 選項列出所有已安裝的 ports 并查找存在更新的 ports:
portmaster -L
此命令將升級所有已安裝的 ports:
portmaster -a
“Portmaster” 默認在刪除現(xiàn)有 port 前會備份。如果新的版本成功安裝,”Portmaster” 將刪除備份。若使用 “-b”,則不自動刪除備份。加上 “-i” 選項后,”Portmaster” 將在升級每個 port 前提示確認。
十一、Ports和磁盤空間
使用 Ports 套件會占用磁盤空間。在通過 ports 編譯和安裝軟件后,應當記得清理臨時的工作目錄,可以使用以下命令:
make clean
也可以使用以下命令清理整個 Ports 套件:
portsclean -C
隨著時間的推移,可能會在 “distfiles” 目錄中積累大量源代碼文件??梢允謩觿h除這些文件,或者使用以下命令刪除所有未被任何 port 引用的文件:
portsclean -D
此外還可以使用以下命令刪除當前安裝的 port 中未使用的源代碼包文件:
portsclean -DD
這個 “portsclean” 工具是 “portupgrade” 套件的一部分。
不要忘記刪除那些已經(jīng)安裝但不再使用的 ports。一個方便的工具是 “ports-mgmt/pkg_cutleaves”,可以自動完成這項工作。