UNIX基礎--安裝應用程序: Packages 和 Ports

Packages and Ports

概述

FreeBSD 將許多系統工具捆綁作為基本系統的一部分。另外,FreeBSD 提供了兩種補充的技術來安裝第三方軟件:FreeBSD Ports Collection,從源代碼安裝; packages,從預編譯的二進制版本安裝。這兩種方法都可以用于從本地介質, 或從網上直接安裝您喜歡的應用程序的最新版本。

UNIX?系統典型的安裝第三方軟件的步驟包括:

1、下載這個軟件,軟件的發布可能是源代碼格式,或是一個二進制包。
2、從默認的發行格式解壓軟件,通常是用compress, gzip,或bzip2壓縮過tar包。
3、閱讀相關文檔,了解如何安裝。 (通常文件名是INSTALL或README, 或在doc/ 目錄下的一些文檔)
4、如果軟件是以源代碼形式發布的,那就需要編譯它。可能需要編輯一個 Makefile文件, 或運行 configure腳本。
5、測試和安裝軟件。

FreeBSD的package是包含了一個應用的所有命令、全部的配置文件和文檔的預編譯好的副本 。package可以使用pkg命令來操作。
FreeBSD的port是一個可以自動從源代碼編譯成應用程序的文件集合。這些文件包含了自動下載、解開、打補丁、編譯、安裝應用的所有必要的信息。

pots系統也可以用于生成被包管理命令維護的packages。
packages 和 ports 都可以自動處理依賴庫。

這兩種技術是很相似,packages 和 ports有各自的強項,根據需要選擇哪種方法安裝一個特定的軟件。

Package優點

  • 一個壓縮的 package 通常要比一個壓縮的包含源代碼的應用程序小得多。
  • package 不需要進行額外的編譯時間。 對于大型應用程序如 Mozilla, KDE 或 GNOME 來說這顯得尤為重要, 特別是在您的系統資源比較差的情況下。
  • package不需要理解任何在FreeBSD上編譯軟件的詳細過程。

Port優點:

  • package 在編譯時通常使用比較保守的選項,這是為了保證它們能夠運行在大多數的系統上。通過從 port 安裝,可以細微調整編譯選項來產生適合于處理器的代碼。
  • 一些軟件包已經把與它們相關的能做和不能做的事情的選項都編譯進去了。從 port 中安裝時,不一定要接受默認的選項, 可以自己來設置。
  • 一些軟件的許可條件禁止采用二進制形式發行。 它們必須以源代碼形式發布,終端用戶編譯。
  • 一些人不信任二進制發行形式。 至少有了源代碼, (理論上) 可以親自閱讀它,尋找潛在的問題。
  • 如果要自己對軟件打補丁,您就需要有源代碼。
查找軟件

FreeBSD中可用的應用程序正在不斷地增長著。有很多方法可以查找需要安裝的軟件。

  • FreeBSD站點上維護著一個最新的的可搜索當前所有可用應用程序的列表,在 http://www.FreeBSD.org/ports/。ports可以通過程序名稱或軟件分類來搜索。
  • Dan Langille維護著網站 FreshPorts,http://www.FreshPorts.org/。 FreshPort提供綜合搜索工具,追蹤ports中應用的變化。注冊用戶可以創建自定義檢視列表,當有任何程序被升級時,他們就會發 email 提醒您。
  • 如果不確定想要的應用程序的名字,可以嘗試在 SourceForge.net or GitHub.com這些網站中查找,然后回到 FreeBSD site主站查看應用是否被port進去了( be ported)。
  • 查找二進制包倉庫(binary package repository)
    pkg search xxx
    pkg search -o xxx
  • Ports集(Ports Collection)安裝后,有幾種方法可以查詢本地ports樹。查找一個port屬于哪個category:
    whereis lsof
    lsof: /usr/ports/sysutils/lsof
    echo /usr/ports/*/*lsof*
    /usr/ports/sysutils/lsof
  • 另外一個查找軟件的方法是用Ports Collection內嵌的搜索機制。要使用這個搜索機制, 需要先cd到/usr/ports目錄下面,然后運行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: 

注意:內嵌搜索機制使用索引信息文件. 如果顯示消息:the INDEX is required, 執行make fetchindex下載最新的索引文件.

顯示精簡信息,使用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就是想搜索的部分內容。 它將搜索port的名字、 注釋, 描述和從屬關系, 如果不知道您想搜索的程序名字, 可以利用它搜索一些關鍵主題來找到需要的。
當使用search或quicksearch時,搜索的關鍵字不區分大小寫。

使用pkg進行二進制包管理

pkg是FreeBSD傳統的包管理工具的下一代替代者。它提供了很多特性,使處理二進制包更快,更簡單。
pkg不是替代像 ports-mgmt/portmasterports-mgmt/portupgrade這樣的port管理工具,這些工具既可以使用二進制方式又可以通過ports集方式安裝第三方軟件,而pkg只安裝二進制包。

安裝pkg

從FreeBSD 8.4之后的版本包括了一個用于下載安裝pkg(包括使用手冊)的引導程序。(bootstrap utility)

  • To bootstrap the system, run:
/usr/sbin/pkg
pkg常用命令
  • 查看已安裝軟件包信息
    pkg info
  • 安裝和移除軟件包
    pkg installpkg delete
  • 更新已安裝軟件包
    pkg version
    pkg upgrade
  • 審核已安裝軟件包
    pkg audit -F
  • 自動移除孤立依賴
    pkg autoremove
  • 移除陳舊package包
    pkg clean

pkg默認在一個緩存目錄(PKG_CACHEDIR)存儲二進制包,當使用pkg upgrade更新包時,舊的版本不會自動移除。

使用Ports Collection

Ports Collection ── 本質上是 /usr/ports 目錄下的一堆 Makefile、 Patches(補?。┖兔枋鑫募?,這些文件用于在FreeBSD系統中編譯和安裝應用。

安裝Ports Collection
  • Portsnap Method
    FreeBSD的base system包含Portsnap. 這是一個獲得Ports Collection的快速易用的工具也是對大多數用戶推薦的方法。
    1、下載壓縮的 Ports 套件快照到 /var/db/portsnap:
portsnap fetch

2、如果是首次運行 Portsnap,則需要將快照釋放到 /usr/ports:

portsnap extract

3、更新 /usr/ports:

portsnap fetch
portsnap update

當使用fetch選項時,extract、update選項可以連續運行:
portsnap fetch update

  • Subversion Method
    如果需要更多的控制ports tree或者本地更改需要維護, Subversion可以用于獲得Ports Collection。
    1、在檢測ports tree之前Subversion必須安裝。如果ports tree已經存在:
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 是讓一個程序在 FreeBSD 上簡潔地編譯并安裝的所需文件的最小組合。 每個 port skeleton 包含:

Makefile:  Makefile 包括好幾個部分, 指出應用程序是如何編譯以及將被安裝在系統的哪些地方。 
distinfo: 這個文件包括這些信息:這些文件用來對下載后的文件校驗和進行檢查   ,來確保在下載過程中文件沒有被破壞。  
files/: 這個目錄包括在FreeBSD系統上編譯和安裝程序需要用到的補丁。這些補丁基本上都是些小文件,指出特定文件作了哪些修正。它們都是純文本的的格式,基本上是這樣的 “刪除第 10 行” 或 “將第 26 行改為這樣 ...”,補丁文件也被稱作 “diffs”,他們由diff程序生成。
這個目錄也包含了在編譯 port 時要用到的其它文件。
pkg-descr:這是一個提供更多細節,有軟件的多行描述。
pkg-plist: 這是即將被安裝的所有文件的列表。它告訴 ports 系統在卸載時需要刪除哪些文件。

port里面包含著如何編譯源代碼的指令,但不包含真正的源代碼。ports中這個程序源代碼標示文件叫 “distfile”,構建port的過程中會自動存儲已經下載的源碼到/usr/ports/distfiles.

安裝Ports

使用Ports Collection編譯安裝port,需要連接網絡和超級用戶特權。如果沒有網絡,則需要將 distfile 手工放到 /usr/ports/distfiles 中。

  • 首先進入要安裝 port 的目錄:
    cd /usr/ports/sysutils/lsof
  • make install
  • make clean

編譯port的時候可以使用make install clean節省步驟。

移除已安裝的Ports

已經安裝的ports可以使用pkg delete命令卸載。
也可以在ports目錄,使用make deinstall命令

升級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.

執行Ports升級,使用Portmaster或者Portupgrade.

  • Upgrading Ports Using Portmaster
    ports-mgmt/portmasterpackage(或稱port),是推薦的升級已安裝Ports的工具,它被設計為隨FreeBSD系統使用而不需要依賴其他ports的工具。它用/var/db/pkg/中的信息決定哪些ports需要升級。
cd /usr/ports/ports-mgmt/portmaster
make install clean

Portmaster 把 ports 分成4類:

Root ports (不依賴其他的 ports,也不被依賴)
Trunk ports (不依賴其他的 ports,但是被其他的 ports 依賴)
Branch ports (依賴于其他的 ports,同時也被依賴)
Leaf ports (依賴于其他的 ports,但不被依賴)

可以使用 -L 選項列出所有已安裝的 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

可以使用這個簡單的命令升級所有已安裝的 ports:

portmaster -a

如果你在升級的過程中發現了錯誤,你可以使用 -f 選項升級/重新編譯所有的 ports:

portmaster -af

同樣你也可以使用 Portmaster 往系統里安裝新的 ports,升級所有的依賴關系之后并安裝新的 port:

portmaster shells/bash

注意:
Portmaster 默認在刪除一個現有的 port 前會做一個備份包。如果新的版本能夠被成功安裝, Portmaster 將刪除備份。 使用 -b 后 Portmaster 便不會自動刪除備份。加上 -i 選項之后 Portmaster 將進入互動模式, 在升級每個 port 以前提示你給予確認。

  • Upgrading Ports Using Portupgrade
    portupgrade 工具是設計來簡化升級已安裝的 port 的操作的。 它通過 ports-mgmt/portupgrade port 來提供。它安裝一系列用于ports管理的應用。然而,它依賴于ruby。
cd /usr/ports/ports-mgmt/portupgrade
make install clean

在每次升級之前,推薦使用 pkgdb -F 命令來掃描已安裝的 port 的列表, 并修正其所報告的不一致。
運行portupgrade -a升級系統中所安裝的所有過時的 ports。 如果您希望在每個升級操作時得到確認, 應指定 -i 參數。

portupgrade -ai

如果您只希望升級某個特定的應用程序, 而非全部可用的 port,應使用portupgrade pkgname。 指定 -R 參數非常重要,portupgrade將首先升級指定程序所需要的所有ports。

portupgrade -R firefox

要使用預編譯的 package 而不是 ports 來進行安裝, 需要指定 -P。 如果指定了這個選項, portupgrade 會搜索 PKG_PATH 中指定的本地目錄, 如果沒有找到, 則從遠程站點下載。 如果本地沒有找到, 而且遠程站點也沒有成功地下載預編譯包, 則 portupgrade 將使用 ports。 要禁止使用 port, 可以指定 -PP。

portupgrade -PP gnome2
Ports and Disk Space

在通過 ports 編譯和安裝軟件之后,您應記得清理臨時的 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

另外,許多過時的源碼文件被收集在目錄 /usr/ports/distfiles 中. 如果安裝了Portupgrade, 下列命令將刪除那些不被其他port引用的過時的distfiles。

portsclean -D

使用Portupgrade移除所有的不被系統其他port引用的distfiles:

portsclean -DD

如果安裝了Portmaster,使用:

portmaster --clean-distfiles

除了這些命令之外, ports-mgmt/pkg_cutleaves package(or port)自動完成移除已安裝但不再使用的ports的任務。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容