軟體包管理系統的基本概念
Software Package Management System
Basics
▲Linux logo(原始雛型作者:Larry Ewig)跟軟體包圖示
(Creative Commons Attribution-Share Alike 3.0,
來自 GNOME Project(http://www.gnome.org))
除非另外獨立聲明,本作品之內容採用「創用 CC-BY-SA 3.0 台灣地區版本或其後版本」授權條款釋出供所有人使用
於下列條件的限制下您可以自由使用本作品之內容於任何用途:
如您不確定您的使用方式是否合乎此授權條款,敬請參閱
本作品同時仍於「合理使用(fair use)」之有限範圍下使用其他資源,將於可行範圍內另外註明其著作權擁有者(copyright holder)與其授權條款,如需了解如何使用該類資源敬請參閱
如果有任何需求,敬請不吝來信洽詢
感謝您的配合,並祝您使用愉快!
本作品所採用的授權條款
License Applied to This Work
軟體包管理系統?
Software Package Management System?
用來詮釋「軟體包們」的軟體包--詮釋用軟體包
Package about Packages - Metapackage
軟體包管理系統
Software Package Management System
上游軟體開發者
Upstream Software Developer
軟體包打包者(維護者)
Software Package Packager(Maintainer)
軟體倉庫上傳者
Software Repository Uploader
軟體倉庫鏡像站
Software Repository Mirror Site
常見問題與解答
Frequently Asked Questions
本作品的貢獻者列表
The contributor list of this work
在 Windows 或 Mac 上要安裝一個軟體,您可能是透過 Web 瀏覽器中的某個網站或是商店獲得該軟體,執行某個「安裝程式」,然後一直按下一步最後按完成(喔,還有點擊「我同意」(笑))。
然而雖然在 GNU+Linux 作業系統中也是有這種「安裝程式」類型安裝軟體的方式,大多數 GNU+Linux 作業系統散佈版本(distribution)中通常會採用所謂的「軟體包管理系統(software package management system)」來管理系統中安裝的軟體。
什麼是軟體包管理系統呢?顧名思義,就是用來管理作業系統中所安裝的軟體包(software package) 的系統。撰文當時最著名的兩個軟體包管理系統為 Debian GNU+Linux 散佈版開發的 APT 與 RedHat 開發的 RPM 軟體包管理系統。
那什麼是軟體包(software package)呢?再一次地顧名思義,軟體包就是「軟體打包成一包」,跟一般我們常用的 ZIP 壓縮檔一樣,嚴格來說可以算是封存檔(archive)的一種。
軟體包含電腦程式(program)(包含但不限於可執行檔(executable)、程式庫(library)等)與程式的相關資源(包含但不限於說明文件、檔案圖示、圖像、授權條款等)。
可以(直接或間接地)變成機器語言(machine language)被電腦的中央處理器(CPU)載入執行的命令集合。
可以被直接開啟執行的程式檔案(如在 Windows 作業系統中底下副檔名為 exe(為 executable 的縮寫)GNU+Linux 作業系統中 bin/ 子目錄中下的檔案)為可執行檔。
不能被直接開啟執行,但是其中包含可被其他程式(program)呼叫(call)執行的可重覆利用的子程式(sub-program)的檔案。例如 Windows 作業系統中副檔名為 dll (dynamic-loaded library 的縮寫)、lib,GNU+Linux 作業系統中 lib/ 目錄下副檔名為 so、a 的檔案就是一種程式庫檔案。
顧名思義,只要是「軟體打成一包」就可以稱做軟體包(software package),例如 APT 軟體包管理系統中副檔名為 deb 的 Debian 軟體包以及 RPM 軟體包管理系統中副檔名為 rpm 的軟體包。
軟體包不一定要包含(可執行的)程式,軟體的程式庫可以單獨打包成一個軟體包,
▲libzip2 (zip 程式庫)軟體包內含檔案
軟體的說明文件可以單獨打包為一個軟體包(見下圖),
▲linux-doc (Linux 作業系統核心的說明文件)軟體包內含檔案
甚至圖片也可以打包為一個軟體包(見下圖)。
▲ubuntu-wallpapers-quantal (Ubuntu 12.10 官方桌面背景圖案)軟體包的內含檔案
簡而言之,只要是軟體的零件就可以打包成一個軟體包
那有些人會發現一個問題:「如果說我要安裝一個軟體,我要一次把該軟體所有的零件通通列舉出來一個一個安裝才能夠安裝好它嗎?」。不用這麼麻煩,因為軟體包內包含的不只是軟體的檔案,還包括稱做「軟體依賴關係(software dependency)」的資訊。
例如說 GIMP 圖片處理軟體(http://www.gimp.org/)需要 Jpeg 格式圖片的解碼程式庫來顯示 Jpeg 格式的圖片,提供 GIMP 的「gimp」軟體包 的軟體依賴關係資訊中就會有「我依賴 JPEG 解碼程式庫的軟體包(而且版本至少要跟 8c 一樣新)」的資訊(如下圖)。
所以只要軟體包把有它的零件的軟體包通通列成「它所依賴的軟體包」就能在安裝時讓軟體包管理系統透過軟體依賴關係資訊通通將它們安裝起來,是不是很方便啊?
軟體依賴關係資訊並不只是包含「依賴(depend)」跟「被依賴(be depended)」的關係唷,還包括衝突(conflict)(A 軟體包不能跟 B 軟體包同時安裝在系統中,同時裝會壞掉)、建議(recommend)(A 軟體包建議你也可以同時裝 D、E 軟體包(裝了可能會增加更多進階功能或是增加您的使用者體驗(User eXperience)),但是您也可以選擇不裝(因為它沒用、佔磁碟空間或是跟另一個安裝於系統中的軟體包互相衝突裝不進去))等等。例如 genisoimage 軟體本身為 mkisofs 軟體的分支版本(fork),會安裝相同的檔案,所以不能一起被安裝到系統上呢(見下圖)。
軟體包管理系統通常會儘量在不移除原本就已安裝的軟體包的前提下安裝所有該裝的軟體包(找出安裝方式的過程稱做「求解(solve)」,可以類比成解數學題利用已知的多個方程式來求解出各個未知數的實際數值),但是有時候會出現沒有完美解決方案的情況,這時候軟體包管理系統可以採取兩種措施:
某些軟體是「套裝軟體(suite software)」的一部份,例如微軟(Microsoft)公司所開發的 Microsoft Office 辦公室生產力套裝軟體即包含了 Microsoft Word 文書處理軟體、Microsoft Excel 試算表軟體、Microsoft Powerpoint 簡報軟體、Microsoft Outlook 郵件客戶端與行事曆軟體、Microsoft Access 資料庫系統軟體等軟體。這些元件可以獨立安裝,彼此不互相依賴,那在軟體包管理系統中要如何來應對呢?這就是「用來詮釋『軟體包們』的軟體包」,metapackage 的用處了!
如同 metadata 是「用來詮釋『資料』的資料(data about data)」(例如音樂檔案的 ID3 標籤可儲存歌曲歌手、專輯名稱、歌詞等資訊就是一種 metadata(「用來詮釋『音樂的音訊資料』的資料」)),詮釋用軟體包(metapackage)就是「用來詮釋『軟體包們』的軟體包(package about packages)」;例如 Microsoft Office 的自由軟體替代方案,LibreOffice 在 Ubuntu Linux 散佈版中就有一個名稱同樣為 “libreoffice” 的軟體包,該軟體包實際上並無安裝任何該軟體的檔案,但是它依賴了底下代表各個獨立元件的軟體包所以當它被安裝時就會自動把所有的 LibreOffice 組成元件連帶安裝起來。它可以「詮釋『LibreOffice 套裝軟體的所有軟體包』」,所以它是一個 metapackage 唷!
以下是一些常見的 metapackage ,這樣以後安裝某些套裝軟體是不是非常方便呢?
軟體包名稱 | 軟體包所詮釋的軟體 |
ubuntu-desktop | 「整個」 Ubuntu 桌面版作業系統 |
xubuntu-desktop | 「整個」 Xubuntu 桌面版作業系統 |
kde-standard | K 桌面環境(KDE) |
gnome | GNOME 桌面環境 |
xfce4 | XFCE 桌面環境 |
lxde | LXDE 桌面環境 |
那軟體包管理系統所安裝的軟體到底來源於何處呢?答案是軟體包管理系統都會有一份軟體來源(software source)的設定告訴系統要從哪裡獲取軟體。軟體包管理系統會從軟體來源獲取一些資訊(例如軟體來源中有哪些軟體包、軟體包的版本以及軟體包之間的依賴關係等)存放在記憶體中當作快取(cache)資料,使用者想要找哪個軟體時就可以直接從本地資料得到答案而不用連上軟體來源查詢。
顧名思義軟體倉庫就像倉庫一樣,
▲圖片取自 Alfresco tie-in in Moodle 2.0 | The Moodleman Blog,原始作者不明。
是存放很多軟體包,供使用者獲取使用的場所。軟體來源設定中定義了多個軟體倉庫(software repository)的所在地址(可能是網路上的地址或是本地的某個媒體例如系統的安裝光碟等)(如下圖)。
通常軟體倉庫會提供用來驗證使用者所獲得的軟體包的有效性(是的。有人想欺騙您這是真的軟體包讓您把奇怪的東西安裝到系統中的可能性還是存在的)的公共密鑰(public key)讓使用者匯入系統中來校驗軟體包,如果發現校驗失敗軟體包管理系統就會對使用者發出警告。
事實上前面所提到的軟體包的定義是狹隘的,更嚴謹的名稱是叫作「二進位碼軟體包(binary package)」。這個名稱源自於早期的程式通常需建構(build)(簡單來說就是翻譯)成二進位的機器語言(machine language)才能被運行所致,所以二進位軟體包指的就是「包含建構好的軟體的軟體包」了。
既然有建構出來的成品的軟體包那大家應該可以猜到也有建構前的「原料」的軟體包囉!這種就叫作「來源碼軟體包(source package)」,除了可能包含了軟體的來源程式碼以及一些作為「原料」的檔案之外,來源軟體包還包含了「如何做出二進位軟體包」的資料喔(例如該軟體的安裝程式以及軟體依賴關係資訊等)。
最後再回來主題,也就是「軟體包管理系統」上了:)。
不單單只是安裝或移除軟體,軟體包管理系統還負責軟體更新升級的重要任務呢!在其他作業系統下軟體升級的方式相當複雜,有的軟體會自動更新,有的軟體發現有更新版本推出時會提示使用者升級,有的則完全不會告訴您,要您定期手動去檢查是不是有新版本可以用。這個問題在軟體包管理系統上就被迎刃而解了,只要是軟體包管理系統所管理的軟體在軟體來源上有更新版本就會自動提醒使用者去升級,所以只要您透過軟體包管理系統來安裝的軟體都會是最新版本(只要軟體來源都有持續被維護的話)。另外 GNU+Linux 作業系統散佈版的維護者也透過這個機制推送軟體資訊安全漏洞的修正到您的系統中保護您的安全呢!所以您說重不重要啊?
另外軟體包被解開安裝到系統中並不代表說軟體包就消失了喔!軟體包管理系統會紀錄各個軟體包所安裝的檔案、軟體的設定程式與相關資料,在安裝後也能繼續使用(例如我們可以於安裝某個軟體包之後重新設定某個軟體的設定)就好比我們買了一隻手機,包裝盒打開後我們還是把產品保證書、使用說明書、配件,甚至包裝盒本身等等保存到其他地方一樣。
▲使用 dpkg-reconfigure 命令重新設定
unattended-upgrades(無人干預系統升級支援) Debian 軟體包
此為實務上設計軟體的人,通常也是遇到軟體使用問題時最容易得到幫助的地方。
軟體包打包者顧名思義,就是自上游軟體開發者獲取軟體,維護軟體包之間的依賴關係與安裝/移除程式等資料並將軟體打包為來源碼軟體包或二進位碼軟體包的人
軟體包被上傳到軟體倉庫了之後就會提供給所有將該倉庫當作軟體來源的使用者下載。一個 GNU+Linux 散佈版可能會有上千萬名使用者使用,一台軟體倉庫伺服器根本沒有足夠的網路資源可以同時讓這麼多人存取資料,那要怎麼辦呢?所以軟體倉庫的鏡像站就出現了!鏡像站由各個地區的不同單位所贊助,藉由定期直接或間接地跟主要軟體倉庫伺服器同步資料,像一面鏡子那樣提供跟主要軟體倉庫伺服器一樣的內容供當地的使用者存取。所以我們只要選一個離我們比較近、網路頻寬比較充裕的鏡像站就能夠快速的獲取我們的軟體唷,很方便吧!
就是您!恭喜您看完本篇文章!希望能幫助您增加對軟體包管理系統的認識!
易取得但是可能會遺失或變動內容的資料來源
不易取得,但是相對比較不會消失(?)的資料來源
自由知識創作平台(http://goo.gl/8rcnA)協同創作者 © 2013-2019
第 頁/共 頁
回到目錄