基本介紹
PKGSRC簡介,為什麼使用 pkgsrc,更廣泛的軟體,適合哪類用戶,適用的系統,pkgsrc 基本知識,pkgsrc 的分支,安裝 pkgsrc,pkgsrc 子目錄,軟體包的編譯安裝,編譯技巧,/etc/mk.conf 檔案,編譯最佳化,縮短編譯時間,使用技巧,多台機器共享 pkgsrc 目錄,保持更新,選擇下載鏡像,安全漏洞檢測,常用的 make 目標,選擇軟體包版本,
PKGSRC簡介
pkgsrc: The NetBSD Packages Collection
The NetBSD Packages Collection (pkgsrc) 是在NetBSD系統以及其他UNIX-Like系統中構建第三方軟體的一個框架。現在包含了7300多個軟體包。在所支持的平台上,它使得自由的配置軟體成為可能,並切極易構建。
為什麼使用 pkgsrc
首先,pkgsrc 是一個基於源碼的軟體包管理系統。在 Unix/Linux 社區中,軟體包的 source vs binary 爭論一直沒有停息過,但有一點共識,基於源碼的軟體包管理系統會給用戶更多的控制權力,基於二進制的軟體包系統則更容易使用。pkgsrc 也可以提供二進制的軟體包,但它的優勢不在於此,所以這篇文章只專注在使用源碼編譯軟體包方面。
更廣泛的軟體
pkgsrc 使用的是 BSD 許可證,與其他的自由軟體許可證相比,較為寬鬆。而且,pkgsrc 實際上分發的是軟體包的 patch,不會與許多軟體的授權許可衝突,避免了二進制軟體包和直接分發源碼包形式下的種種限制。因此,用戶可以廣泛地使用大量的優秀軟體。例如,在許多自由軟體包管理系統中無法包含的 java, mplayer, acrobat reader, opera 這些優秀軟體,用戶必須自己動手下載安裝,但在 pkgsrc 仍可以通過軟體包管理系統工具進行安裝。
適合哪類用戶
如果你是屬於喜歡頻繁地更新嘗試各種軟體的用戶,並且主要工作在大型的桌面環境下,那么採用 pkgsrc 來管理和更新軟體,的確是一件痛苦的事情。比如,當一個 gnome 下的基礎組件升級時,經常會牽一髮而動全身,需要更新整個 gnome 套件。
如果你是一個系統管理員,需要一個穩定安全的伺服器,對 apache 這類軟體的安裝,既希望能自己設定編譯成符合自己要求的系統,又能避免時刻監視安全通報和手動下載源碼與打補丁,pkgsrc 正好符合你的要求,它可以幫助你輕鬆地維護系統,在編譯時給你調節系統所需的足夠的靈活性,讓你定製一套符合自己要求的伺服器。
如果你是一個軟體開發人員,需要參考借鑑自由軟體源碼,經常到處搜尋代碼範例。由於 pkgsrc 已經按照功能對數千套自由軟體進行了分類,可以讓你方便地找到和下載自由軟體的源碼。另外,在軟體的編譯安裝過程中,你可以同時學習到成熟軟體所採用的項目管理方法。
適用的系統
pkgsrc 可以廣泛地套用到 Unix/Linux 系統上,現在 NetBSD、 DragonFly BSD 和 FreeDarwin 是正式採用它作為自己軟體包管理的系統,SUN 也推薦在 Solaris 上面使用 pkgsrc 來安裝第三方的軟體。對於其他只提供 base 和使用二進制軟體包管理系統的 GNU/Linux 發行版,也都可以使用 pkgsrc。
pkgsrc 基本知識
pkgsrc 的分支
pkgsrc 一共有三個分支,HEAD、pkgsrc-yyyyQqq 季度分支和 pkgsrc-wip,前兩個是 pkgsrc 項目組正式維護的分支。在 HEAD 分支,維護者提交軟體的最新穩定版,這些軟體絕大多數都可以正常使用,但也可能會有一些錯誤。到每一季度末,pkgsrc 會將 HEAD 的內容放入季度分支,並凍結兩周時間,供維護人員測試修正。解凍之後,它們就成為最新的穩定版本,然後通過 bulk build 生成二進制的軟體包。pkgsrc-wip 是一個新軟體包試驗的場所,並不保證它的可用性和穩定性。當一個軟體包在 pkgsrc-wip 裡面證明成熟穩定,並有人願意維護,就會被提交到 HEAD 分支裡面。
安裝 pkgsrc
pkgsrc 使用 cvs 進行維護,你可以通過 cvs 方式下載整個 pkgsrc 源碼樹。但對於首次使用 pkgsrc,下載壓縮檔,是一種更方便快捷的方式。
從 ftp://ftp netbsd org/pub/NetBSD/packages/pkgsrc.tar.gz 或其他鏡像伺服器下載壓縮檔,然後解壓到 /usr 目錄,默認建立 /usr/pkgsrc。
對於 NetBSD 系統,這時 pkgsrc 已經就緒,直接可以使用了。其他的系統由於還缺少幾個 pkgsrc 的維護工具,需要使用 bootstrap 進行初始化:
$ cd pkgsrc/bootstrap
$ ./bootstrap
這個腳本執行以後,在 /usr/pkg/bin 目錄下面就有了 bmake 這樣的幾個工具。接下來就是將 /usr/pkg/bin 加入到 PATH 環境變數裡面。
pkgsrc 子目錄
在 /usr/pkgsrc 目錄裡面,第三方軟體按照功能劃分歸入不同的子目錄,從子目錄名稱,我們就能知道這些類的含義。比如,inputmethod 目錄下面存放著輸入法軟體,而 fonts 目錄下面自然是字型相關的軟體包了。
pkgsrc 目錄里除了按功能分類的子目錄,還有一些比較特殊的目錄:
mk:
該目錄存放的是支撐 pkgsrc 的 Makefile,與 BSD make 工具一起構成 了 pkgsrc 軟體包管理系統。
doc:
這裡存放著 pkgsrc 的文檔,一份 guide 和 pkgsrc 更新記錄。
licenses:
這個目錄下存放各種軟體的許可證。
distfiles:
該目錄用來保存從軟體發布站點下載下來的軟體包。
packages:
存放二進制軟體包的目錄。
templates:
生成 README.html 時使用的模板。
pkg_tools:
pkgsrc 的一些輔助工具,也是通過 make install 方式安裝。
meta-pkgs:
這裡是一些大型軟體包的套件,方便用戶一次安裝完成。比如 meta-pkgs/gnome 包含了 gnome 基本的組件,安裝後就可以使用 gnome 了。
軟體包的編譯安裝
編譯安裝 pkgsrc 下的軟體包,都是通過 BSD make 完成。
安裝時,根據軟體屬性,選擇分類,進入該軟體包的目錄,然後執行 make 命令。例如,現在需要安裝 WindowMaker,它是視窗管理系統軟體,在 pkgsrc 歸入 wm 子目錄:
$ cd /usr/pkgsrc/wm/windowmaker
$ make install
執行 make install 命令後,可以看到 BSD make 根據 Makefile 進行編譯的過程。本例沒有做任何最佳化調整,直接使用維護者的設定編譯安裝。例子中使用 just-in-time su 來執行 make install,而不是 root,pkgsrc 的這種特性可以防止用戶操作失誤。執行步驟中需要 root 許可權時,pkgsrc 會自動使用 su。
pkgsrc 下的軟體包,PREFIX 默認使用 /usr/pkg,如果不做修改,檔案會安裝到 /usr/pkg/bin、/usr/pkg/lib、/usr/pkg/share 這些目錄裡面。
編譯技巧
/etc/mk.conf 檔案
BSD make 執行過程中,首先會讀取 /etc/mk.conf 檔案裡面的設定,因此這個檔案就作為修改全局最佳化、設定的地方。而 pkgsrc 默認的設定內容,位於 /usr/pkgsrc/ 目錄下的 mk/default/mk.conf 檔案裡面,該檔案中的對每一個設定都有說明。比如,對於軟體編譯時產生的 obj 檔案放置的目錄,在 /usr/pkgsrc/mk/default/mk.conf 檔案裡面可以查到:
#WRKOBJDIR= /usr/tmp
# build here instead of in pkgsrc
# Possible: any path
# Default: not defined
現在需要將它改為 /usr/pkg-obj 目錄,可以通過在 /etc/mk.conf 添加下面一行實現:
WRKOBJDIR=/usr/pkg-obj
編譯最佳化
通常使用 x86 二進制軟體包,一台 P4 的機器僅能得到 386 兼容模式所提供的功能。而使用源碼編譯軟體包,我們就可以針對當前的系統設定編譯選項,從而充分地利用系統的能力。
如果你是一個軟體開發人員,知道有多種途徑可以設定一個軟體包的編譯選項:設定環境變數,修改軟體包裡面的 Makefile 等等。如果要做全局的選項設定,可以將它寫到 /etc/mk.conf 裡面,例如,給所有的 C 程式軟體包加上調試信息,只需加上:
CFLAGS += -g
如果你僅打算在編譯時可以自動加上 cpu 的最佳化選項,pkgsrc 提供了一個軟體包可以方便地為每個 C/C++ 程式自動設定。
$ cd /usr/pkgsrc/devel/cpuflags
$ make install
安裝完成後,在 /etc/mk.conf 檔案裡面加上:
.sinclude "/usr/pkg/share/mk/cpuflags mk"
縮短編譯時間
基於源碼的軟體包管理系統最大的一個缺點就是編譯需要花費很長的時間,這是無法避免的一個過程。要縮短編譯時間最根本的途徑就是升級編譯機器的硬體。但在不升級硬體的情況下,我們仍然可以通過一些方法提高編譯效率。
在 pkgsrc/devel 子目錄下面有 ccache 和 distcc 兩個工具。ccache 使用快取技術,減少重複編譯次數,最佳化編譯過程來縮短編譯時間;distcc 是採用多台機器進行分散式編譯,並且 pkgsrc 所使用的 BSD make 本身就支持並行編譯。使用 distcc 除了要求區域網路內有多台計算機外,還要求它們具有相同的編譯環境,比如所使用的 gcc 版本必須一樣。
我們通過 make install 安裝 ccache 和 distcc 兩個工具,然後在 /etc/mk.conf 檔案裡面添加:
PKGSRC_COMPILER=distcc ccache gcc
DISTCC_HOSTS=localhost distcc_server1 distcc_server2
BUILD_MAKE_FLAGS=-j 3
上面的 BUILD_MAKE_FLAGS 參數 -j 必須大於 2 才能使 distcc 正常工作。編譯開始之前,其他的編譯機器必須執行 distccd,它可以在命令行上運行:
$ distccd --daemon --allow 192.168.0/24 --listen 192.168.0.10
也可以放到系統啟動腳本裡面,詳細步驟請參考 distcc 文檔。
有一點要注意,pkgsrc 裡面的軟體包,並不是每一個都能很好地支持並行編譯,如果你在編譯時碰到了奇怪的錯誤,禁止 distcc 後再重新編譯一次。
使用技巧
多台機器共享 pkgsrc 目錄
如果區域網路內有多台機器需要使用 pkgsrc,可以通過 NFS 方式共享 /usr/pkgsrc 目錄,這樣只需在 NFS 伺服器一台機器上定時更新,其他機器都能使用到最新的 pkgsrc,而且對於 distfiles 目錄下的檔案,也只需要一個用戶下載一次。
保持更新
當你需要安裝或更新軟體的時候,一般先更新一下 pkgsrc。在 pkgsrc 壓縮檔裡面本身就含有 cvs 相關信息,更新的時候,只需要進入該軟體包目錄,然後使用 cvs up -dP 命令更新軟體包。
因為自由軟體的軟體包通常都相互關聯,有著嚴格的依賴關係,為了減少因版本依賴造成的錯誤,整個 pkgsrc 樹最好能定期進行更新。
下載的 pkgsrc 壓縮檔裡面含有的 cvs 倉庫信息,它指向的是 pkgsrc 主站,如果你要替換為連線較快的鏡像站點,可以使用下面方法進行替換。
cvs 倉庫的信息是保存在 CVS/Root 檔案裡面,壓縮檔裡面的 CVS/Root 檔案內容是:
[email protected] org:/cvsroot
現在打算將 cvs 伺服器更換到區域網路內的一台鏡像伺服器上,可以創建一個臨時檔案 /tmp/Root,假設內容為:
:ext:[email protected]:/NetBSD/cvsroot
接下來替換 pkgsrc 目錄中的 CVS/Root,執行:
$ cd /usr/pkgsrc
$ find . -type f -name Root -exec cp /tmp/Root {} \;
選擇下載鏡像
MASTER_SITE_OVERRIDE=ftp://ftp2.us.NetBSD org/pub/NetBSD/packages/distfiles/
將上面這一行寫入 /etc/mk.conf,pkgsrc 就會從 ftp2.us.NetBSD org 站點下載軟體包。另外,sourceforge net 也有大量的鏡像,可以用下面的設定選擇合適的伺服器:
MASTER_SITE_SOURCEFORGE=http://easynews.dl.sourceforge net/sourceforge/
安全漏洞檢測
pkgsrc 提供了一種機制可以讓用戶掌握系統中軟體的安全情況,它是通過 security/audit-packages 實現的,裡面提供了兩個工具:
download-vulnerability-list:
用來更新安全簡報
audit-packages:
根據簡報檢測系統中所安裝的軟體的安全狀況
這兩個程式可以在需要的時候手動執行,也可以使用 cron 工具定期執行。
下載的簡報檔案是 pkg-vulnerabilities,從 NetBSD 主站獲取,然後保存到 /usr/pkgsrc/distfiles/ 目錄。這個檔案在鏡像站點上也有,如果讓 download-vulnerability-list 從鏡像站點下載,需要在 /usr/pkg/etc 目錄下面創建一個 audit-packages.conf 檔案,然後添加這樣一行信息:
VUL_SOURCE=ftp://(mirror)/pub/NetBSD/packages/distfiles/pkg-vulnerabilities
常用的 make 目標
make install
在執行 make install 的過程中,實際上是執行了一系列目標: fetch, checksum, extract, configure, build 等等,後一個目標依賴於前一個目標。 你也可以單獨執行其中的一個目標,或者不選擇任何目標,只執行 make,默認 為 build 目標,根據依賴關係,它先檢查 configure 目標是否完成,如果沒 有,則先執行 configure 目標,以此類推。
make clean && make clean-depends
編譯安裝之後,可以清除編譯生成的檔案,節約磁碟空間。clean 是清除當前 軟體包的編譯檔案,clean-depends 是清除依賴包的編譯檔案。
make replace
更新已有的軟體包。使用此目標需要先安裝 pkg_tools/pkg_tarup 工具。
make deinstall
卸載軟體包
make fetch-list
使用上面命令可以查看編譯此軟體包,都有哪些軟體包需要下載。
make readme
生成當前軟體的 README.html 檔案。
make show-var VARNAME=VAR
顯示當前編譯環境下的某個變數內容,比如 VARNAME=CFLAGS 可以查看 C 編譯 選項。
make show-depends-dirs
顯示本軟體所依賴的軟體包目錄。
make show-all-depends-dirs
顯示本軟體和所依賴軟體全部的依賴軟體包目錄。
make show-options
顯示本軟體所支持的選項。然後可以使用 PKG_OPTIONS 添加和刪除選項。例 如,對於 chat/gaim,要添加 tcl 選項可以在 /etc/mk.conf 裡面增加一行:
PKG_OPTIONS.gaim+=tcl
pkgsrc rc.d
從 pkgsrc 安裝的軟體包,默認系統設定目錄是 /usr/pkg/etc, daemon 類的軟體包,啟動腳本位置是 /usr/pkg/etc/rc.d。軟體包安裝完以後,並沒有直接在 rc.d 目錄下面安裝腳本,而是放在 /usr/pkg/share/examples/rc.d 目錄下面。使用時,需要將其複製到 /usr/pkg/etc/rc.d 目錄下面,讓管理員在修改符合自己的要求啟動腳本後,還可以保留一份最初的備份。
在 NetBSD 系統下使用,還要修改 /etc/rc.conf。例如,對於 apache,需要加上
apache=YES
然後在 /etc/rc.local 裡面加入
if [ -f /usr/pkg/etc/rc.d/apache ]; then
/usr/pkg/etc/rc.d/apache start
fi
pkg_* tools 基本用法
pkg_info
不加參數時,列出當前系統中使用 pkgsrc 安裝的軟體包。
pkg_info -F /path/to/file 查找 file 所屬的軟體包。
pkg_info -R pkg 列出依賴 pkg 的軟體包。
pkg_delete
刪除已經安裝的 pkgsrc 軟體包。
pkg_delete -f pkg 強制刪除 pkg 軟體包,不考慮破壞 pkg 與其他軟體包之間的依賴關係。
pkgtools/pkgfind
根據關鍵字搜尋 pkgsrc 中可用的軟體包。
pkgtools/pkg_chk
更新 pkgsrc 後,可以使用 pkg_chk -i 檢驗當前安裝的軟體包哪些可以升 級。
pkgtools/pkgclean
如果你在 make install 之後沒有使用 make clean 清除編譯檔案,可以藉助 這個工具進行清理,它比從 /usr/pkgsrc 目錄下執行 make clean 要快。
pkgviews
pkgviews 是 pkgsrc 新提供的一個實驗特性,它允許在系統裡面安裝一個軟體包的不同版本。pkgsrc 默認使用 overwrite 模式安裝軟體,要改成 pkgviews 需要在 /etc/mk.conf 裡面註明
PKG_INSTALLATION_PREFS= pkgviews overwrite
使用之前要確保系統裡面沒有裝任何 pkgsrc 軟體包,然後就可以按照一般方式 make install 編譯安裝軟體包了。在安裝另一個版本時,可以使用
$ make install PKGVIEWS=devel
命令安裝,而不與已經安裝的版本相衝突。
刪除 pkgviews 軟體包,需要藉助 pkg_view 工具,例如:
$ pkg_view -w devel delete pkg-devel
選擇軟體包版本
有時,一個軟體包有多個流行的版本,你可以選定一個版本作為系統採用的版本,其他相關軟體包則根據該版本判斷依賴關係。版本的設定也放在 /etc/mk.conf 裡面,下面是幾個常見的例子。
python:
PYTHON_VERSION_DEFAULT=24
teTeX:
TEX_DEFAULT=teTeX3
java:
JAVA_HOME=/usr/pkg/java/sun-1.5
PKG_JVM=sun-jdk