PKGSRC

pkgsrc: The NetBSD Packages CollectionThe NetBSD Packages Collection (pkgsrc) 是在NetBSD系統以及其他UNIX-Like系統中構建第三方軟體的一個框架。現在包含了7300多個軟體包。pkgsrc一共有三個分支,HEAD、pkgsrc-yyyyQqq季度分支和pkgsrc-wip,前兩個是pkgsrc項目組正式維護的分支。

PKGSRC是在NetBSD系統以及其他UNIX-Like系統中構建第三方軟體的一個框架。現在包含了7300多個軟體包。在所支持的平台上,它使得自由的配置軟體成為可能,並切極易構建。

基本知識

pkgsrc的分支
pkgsrc一共有三個分支,HEAD、pkgsrc-yyyyQqq季度分支和pkgsrc-wip,前兩個是pkgsrc項目組正式維護的分支。在HEAD分支,維護者提交軟體的最新穩定版,這些軟體絕大多數都可以正常使用,但也可能會有一些錯誤。到每一季度末,pkgsrc會將HEAD的內容放入季度分支,並凍結兩周時間,供維護人員測試修正。解凍之後,它們就成為最新的穩定版本,然後通過bulkbuild生成二進制的軟體包。pkgsrc-wip是一個新軟體包試驗的場所,並不保證它的可用性和穩定性。當一個軟體包在pkgsrc-wip裡面證明成熟穩定,並有人願意維護,就會被提交到HEAD分支裡面。
除了上面三個分支,還有一些pkgsrc相關的項目:
pkgsrc-wip-cn:http://gro.clinux.org/projects/pkgsrc-wip/
pkgsrc-wip-jp:http://sourceforge.jp/projects/pkgsrc-wip/
pkgsrc-wip-kr:http://kldp.net/projects/pkgsrc-wip/
安裝pkgsrc
pkgsrc使用cvs進行維護,你可以通過cvs方式下載整個pkgsrc源碼樹。但對於首次使用pkgsrc,下載壓縮檔,是一種更方便快捷的方式。
ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc.tar.gz或其他鏡像伺服器下載壓縮檔,然後解壓到/usr目錄,默認建立/usr/pkgsrc。
對於NetBSD系統,這時pkgsrc已經就緒,直接可以使用了。其他的系統由於還缺少幾個pkgsrc的維護工具,需要使用bootstrap進行初始化:
$cdpkgsrc/bootstrap
$./bootstrap
這個腳本執行以後,在/usr/pkg/bin目錄下面就有了bmake這樣的幾個工具。接下來就是將/usr/pkg/bin加入到PATH環境變數裡面。
pkgsrc子目錄
在/usr/pkgsrc目錄裡面,第三方軟體按照功能劃分歸入不同的子目錄,從子目錄名稱,我們就能知道這些類的含義。比如,inputmethod目錄下面存放著輸入法軟體,而fonts目錄下面自然是字型相關的軟體包了。
pkgsrc目錄里除了按功能分類的子目錄,還有一些比較特殊的目錄:
mk:
該目錄存放的是支撐pkgsrc的Makefile,與BSDmake工具一起構成了pkgsrc軟體包管理系統。
doc:
這裡存放著pkgsrc的文檔,一份guide和pkgsrc更新記錄。
licenses:
這個目錄下存放各種軟體的許可證
distfiles:
該目錄用來保存從軟體發布站點下載下來的軟體包。
packages:
存放二進制軟體包的目錄。
templates:
生成README.html時使用的模板
pkg_tools:
pkgsrc的一些輔助工具,也是通過makeinstall方式安裝。
meta-pkgs:
這裡是一些大型軟體包的套件,方便用戶一次安裝完成。比如meta-pkgs/gnome包含了gnome基本的組件,安裝後就可以使用gnome了。
軟體包的編譯安裝
編譯安裝pkgsrc下的軟體包,都是通過BSDmake完成。
安裝時,根據軟體屬性,選擇分類,進入該軟體包的目錄,然後執行make命令。例如,現在需要安裝WindowMaker,它是視窗管理系統軟體,在pkgsrc歸入wm子目錄:
$cd/usr/pkgsrc/wm/windowmaker
$makeinstall
執行makeinstall命令後,可以看到BSDmake根據Makefile進行編譯的過程。本例沒有做任何最佳化調整,直接使用維護者的設定編譯安裝。例子中使用just-in-timesu來執行makeinstall,而不是root,pkgsrc的這種特性可以防止用戶操作失誤。執行步驟中需要root許可權時,pkgsrc會自動使用su。
pkgsrc下的軟體包,PREFIX默認使用/usr/pkg,如果不做修改,檔案會安裝到/usr/pkg/bin、/usr/pkg/lib、/usr/pkg/share這些目錄裡面。

為什麼使用pkgsrc

首先,pkgsrc是一個基於源碼的軟體包管理系統。在Unix/Linux社區中,軟體包的sourcevsbinary爭論一直沒有停息過,但有一點共識,基於源碼的軟體包管理系統會給用戶更多的控制權力,基於二進制的軟體包系統則更容易使用。pkgsrc也可以提供二進制的軟體包,但它的優勢不在於此,所以這篇文章只專注在使用源碼編譯軟體包方面。
更廣泛的軟體
pkgsrc使用的是BSD許可證,與其他的自由軟體許可證相比,較為寬鬆。而且,pkgsrc實際上分發的是軟體包的patch,不會與許多軟體的授權許可衝突,避免了二進制軟體包和直接分發源碼包形式下的種種限制。因此,用戶可以廣泛地使用大量的優秀軟體。例如,在許多自由軟體包管理系統中無法包含的java,mplayer,acrobatreader,opera這些優秀軟體,用戶必須自己動手下載安裝,但在pkgsrc仍可以通過軟體包管理系統工具進行安裝。
適合哪類用戶
如果你是屬於喜歡頻繁地更新嘗試各種軟體的用戶,並且主要工作在大型的桌面環境下,那么採用pkgsrc來管理和更新軟體,的確是一件痛苦的事情。比如,當一個gnome下的基礎組件升級時,經常會牽一髮而動全身,需要更新整個gnome套件。
如果你是一個系統管理員,需要一個穩定安全的伺服器,對apache這類軟體的安裝,既希望能自己設定編譯成符合自己要求的系統,又能避免時刻監視安全通報和手動下載源碼與打補丁,pkgsrc正好符合你的要求,它可以幫助你輕鬆地維護系統,在編譯時給你調節系統所需的足夠的靈活性,讓你定製一套符合自己要求的伺服器。
如果你是一個軟體開發人員,需要參考借鑑自由軟體源碼,經常到處搜尋代碼範例。由於pkgsrc已經按照功能對數千套自由軟體進行了分類,可以讓你方便地找到和下載自由軟體的源碼。另外,在軟體的編譯安裝過程中,你可以同時學習到成熟軟體所採用的項目管理方法。
適用的系統
pkgsrc可以廣泛地套用到Unix/Linux系統上,現在NetBSD、DragonflyBSD和FreeDarwin是正式採用它作為自己軟體包管理的系統,SUN也推薦在Solaris上面使用pkgsrc來安裝第三方的軟體。對於其他只提供base和使用二進制軟體包管理系統的GNU/Linux發行版,也都可以使用pkgsrc。

編譯技巧

/etc/mk.conf檔案
BSDmake執行過程中,首先會讀取/etc/mk.conf檔案裡面的設定,因此這個檔案就作為修改全局最佳化、設定的地方。而pkgsrc默認的設定內容,位於/usr/pkgsrc/目錄下的mk/default/mk.conf檔案裡面,該檔案中的對每一個設定都有說明。比如,對於軟體編譯時產生的obj檔案放置的目錄,在/usr/pkgsrc/mk/default/mk.conf檔案裡面可以查到:
#WRKOBJDIR=/usr/tmp
#buildhereinsteadofinpkgsrc
#Possible:anypath
#Default:notdefined
現在需要將它改為/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
$makeinstall
安裝完成後,在/etc/mk.conf檔案裡面加上:
.sinclude"/usr/pkg/share/mk/cpuflags.mk"
縮短編譯時間
基於源碼的軟體包管理系統最大的一個缺點就是編譯需要花費很長的時間,這是無法避免的一個過程。要縮短編譯時間最根本的途徑就是升級編譯機器的硬體。但在不升級硬體的情況下,我們仍然可以通過一些方法提高編譯效率。
在pkgsrc/devel子目錄下面有ccache和distcc兩個工具。ccache使用快取技術,減少重複編譯次數,最佳化編譯過程來縮短編譯時間;distcc是採用多台機器進行分散式編譯,並且pkgsrc所使用的BSDmake本身就支持並行編譯。使用distcc除了要求區域網路內有多台計算機外,還要求它們具有相同的編譯環境,比如所使用的gcc版本必須一樣。
我們通過makeinstall安裝ccache和distcc兩個工具,然後在/etc/mk.conf檔案裡面添加:
PKGSRC_COMPILER=distccccachegcc
DISTCC_HOSTS=localhostdistcc_server1distcc_server2
BUILD_MAKE_FLAGS=-j3
上面的BUILD_MAKE_FLAGS參數-j必須大於2才能使distcc正常工作。編譯開始之前,其他的編譯機器必須執行distccd,它可以在命令行上運行:
$distccd--daemon--allow192.168.0/24--listen192.168.0.10
也可以放到系統啟動腳本裡面,詳細步驟請參考distcc文檔。
有一點要注意,pkgsrc裡面的軟體包,並不是每一個都能很好地支持並行編譯,如果你在編譯時碰到了奇怪的錯誤,禁止distcc後再重新編譯一次。

使用技巧

多台機器共享pkgsrc目錄
如果區域網路內有多台機器需要使用pkgsrc,可以通過NFS方式共享/usr/pkgsrc目錄,這樣只需在NFS伺服器一台機器上定時更新,其他機器都能使用到最新的pkgsrc,而且對於distfiles目錄下的檔案,也只需要一個用戶下載一次。
保持更新
當你需要安裝或更新軟體的時候,一般先更新一下pkgsrc。在pkgsrc壓縮檔裡面本身就含有cvs相關信息,更新的時候,只需要進入該軟體包目錄,然後使用cvsup-dP命令更新軟體包。
因為自由軟體的軟體包通常都相互關聯,有著嚴格的依賴關係,為了減少因版本依賴造成的錯誤,整個pkgsrc樹最好能定期進行更新。
下載的pkgsrc壓縮檔裡面含有的cvs倉庫信息,它指向的是pkgsrc主站,如果你要替換為連線較快的鏡像站點,可以使用下面方法進行替換。
cvs倉庫的信息是保存在CVS/Root檔案裡面,壓縮檔裡面的CVS/Root檔案內容是:
[email protected]:/cvsroot
現在打算將cvs伺服器更換到區域網路內的一台鏡像伺服器上,可以創建一個臨時檔案/tmp/Root,假設內容為:
:ext:[email protected]:/NetBSD/cvsroot
接下來替換pkgsrc目錄中的CVS/Root,執行:
$cd/usr/pkgsrc
$find.-typef-nameRoot-execcp/tmp/Root{}\;
選擇下載鏡像
執行make命令後,pkgsrc會根據需要自動下載軟體發布包,如果從默認的主站下載很慢,可以修改到其他的鏡像站點:
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有一個負責安全的團隊,專門跟蹤第三方軟體的安全狀況,及時返回信息到pkgsrc社區。
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目標
makeinstall
在執行makeinstall的過程中,實際上是執行了一系列目標:fetch,checksum,extract,configure,build等等,後一個目標依賴於前一個目標。你也可以單獨執行其中的一個目標,或者不選擇任何目標,只執行make,默認為build目標,根據依賴關係,它先檢查configure目標是否完成,如果沒有,則先執行configure目標,以此類推。makeclean&&makeclean-depends
編譯安裝之後,可以清除編譯生成的檔案,節約磁碟空間。clean是清除當前軟體包的編譯檔案,clean-depends是清除依賴包的編譯檔案。
makereplace
更新已有的軟體包。使用此目標需要先安裝pkg_tools/pkg_tarup工具。
makedeinstall
卸載軟體包
makefetch-list
使用上面命令可以查看編譯此軟體包,都有哪些軟體包需要下載。
makereadme
生成當前軟體的README.html檔案。
makeshow-varVARNAME=VAR
顯示當前編譯環境下的某個變數內容,比如VARNAME=CFLAGS可以查看C編譯選項。
makeshow-depends-dirs
顯示本軟體所依賴的軟體包目錄。
makeshow-all-depends-dirs
顯示本軟體和所依賴軟體全部的依賴軟體包目錄。
makeshow-options
顯示本軟體所支持的選項。然後可以使用PKG_OPTIONS添加和刪除選項。例如,對於chat/gaim,要添加tcl選項可以在/etc/mk.conf裡面增加一行:
PKG_OPTIONS.gaim+=tcl
pkgsrcrc.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/apachestart
fi
pkg_*tools基本用法
pkg_info
不加參數時,列出當前系統中使用pkgsrc安裝的軟體包。
pkg_info-F/path/to/file查找file所屬的軟體包。
pkg_info-Rpkg列出依賴pkg的軟體包。
pkg_delete
刪除已經安裝的pkgsrc軟體包。
pkg_delete-fpkg強制刪除pkg軟體包,不考慮破壞pkg與其他軟體包之間的依賴關係。
pkgtools/pkgfind
根據關鍵字搜尋pkgsrc中可用的軟體包。
pkgtools/pkg_chk
更新pkgsrc後,可以使用pkg_chk-i檢驗當前安裝的軟體包哪些可以升級。
pkgtools/pkgclean
如果你在makeinstall之後沒有使用makeclean清除編譯檔案,可以藉助這個工具進行清理,它比從/usr/pkgsrc目錄下執行makeclean要快。
pkgviews
pkgviews是pkgsrc新提供的一個實驗特性,它允許在系統裡面安裝一個軟體包的不同版本。pkgsrc默認使用overwrite模式安裝軟體,要改成pkgviews需要在/etc/mk.conf裡面註明
PKG_INSTALLATION_PREFS=pkgviewsoverwrite
使用之前要確保系統裡面沒有裝任何pkgsrc軟體包,然後就可以按照一般方式makeinstall編譯安裝軟體包了。在安裝另一個版本時,可以使用
$makeinstallPKGVIEWS=devel
命令安裝,而不與已經安裝的版本相衝突。
刪除pkgviews軟體包,需要藉助pkg_view工具,例如:
$pkg_view-wdeveldeletepkg-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

網路資源

網站:
pkgsrc主站:http://www.pkgsrc.org
pkgsrc研討會:http://www.pkgsrccon.org
文檔:
pkgsrc指南:http://www.netbsd.org/Documentation/pkgsrc/
郵件列表:
pkgsrc技術的討論:http://www.netbsd.org/MailingLists/#tech-pkg
pkgsrc-wip郵件列表:http://sourceforge.net/mail/?group_id=76437

相關詞條

相關搜尋

熱門詞條

聯絡我們