摘要:基于開源軟件平臺基本特點的分析,對目前具有代表性的apt/dpkg、yum/RPM、BSD ports和portage等軟件管理技術進行分析,對比和總結了現有技術特征和一般結構,探索了開源平臺下軟件管理技術可能的發展方向。
關鍵詞:軟件管理; 軟件分發; 軟件包; 開源軟件
中圖分類號:TP311.5文獻標志碼:A
文章編號:1001-3695(2007)08-0112-04
伴隨著互聯網的快速發展,開放源碼軟件(open source software,OSS)項目得到快速發展和普及,使軟件從傳統的集中開發模式向分散式發生轉變。一些大型軟件(如FreeBSD和Mozilla瀏覽器)也以開源的方式由分布在各地的小組協同開發。同時,基于對開源項目代碼的獲取與重用,更多組織和個人得以參與軟件的開發與發布。這使得開源平臺下可用軟件的種類和數量急劇增加。它們在功能上互相依賴,基于各自特定的開發語言和組件模型,版本更新頻繁,物理上分散在互聯網各處。這一現象和變化趨勢增大了軟件從開發完成到用戶最終正常獲取、安裝和使用該軟件的難度和復雜度,為軟件管理技術提出了新的挑戰。
在Linux、BSD等開源操作系統中,可供使用的開源軟件數量巨大。傳統的軟件安裝經過源代碼獲取(fetch)、解壓縮(extract)、配置(configure)、編譯(make)、安裝(make install)等步驟,用戶需要自行滿足軟件的安裝條件(如編譯環境和依賴關系),才能使軟件在當前平臺順利編譯安裝。為減輕用戶負擔,當前的Linux、BSD發行版中,以軟件包為基礎,提供了一定的軟件管理功能。具體來說,分為包管理和分發管理兩個部分,分別負責軟件包的本地安裝維護和依賴關系處理(根據依賴關系計算結果自動從分發系統中獲取所需的軟件包)。這一方式較好地解決了開源軟件獲取、安裝和維護的問題。本文中的開源平臺是指開放源碼操作系統及以此為基礎的開發源碼應用軟件。
1開源平臺下的軟件管理技術
1.1開源軟件平臺的特點
對于商業非開源應用軟件的發布與部署,一般由專業的部署配置工具或軟件生產線技術[1,2]進行管理,然而這些技術主要針對特定的軟件產品,缺乏通用性。在Microsoft Windows等商業操作系統中,開源項目一般也僅依賴于操作系統提供的服務(如.NET Framework),開源項目之間很少相互依賴。這些非開源平臺由商業公司維護和發布,同一版本在生命周期內變化很小并能保持兼容。因此開源項目的部署目標是一個相對固定和獨立的軟件環境。
在本文討論的開源平臺中,開源項目包括操作系統本身,具有明顯的動態性和依賴性。一方面,開源項目的bug修正和新功能添加在不斷地迭代進行,其版本呈持續上升變化的狀態;另一方面,開源平臺,特別是類UNIX開源平臺強調并促進了軟件重用,重用不僅限于項目內部,更廣泛地發生在不同開源項目之間。這使得應用程序與操作系統、應用程序之間的依賴關系更為復雜。在當前的開源領域中,可用軟件包的數量在20 000個以上,開發者以源碼的形式發布,它們散落在互聯網中的不同位置,這些軟件之間存在著復雜的依賴和沖突關系[3]。較商業非開源軟件而言,開源項目的分散開發與松散組織進一步加大了項目之間動態依賴關系處理的難度,缺乏統一的組織進行軟件版本發布、依賴關系處理和兼容性測試。對sourceForge(http://sourceforge.net,當前最大的開源項目存放站點)的研究表明[4],開源項目在目標操作系統、license、實現語言和開發狀態上都存在著很大差異。著名的開源項目bug提交數量很高,特別是gaim、python和tcl等。另外,開發人員是開源項目的主要受眾,這也反映出項目之間具有的內在依賴關系。
開源軟件的這些特點,使得傳統的軟件安裝管理方式難以在特定的平臺上完成編譯和安裝。這種情況下,需要由開源發行操作系統提供一套有效的機制,使得用戶能在相應的平臺中獲取、安裝和正常使用所需的軟件,及時并有效地將開源項目的更新變化反映到用戶桌面;同時保證整個軟件系統的完整性(作為軟件管理系統的基本目標,本文完整性是指所有已安裝軟件的依賴關系均得到滿足,同時不存在相互沖突)。
1.2基于軟件包的軟件管理技術
當前主流的開源操作系統使用軟件包來抽象地表示一個可安裝的軟件單位,并提供相應的軟件包管理和分發系統,對各種互相依賴的軟件包進行管理,輔助用戶獲取、安裝、刪除或更新所需的軟件包;為解決開源軟件從開發結束到正常使用的矛盾,提供了一個通用的部署平臺。軟件包中含有所發布軟件的程序、數據和配置文件,并帶有一定的元數據。這些元數據描述了軟件包的名稱、版本、依賴關系等信息,供軟件包管理和分發系統使用。1)軟件包分發分發是指由開源發行平臺(如Debian、Gentoo)維護,針對自身平臺特點,由專門的維護人員導入/更新開源項目源碼,最終將生成的軟件包以體系結構、版本號予以標志存放的存儲集合。分發部分是連接開源軟件項目到平臺最終用戶的橋梁,通過網絡向外提供軟件包信息獲取和下載的服務。
2)軟件包管理負責在用戶端對軟件包格式和內容進行解析,實現軟件包具體的安裝、更新和刪除操作。包管理軟件在處理新裝軟件包的依賴關系時,可以借助分發部分提供的服務,從分發存儲池中獲取所需的軟件包,實現用戶端操作的自動化。在客戶端的文件操作過程中,文件目錄按照規范存放[5],減小不同發行版本之間的差異。
這兩部分構成了一個完整的軟件管理系統,使得開源軟件的獲取、本地管理、依賴關系處理均得到了較好的解決。
2主流開源軟件管理技術介紹
2.1Apt/dpkg
Apt/dpkg由Debian發行版提供[6],發布deb格式的軟件包。它由ar工具對deb標志文件段、控制文件和安裝文件壓縮生成。在控制文件中,描述了該軟件包的依賴和沖突關系,包含安裝、卸載和更新的腳本。Dpkg通過讀取軟件包內容進行軟件包的安裝,同時記錄控制文件中的信息,實現進一步的維護(更新或刪除),也為依賴關系和安裝故障處理提供了必備的參考信息。在依賴關系處理方面,軟件包的依賴關系通過讀取控制文件中depends、recommends、suggests和conflicts等關系來獲??;每項可以指定依賴的軟件包名字和版本號碼,并可以通過邏輯運算符的組合,提供更強的表述能力。
針對某個遠程分發源,apt可以將該分發源中所提供的軟件包信息列表下載到本地,構建本地軟件包描述和依賴關系數據庫,并通過cache方式向外提供查詢服務。在安裝新軟件包時,apt首先調用dpkg從本地的cache中讀取該軟件包的信息,以此預先計算出依賴關系。由apt自動從分發源中獲取依賴軟件包,調用dpkg從依賴關系的最底層以此向上進行軟件包的安裝。
2.2Yum/RPM
RPM由Red Hat發行版提供[7],其軟件包的生成以源碼包和patch文件為基礎。包制作者通過給出spec文件控制軟件包的制作。RPM對spec文件進行了分段描述,段中分別指定了當前的源代碼和補丁文件,準備、制作和安裝軟件包所需的shell命令,以及該軟件包的名稱、版本和依賴關系等信息。同時,RPM提供了大量的預定義宏以方便spec文件的書寫和條件編譯語法來輔助多平臺軟件包的編譯生成。
RPM可以發布源碼和二進制格式的軟件包。這些管理功能的實現依賴于RPM在用戶端維護的包信息數據庫,該數據庫基于簡單的動態分配機制進行數據存儲,并使用Berkeley db進行哈希索引。
而yum使用python語言編寫,由美國Duke大學Linux小組開發[8]。它基于RPM包管理功能,向用戶提供上層依賴關系處理,自動與分發存儲池交互以獲取滿足依賴關系所需的軟件包,進而調用RPM進行依賴軟件包的安裝或更新,實現分發功能。
2.3BSD ports/package
Ports/package是FreeBSD中支持的軟件包管理系統,分別對源碼格式和二進制格式的軟件包進行管理,兩種方式共享軟件包信息數據集[9]。Ports系統是用來發布和管理源碼包的,它發布包的最大特點是源碼包與ports樹信息是分離的。它所發布的是未經修改的源碼包,而補丁和其他控制文件存放在ports系統的樹狀目錄中。因此,ports的軟件包發布可以分散在四處,而ports樹的更新必須是集中統一的;軟件包分發和包管理信息的分發是分離的。
Ports系統通過makefile來進行軟件包管理,它的整個架構是基于make和bash環境的。Ports系統為makefile的書寫給出了一定的格式和大量預定義的宏,主要是為了處理依賴和沖突關系,定義多個變量,詳細指定了一個軟件包在下載、解壓、編譯、運行等時機的依賴環境。這樣,ports系統就把解決依賴關系的計算交給了make,而不再由自己實現。BSD package則直接對二進制軟件包進行管理,已安裝軟件包的數據信息按軟件包以對應文件的方式存在系統中。Ports方式支持分布式的軟件分發,除在配置系統級別指定ports目錄更新地址和ports包獲取地址外,軟件包自身的makefile中也可以指定軟件分發地址。系統也可以指定遠程獲取二進制包的地址。
2.4Portage
Portage由Gentoo發行版提供,它基于BSD ports的基本思路,使用python和bash腳本編寫,主要處理源碼格式的軟件包[10]。軟件包按種類分目錄存放,形成portage樹,其版本信息則存放在自身目錄下的ebuild文件中。Ebuild文件由shell變量和函數組成,實現軟件包的安裝和管理,并使用USE標簽來標記系統級的軟件包配置。
Portage在遠程具有統一的分發存儲池,包含各種不同版本的持續更新軟件包,由用戶來決定在本地安裝軟件包的版本號。Portage對軟件包以標簽的方式進行標志,并支持邏輯運算符,如“x86 ppc ~alpahhppa”表示該軟件包可以在x86和ppc上可用,在hppa上不可用,在alpha上未經充分測試。Emerge命令可以看做是對BSD ports中的make命令的封裝,用戶使用emerge命令對軟件包進行查找、安裝和刪除等操作。
3總體比較與分析
3.1對比
在apt/dpkg、yum/RPM,BSD ports和portage這四種軟件管理系統中,它們存在著一定的共同點,但也具有各自的特點,如表1所示。
這四種系統都具有遠程的軟件包分發源,由專門的維護人員統一發布軟件包信息,在分發端首先進行完整性保護。在apt和yum中,系統從同一遠程站點獲取包描述信息和包自身;在ports和portage中,包描述信息(makefile和ebuild文件)包含了足夠的源碼編譯條件,可以在其他站點獲取源碼包。
與yum/RPM不同,apt/dpkg系統在發布方面的一個特點是它同時維護多個不同版本的分發池,即stable、testing和unstable(軟件的最新源碼生成軟件包后,首先進入unstable,通過對其測試可能逐步進入testing和stable),這使得二進制包的發布流程更加易于管理,并適用于不同的應用領域。
RPM對軟件包管理的特點主要體現在它對軟件包所包含文件的控制和記錄上。它能夠保護用戶已修改的或是軟件包之間共享的配置文件,這在apt和portage中也有實現。除配置文件的保護外,RPM能夠對指定的文件(在spec文件中定義)進行驗證和修復。另外,RPM中提供了狀態回滾機制,它通過系統中的軟件安裝狀態記錄來實現,但將耗費大量的磁盤空間。Yum在功能上與apt基本相當,但目前尚缺乏基于yum的友好圖形端工具(apt擁有synaptic、gnomeappinstall和KPac ̄kage等)。
與deb與RPM主要以二進制方式發布不同,BSD ports和Gentoo portage關注的是源碼包,通過對源碼包的編譯實現安裝。這兩種系統功能得以實現的基礎是一系列的編譯配置腳本,分別對應于BSD ports的makefiles和portage中的ebuilds文件。軟件包以源碼方式,可以借助GNU autoconf和automake對軟件進行本地優化,也提供給用戶自定義配置的機會。另外,ports系統中包的分發和包管理信息的分發可以異步進行;ports樹就是一個全部的包管理信息描述,而不僅僅是某臺發布服務器上包信息的索引,從而以一個宏觀角度描述整個包管理系統。
Gentoo portage基于BSD ports的思想,但具有一些新的特性,包括提供對應于ports中make的上層命令emerge;軟件包之間的條件依賴關系(ifthen)和邏輯依賴關系(與或非)處理;portage樹中可以包含同一軟件包的不同版本、安裝過程的安全沙盒模式等。為緩解源碼編譯安裝耗時的問題,portage中內建了對分布式編譯(distcc)和緩存編譯(ccache)的支持,極大地提高了編譯速度。Portage的另一個特點是其內建腳本功能強大,除其他系統中具備的自定義安裝、刪除腳本外,還能夠對服務程序的啟動腳本(initscript)進行控制,在需要時自動啟動、暫?;蜿P閉服務,改變服務的運行狀態。這一功能在其他三種技術中沒有提供。
3.2總結
通過以上的介紹與對比,給出開源平臺下軟件管理一般結構的總結,如圖1所示。圖中的VCS指版本控制系統(version control system,如CVS);i386和sparc指代不同的體系結構;v1、v2標志軟件包的不同版本名稱。一般而言,版本名稱是軟件名、版本號和平臺號的組合。
軟件包的描述與生成在整個管理系統中占據基礎地位,它直接影響著軟件包的分發與管理。分發部分(如apt、yum)借助包生成工具對數量巨大、關系復雜的開源項目進行平臺化和版本化,標志出軟件包描述信息和依賴關系,以分發存儲池的方式向外提供相對完整的軟件包總體信息;包管理部分(如RPM和dpkg)則在解析軟件包結構和信息完成基本包管理操作的同時,負責與分發系統進行通信,自動對依賴關系進行處理。這兩部分相互協作,形成了開源平臺下完整的分發管理系統,彌補了開源項目從開發結束到用戶端部署的差異性,增加了整個軟件系統的可用性和易用性。
盡管當前主流技術在功能上大體相當,但其具體實現,特別是軟件包的組織結構仍存在著較大差異[11]。為解決軟件包的互用問題,Alien[12]等開源項目已實現了不同格式軟件包(如.rpm、.deb、.slp和.tgz)的互相轉換,這將進一步便于用戶對軟件包的管理。
4未來展望
隨著開源平臺和軟件的不斷發展,軟件包分發管理的功能也擴展到了一些新的領域。例如,將開源平臺作為軟件包納入管理范疇,實現kernel和系統整體的更新管理(apt已實現將Linux kernel作為軟件包更新管理);將軟件的系統安全策略(如SELinux和FreeBSD MAC策略)在軟件包管理中進行部署和配置[13],把軟件及其缺省安全策略通過軟件包綁定,從而簡化開源項目在安全操作系統的安裝和部署;對包含后臺服務的軟件包提供進一步支持,包括服務程序運行狀態的確定,在軟件包安裝、更新和刪除時自動啟動和關閉服務(這在Gentoo por ̄tage中已有了初步的實現)。另外對軟件包描述的標簽化也是一個主流發展方向。Portage中USE tags目前走在前列;apt/dpkg中相應debTags功能目前尚在開發和初步集成測試中。
這些功能的擴展與實現,需要對軟件包的格式和描述語言進行分析與改進[14],相應調整分發管理系統,以適應不同的應用需求,便于最終用戶的使用。另外,當前各發行版本差異很大,軟件管理系統自身尚缺乏充分的形式化分析,這些都有待于作進一步的研究。
參考文獻:
[1]CARZANIGA A, FUGGETTA A, HALL R S, et al. A characterization framework for software deployment technologies,CUCS-857-98[R].[S.l.]:University of Colorado, 1998.
[2]van der STORM T. Variability and component composition[C]//Bosch J. Proc of the 8th International Conference on Software Reuse, LNCS 3107. Heidelberg: Springer, 2004:86100.
[3]LABELLE N, WALLINGFORD E. Interpackage dependency networks in opensource software[EB/OL].(200411-09)[2006-04-28].http://arxiv.org/pdf/cs.SE/0411096.
[4]WEISS D. Quantitative analysis of open source projects on sourceForge[C]//Proc of the 1st International Conference on Open Source Systems. Genova, Italy: OSS, 2005:140147.
[5]Free Standards Group. Filesystem hierarchy standard[EB/OL]. http://www.pathname.com/fhs/.
[6]Debian GNU/Linux Project. Debian policy manual[EB/OL]. http://debian.org/doc/debianpolicy/.
[7]BAILEY E C. Maximum RPM[EB/OL]. http://www.rpm.org/maxrpm/.
[8]BAUER M. Using yum for RPM updates[J]. Linux Journal, 2004,6:34-36.
[9]The FreeBSD Documentation Project. FreeBSD porter’s handbook[EB/OL]. http://www. freebsd.org/.
[10]Gentoo Project. Gentoo developer handbook[EB/OL]. http://www.gentoo.org/proj/en/devrel/handbook/handbook.xml.
[11]HESS J. Comparing Linux/UNIX binary package formats [EB/OL]. http://kitenet.net/~joey/pkgcomp/.
[12]HESS J. Alien[EB/OL]. http://www.kitenet.net/programs/alien/.
[13]LEVERT C, DAGENAIS M. Security policy generation through pac ̄kage management[EB/OL]. http://www.linux.ericsson.ca/dsi/pmdspol_ols.pdf.
[14TUCKER D B, KRISHNAMURTHI S. Applying module system research to package management [EB/OL].http://www.ics.uci.edu/andre/scm10/papers/tucker.pdf.
[15]汪廣怡,龍源,張士鋒,等. 一個面向組件的軟件分發框架[J]. 計算機工程,2000,26(7):72-73.
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”