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的任務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章