Packages and Ports
概述
FreeBSD 將許多系統(tǒng)工具捆綁作為基本系統(tǒng)的一部分。另外,F(xiàn)reeBSD 提供了兩種補(bǔ)充的技術(shù)來(lái)安裝第三方軟件:FreeBSD Ports Collection,從源代碼安裝; packages,從預(yù)編譯的二進(jìn)制版本安裝。這兩種方法都可以用于從本地介質(zhì), 或從網(wǎng)上直接安裝您喜歡的應(yīng)用程序的最新版本。
UNIX?系統(tǒng)典型的安裝第三方軟件的步驟包括:
1、下載這個(gè)軟件,軟件的發(fā)布可能是源代碼格式,或是一個(gè)二進(jìn)制包。
2、從默認(rèn)的發(fā)行格式解壓軟件,通常是用compress, gzip,或bzip2壓縮過(guò)tar包。
3、閱讀相關(guān)文檔,了解如何安裝。 (通常文件名是INSTALL或README, 或在doc/ 目錄下的一些文檔)
4、如果軟件是以源代碼形式發(fā)布的,那就需要編譯它。可能需要編輯一個(gè) Makefile文件, 或運(yùn)行 configure腳本。
5、測(cè)試和安裝軟件。
FreeBSD的package是包含了一個(gè)應(yīng)用的所有命令、全部的配置文件和文檔的預(yù)編譯好的副本 。package可以使用pkg命令來(lái)操作。
FreeBSD的port是一個(gè)可以自動(dòng)從源代碼編譯成應(yīng)用程序的文件集合。這些文件包含了自動(dòng)下載、解開、打補(bǔ)丁、編譯、安裝應(yīng)用的所有必要的信息。
pots系統(tǒng)也可以用于生成被包管理命令維護(hù)的packages。
packages 和 ports 都可以自動(dòng)處理依賴庫(kù)。
這兩種技術(shù)是很相似,packages 和 ports有各自的強(qiáng)項(xiàng),根據(jù)需要選擇哪種方法安裝一個(gè)特定的軟件。
Package優(yōu)點(diǎn)
- 一個(gè)壓縮的 package 通常要比一個(gè)壓縮的包含源代碼的應(yīng)用程序小得多。
- package 不需要進(jìn)行額外的編譯時(shí)間。 對(duì)于大型應(yīng)用程序如 Mozilla, KDE 或 GNOME 來(lái)說(shuō)這顯得尤為重要, 特別是在您的系統(tǒng)資源比較差的情況下。
- package不需要理解任何在FreeBSD上編譯軟件的詳細(xì)過(guò)程。
Port優(yōu)點(diǎn):
- package 在編譯時(shí)通常使用比較保守的選項(xiàng),這是為了保證它們能夠運(yùn)行在大多數(shù)的系統(tǒng)上。通過(guò)從 port 安裝,可以細(xì)微調(diào)整編譯選項(xiàng)來(lái)產(chǎn)生適合于處理器的代碼。
- 一些軟件包已經(jīng)把與它們相關(guān)的能做和不能做的事情的選項(xiàng)都編譯進(jìn)去了。從 port 中安裝時(shí),不一定要接受默認(rèn)的選項(xiàng), 可以自己來(lái)設(shè)置。
- 一些軟件的許可條件禁止采用二進(jìn)制形式發(fā)行。 它們必須以源代碼形式發(fā)布,終端用戶編譯。
- 一些人不信任二進(jìn)制發(fā)行形式。 至少有了源代碼, (理論上) 可以親自閱讀它,尋找潛在的問(wèn)題。
- 如果要自己對(duì)軟件打補(bǔ)丁,您就需要有源代碼。
查找軟件
FreeBSD中可用的應(yīng)用程序正在不斷地增長(zhǎng)著。有很多方法可以查找需要安裝的軟件。
- FreeBSD站點(diǎn)上維護(hù)著一個(gè)最新的的可搜索當(dāng)前所有可用應(yīng)用程序的列表,在 http://www.FreeBSD.org/ports/。ports可以通過(guò)程序名稱或軟件分類來(lái)搜索。
- Dan Langille維護(hù)著網(wǎng)站 FreshPorts,http://www.FreshPorts.org/。 FreshPort提供綜合搜索工具,追蹤ports中應(yīng)用的變化。注冊(cè)用戶可以創(chuàng)建自定義檢視列表,當(dāng)有任何程序被升級(jí)時(shí),他們就會(huì)發(fā) email 提醒您。
- 如果不確定想要的應(yīng)用程序的名字,可以嘗試在 SourceForge.net or GitHub.com這些網(wǎng)站中查找,然后回到 FreeBSD site主站查看應(yīng)用是否被port進(jìn)去了( be ported)。
- 查找二進(jìn)制包倉(cāng)庫(kù)(binary package repository)
pkg search xxx
pkg search -o xxx - Ports集(Ports Collection)安裝后,有幾種方法可以查詢本地ports樹。查找一個(gè)port屬于哪個(gè)category:
whereis lsof
lsof: /usr/ports/sysutils/lsof
echo /usr/ports/*/*lsof*
/usr/ports/sysutils/lsof - 另外一個(gè)查找軟件的方法是用Ports Collection內(nèi)嵌的搜索機(jī)制。要使用這個(gè)搜索機(jī)制, 需要先cd到/usr/ports目錄下面,然后運(yùn)行
make search name=program-name
,program-name是要查找的軟件名。例如:
# cd /usr/ports
# make search name=lsof
Port: lsof-4.88.d,8
Path: /usr/ports/sysutils/lsof
Info: Lists information about open files (similar to fstat(1))
Maint: ler@lerctr.org
Index: sysutils
B-deps:
R-deps:
注意:內(nèi)嵌搜索機(jī)制使用索引信息文件. 如果顯示消息:the INDEX is required, 執(zhí)行
make fetchindex
下載最新的索引文件.
顯示精簡(jiǎn)信息,使用quicksearch特性:
# cd /usr/ports
# make quicksearch name=lsof
Port: lsof-4.88.d,8
Path: /usr/ports/sysutils/lsof
Info: Lists information about open files (similar to fstat(1))
為了更深入的搜索,還可以用 make search key=string
, string就是想搜索的部分內(nèi)容。 它將搜索port的名字、 注釋, 描述和從屬關(guān)系, 如果不知道您想搜索的程序名字, 可以利用它搜索一些關(guān)鍵主題來(lái)找到需要的。
當(dāng)使用search或quicksearch時(shí),搜索的關(guān)鍵字不區(qū)分大小寫。
使用pkg進(jìn)行二進(jìn)制包管理
pkg是FreeBSD傳統(tǒng)的包管理工具的下一代替代者。它提供了很多特性,使處理二進(jìn)制包更快,更簡(jiǎn)單。
pkg不是替代像 ports-mgmt/portmaster 或 ports-mgmt/portupgrade這樣的port管理工具,這些工具既可以使用二進(jìn)制方式又可以通過(guò)ports集方式安裝第三方軟件,而pkg只安裝二進(jìn)制包。
安裝pkg
從FreeBSD 8.4之后的版本包括了一個(gè)用于下載安裝pkg(包括使用手冊(cè))的引導(dǎo)程序。(bootstrap utility)
- To bootstrap the system, run:
/usr/sbin/pkg
pkg常用命令
- 查看已安裝軟件包信息
pkg info
- 安裝和移除軟件包
pkg install
和pkg delete
- 更新已安裝軟件包
pkg version
pkg upgrade
- 審核已安裝軟件包
pkg audit -F
- 自動(dòng)移除孤立依賴
pkg autoremove
- 移除陳舊package包
pkg clean
pkg默認(rèn)在一個(gè)緩存目錄(PKG_CACHEDIR)存儲(chǔ)二進(jìn)制包,當(dāng)使用pkg upgrade更新包時(shí),舊的版本不會(huì)自動(dòng)移除。
使用Ports Collection
Ports Collection ── 本質(zhì)上是 /usr/ports 目錄下的一堆 Makefile、 Patches(補(bǔ)丁)和描述文件,這些文件用于在FreeBSD系統(tǒng)中編譯和安裝應(yīng)用。
安裝Ports Collection
- Portsnap Method
FreeBSD的base system包含Portsnap. 這是一個(gè)獲得Ports Collection的快速易用的工具也是對(duì)大多數(shù)用戶推薦的方法。
1、下載壓縮的 Ports 套件快照到 /var/db/portsnap:
portsnap fetch
2、如果是首次運(yùn)行 Portsnap,則需要將快照釋放到 /usr/ports:
portsnap extract
3、更新 /usr/ports:
portsnap fetch
portsnap update
當(dāng)使用fetch選項(xiàng)時(shí),extract、update選項(xiàng)可以連續(xù)運(yùn)行:
portsnap fetch update
- Subversion Method
如果需要更多的控制ports tree或者本地更改需要維護(hù), Subversion可以用于獲得Ports Collection。
1、在檢測(cè)ports tree之前Subversion必須安裝。如果ports tree已經(jīng)存在:
cd /usr/ports/devel/subversion
make install clean
如果ports tree不可用:
pkg install subversion
2、Check out a copy of the ports tree. 使用離你最近的Subversion mirror替換svn0.us-east.FreeBSD.org
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
Port Skeleton
port skeleton 是讓一個(gè)程序在 FreeBSD 上簡(jiǎn)潔地編譯并安裝的所需文件的最小組合。 每個(gè) port skeleton 包含:
Makefile: Makefile 包括好幾個(gè)部分, 指出應(yīng)用程序是如何編譯以及將被安裝在系統(tǒng)的哪些地方。
distinfo: 這個(gè)文件包括這些信息:這些文件用來(lái)對(duì)下載后的文件校驗(yàn)和進(jìn)行檢查 ,來(lái)確保在下載過(guò)程中文件沒(méi)有被破壞。
files/: 這個(gè)目錄包括在FreeBSD系統(tǒng)上編譯和安裝程序需要用到的補(bǔ)丁。這些補(bǔ)丁基本上都是些小文件,指出特定文件作了哪些修正。它們都是純文本的的格式,基本上是這樣的 “刪除第 10 行” 或 “將第 26 行改為這樣 ...”,補(bǔ)丁文件也被稱作 “diffs”,他們由diff程序生成。
這個(gè)目錄也包含了在編譯 port 時(shí)要用到的其它文件。
pkg-descr:這是一個(gè)提供更多細(xì)節(jié),有軟件的多行描述。
pkg-plist: 這是即將被安裝的所有文件的列表。它告訴 ports 系統(tǒng)在卸載時(shí)需要?jiǎng)h除哪些文件。
port里面包含著如何編譯源代碼的指令,但不包含真正的源代碼。ports中這個(gè)程序源代碼標(biāo)示文件叫 “distfile”,構(gòu)建port的過(guò)程中會(huì)自動(dòng)存儲(chǔ)已經(jīng)下載的源碼到/usr/ports/distfiles.
安裝Ports
使用Ports Collection編譯安裝port,需要連接網(wǎng)絡(luò)和超級(jí)用戶特權(quán)。如果沒(méi)有網(wǎng)絡(luò),則需要將 distfile 手工放到 /usr/ports/distfiles 中。
- 首先進(jìn)入要安裝 port 的目錄:
cd /usr/ports/sysutils/lsof
make install
make clean
編譯port的時(shí)候可以使用
make install clean
節(jié)省步驟。
移除已安裝的Ports
已經(jīng)安裝的ports可以使用pkg delete
命令卸載。
也可以在ports目錄,使用make deinstall
命令
升級(jí)Ports
列出可以更新版本的ports:
pkg version -l "<"
Important:
Before attempting an upgrade, read /usr/ports/UPDATING from the top of the file to the date closest to the last time ports were upgraded or the system was installed. This file describes various issues and additional steps users may encounter and need to perform when updating a port, including such things as file format changes, changes in locations of configuration files, or any incompatibilities with previous versions. Make note of any instructions which match any of the ports that need upgrading and follow these instructions when performing the upgrade.
執(zhí)行Ports升級(jí),使用Portmaster或者Portupgrade.
- Upgrading Ports Using Portmaster
ports-mgmt/portmasterpackage(或稱port),是推薦的升級(jí)已安裝Ports的工具,它被設(shè)計(jì)為隨FreeBSD系統(tǒng)使用而不需要依賴其他ports的工具。它用/var/db/pkg/中的信息決定哪些ports需要升級(jí)。
cd /usr/ports/ports-mgmt/portmaster
make install clean
Portmaster 把 ports 分成4類:
Root ports (不依賴其他的 ports,也不被依賴)
Trunk ports (不依賴其他的 ports,但是被其他的 ports 依賴)
Branch ports (依賴于其他的 ports,同時(shí)也被依賴)
Leaf ports (依賴于其他的 ports,但不被依賴)
可以使用 -L 選項(xiàng)列出所有已安裝的 ports 和查找存在更新的 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
可以使用這個(gè)簡(jiǎn)單的命令升級(jí)所有已安裝的 ports:
portmaster -a
如果你在升級(jí)的過(guò)程中發(fā)現(xiàn)了錯(cuò)誤,你可以使用 -f 選項(xiàng)升級(jí)/重新編譯所有的 ports:
portmaster -af
同樣你也可以使用 Portmaster 往系統(tǒng)里安裝新的 ports,升級(jí)所有的依賴關(guān)系之后并安裝新的 port:
portmaster shells/bash
注意:
Portmaster 默認(rèn)在刪除一個(gè)現(xiàn)有的 port 前會(huì)做一個(gè)備份包。如果新的版本能夠被成功安裝, Portmaster 將刪除備份。 使用 -b 后 Portmaster 便不會(huì)自動(dòng)刪除備份。加上 -i 選項(xiàng)之后 Portmaster 將進(jìn)入互動(dòng)模式, 在升級(jí)每個(gè) port 以前提示你給予確認(rèn)。
- Upgrading Ports Using Portupgrade
portupgrade 工具是設(shè)計(jì)來(lái)簡(jiǎn)化升級(jí)已安裝的 port 的操作的。 它通過(guò) ports-mgmt/portupgrade port 來(lái)提供。它安裝一系列用于ports管理的應(yīng)用。然而,它依賴于ruby。
cd /usr/ports/ports-mgmt/portupgrade
make install clean
在每次升級(jí)之前,推薦使用 pkgdb -F
命令來(lái)掃描已安裝的 port 的列表, 并修正其所報(bào)告的不一致。
運(yùn)行portupgrade -a升級(jí)系統(tǒng)中所安裝的所有過(guò)時(shí)的 ports。 如果您希望在每個(gè)升級(jí)操作時(shí)得到確認(rèn), 應(yīng)指定 -i 參數(shù)。
portupgrade -ai
如果您只希望升級(jí)某個(gè)特定的應(yīng)用程序, 而非全部可用的 port,應(yīng)使用portupgrade pkgname。 指定 -R 參數(shù)非常重要,portupgrade將首先升級(jí)指定程序所需要的所有ports。
portupgrade -R firefox
要使用預(yù)編譯的 package 而不是 ports 來(lái)進(jìn)行安裝, 需要指定 -P。 如果指定了這個(gè)選項(xiàng), portupgrade 會(huì)搜索 PKG_PATH 中指定的本地目錄, 如果沒(méi)有找到, 則從遠(yuǎn)程站點(diǎn)下載。 如果本地沒(méi)有找到, 而且遠(yuǎn)程站點(diǎn)也沒(méi)有成功地下載預(yù)編譯包, 則 portupgrade 將使用 ports。 要禁止使用 port, 可以指定 -PP。
portupgrade -PP gnome2
Ports and Disk Space
在通過(guò) ports 編譯和安裝軟件之后,您應(yīng)記得清理臨時(shí)的 work 目錄, 其方法是使用 make clean 命令。
- If Portmaster is used to install a port, it will automatically remove this directory unless -K is specified.
- If Portupgrade is installed, this command will remove all work directories found within the local copy of the Ports Collection:
portsclean -C
另外,許多過(guò)時(shí)的源碼文件被收集在目錄 /usr/ports/distfiles 中. 如果安裝了Portupgrade, 下列命令將刪除那些不被其他port引用的過(guò)時(shí)的distfiles。
portsclean -D
使用Portupgrade移除所有的不被系統(tǒng)其他port引用的distfiles:
portsclean -DD
如果安裝了Portmaster,使用:
portmaster --clean-distfiles
除了這些命令之外, ports-mgmt/pkg_cutleaves package(or port)自動(dòng)完成移除已安裝但不再使用的ports的任務(wù)。