鍍金池/ 教程/ Linux/ layout: book-zh title: 軟件包管理
網(wǎng)絡系統(tǒng)
打印
重定向
使用命令
位置參數(shù)
權限
文本處理
疑難排解
layout: book-zh title: 自定制 shell 提示符
查找文件
layout: book-zh title: vi 簡介
shell 環(huán)境
什么是 shell
編譯程序
鍵盤高級操作技巧
流程控制:case 分支
流程控制:if 分支結構
layout: book-zh title: 軟件包管理
進程
存儲媒介
格式化輸出
編寫第一個 Shell 腳本
啟動一個項目
流程控制:while/until 循環(huán)
文件系統(tǒng)中跳轉
字符串和數(shù)字
讀取鍵盤輸入
歸檔和備份
探究操作系統(tǒng)
流程控制:for 循環(huán)
自頂向下設計
數(shù)組
操作文件和目錄
奇珍異寶
從 shell 眼中看世界
正則表達式

layout: book-zh title: 軟件包管理


layout: book-zh title: 軟件包管理

如果我們花些時間在 Linux 社區(qū)里,我們會得知很多針對, 類如在眾多 Linux 發(fā)行版中哪個是最好的(等問題的)看法。 這些集中在像這些事情上的討論,比方說最漂亮的桌面背景(一些人不使用 Ubuntu, 只是因為 Ubuntu 默認主題顏色是棕色的!)和其它的瑣碎東西,經(jīng)常變得非常無聊。

Linux 發(fā)行版本質(zhì)量最重要的決定因素是軟件包管理系統(tǒng)和其支持社區(qū)的持久性。隨著我們 花更多的時間在 Linux 上,我們會發(fā)現(xiàn)它的軟件園地是非常動態(tài)的。軟件不斷變化。大多數(shù)一線 Linux 發(fā)行版每隔六個月發(fā)布一個新版本,并且許多獨立的程序每天都會更新。為了能和這些 如暴風雪一般多的軟件保持聯(lián)系,我們需要一些好工具來進行軟件包管理。

軟件包管理是指系統(tǒng)中一種安裝和維護軟件的方法。今天,通過從 Linux 發(fā)行版中安裝的軟件包, 已能滿足許多人所有需要的軟件。這不同于早期的 Linux,人們需要下載和編輯源碼來安裝軟件。 編輯源碼沒有任何問題,事實上,擁有對源碼的訪問權限是 Linux 的偉大奇跡。它賦予我們( 其它每個人)才干來檢測和提高系統(tǒng)性能。只是若有一個預先編譯好的軟件包處理起來要相對 容易快速些。這章中,我們將查看一些用于包管理的命令行工具。雖然所有主流 Linux 發(fā)行版都 提供了強大且精致的圖形管理程序來維護系統(tǒng),但是學習命令行程序也非常重要。因為它們 可以完成許多讓圖形化管理程序處理起來困難(或者不可能)的任務。

打包系統(tǒng)

不同的 Linux 發(fā)行版使用不同的打包系統(tǒng),一般而言,大多數(shù)發(fā)行版分別屬于兩大包管理技術陣營: Debian 的".deb",和紅帽的".rpm"。也有一些重要的例外,比方說 Gentoo, Slackware,和 Foresight,但大多數(shù)會使用這兩個基本系統(tǒng)中的一個。

表15-1: 主要的包管理系統(tǒng)家族
包管理系統(tǒng) 發(fā)行版 (部分列表)
Debian Style (.deb) Debian, Ubuntu, Xandros, Linspire
Red Hat Style (.rpm) Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS

軟件包管理系統(tǒng)是怎樣工作的

在專有軟件產(chǎn)業(yè)中找到的軟件發(fā)布方法通常需要買一張安裝媒介,比方說"安裝盤",然后運行 "安裝向?qū)?quot;,來在系統(tǒng)中安裝新的應用程序。

Linux 不是這樣。Linux 系統(tǒng)中幾乎所有的軟件都可以在互聯(lián)網(wǎng)上找到。其中大多數(shù)軟件由發(fā)行商以 包文件的形式提供,剩下的則以源碼形式存在,可以手動安裝。在后面章節(jié)里,我們將會談談怎樣 通過編譯源碼來安裝軟件。

包文件

在包管理系統(tǒng)中軟件的基本單元是包文件。包文件是一個構成軟件包的文件壓縮集合。一個軟件包 可能由大量程序以及支持這些程序的數(shù)據(jù)文件組成。除了安裝文件之外,軟件包文件也包括 關于這個包的元數(shù)據(jù),如軟件包及其內(nèi)容的文本說明。另外,許多軟件包還包括預安裝和安裝后腳本, 這些腳本用來在軟件安裝之前和之后執(zhí)行配置任務。

軟件包文件是由軟件包維護者創(chuàng)建的,他通常是(但不總是)一名軟件發(fā)行商的雇員。軟件維護者 從上游提供商(程序作者)那里得到軟件源碼,然后編輯源碼,創(chuàng)建軟件包元數(shù)據(jù)以及所需要的 安裝腳本。通常,軟件包維護者要把所做的修改應用到最初的源碼當中,來提高此軟件與 Linux 發(fā)行版其它部分的融合性。

資源庫

雖然某些軟件項目選擇執(zhí)行他們自己的打包和發(fā)布策略,但是現(xiàn)在大多數(shù)軟件包是由發(fā)行商和感興趣 的第三方創(chuàng)建的。系統(tǒng)發(fā)行版的用戶可以在一個中心資源庫中得到這些軟件包,這個資源庫可能 包含了成千上萬個軟件包,每一個軟件包都是專門為這個系統(tǒng)發(fā)行版建立和維護的。

因軟件開發(fā)生命周期不同階段的需要,一個系統(tǒng)發(fā)行版可能維護著幾個不同的資源庫。例如,通常會 有一個"測試"資源庫,其中包含剛剛建立的軟件包,它們想要勇敢的用戶來使用, 在這些軟件包正式發(fā)布之前,讓用戶查找錯誤。系統(tǒng)發(fā)行版經(jīng)常會有一個"開發(fā)"資源庫, 這個資源庫中保存著注定要包含到下一個主要版本中的半成品軟件包。

一個系統(tǒng)發(fā)行版可能也會擁有相關第三方的資源庫。這些資源庫需要支持一些因法律原因, 比如說專利或者是 DRM 反規(guī)避問題,而不能被包含到發(fā)行版中的軟件。可能最著名的案例就是 那個加密的 DVD 支持,在美國這是不合法的。第三方資源庫在這些軟件專利和反規(guī)避法案不 生效的國家中起作用。這些資源庫通常完全地獨立于它們所支持的資源庫,要想使用它們, 你必須了解它們,手動地把它們包含到軟件包管理系統(tǒng)的配置文件中。

依賴性

程序很少是"孤立的",而是依賴于其它軟件組件來完成它們的工作。常見活動,以 輸入/輸出為例,就是由共享程序例程來處理的。這些程序例程存儲在共享庫中,共享庫不只 為一個程序提供基本服務。如果一個軟件包需要共享資源,比如說共享庫,據(jù)說就有一個依賴。 現(xiàn)代的軟件包管理系統(tǒng)都提供了一些依賴項解析方法,以此來確保當安裝軟件包時,也安裝了 其所有的依賴程序。

上層和底層軟件包工具

軟件包管理系統(tǒng)通常由兩種工具類型組成:底層工具用來處理這些任務,比方說安裝和刪除軟件包文件, 和上層工具,完成元數(shù)據(jù)搜索和依賴解析。在這一章中,我們將看一下由 Debian 風格的系統(tǒng) (比如說 Ubuntu,還有許多其它系統(tǒng))提供的工具,還有那些由 Red Hat 產(chǎn)品使用的工具。雖然所有基于 Red Hat 風格的發(fā)行版都依賴于相同的底層程序(rpm), 但是它們卻使用不同的上層工具。我們將研究上層程序 yum 供我們討論,F(xiàn)edora, Red Hat 企業(yè)版,和 CentOs 都是使用 yum。其它基于 Red Hat 風格的發(fā)行版提供了帶有可比較特性的上層工具。

表15-2: 包管理工具
發(fā)行版 底層工具 上層工具
Debian-Style dpkg apt-get, aptitude
Fedora, Red Hat Enterprise Linux, CentOS rpm yum

常見軟件包管理任務

通過命令行軟件包管理工具可以完成許多操作。我們將會看一下最常用的工具。注意底層工具也 支持軟件包文件的創(chuàng)建,這個話題超出了本書敘述的范圍。在以下的討論中,"package_name" 這個術語是指軟件包實際名稱,而不是指"package_file",它是包含在軟件包中的文件名。

查找資源庫中的軟件包

使用上層工具來搜索資源庫元數(shù)據(jù),可以根據(jù)軟件包的名字和說明來定位它。

表15-3: 軟件包查找工具
風格 命令
Debian apt-get update; apt-cache search search_string
Red Hat yum search search_string

例如:搜索一個 yum 資源庫來查找 emacs 文本編輯器,使用以下命令:

yum search emacs

從資源庫中安裝一個軟件包

上層工具允許從一個資源庫中下載一個軟件包,并經(jīng)過完全依賴解析來安裝它。

表15-4: 軟件包安裝命令
風格 命令
Debian apt-get update; apt-get install package_name
Red Hat yum install package_name

例如:從一個 apt 資源庫來安裝 emacs 文本編輯器:

apt-get update; apt-get install emacs

通過軟件包文件來安裝軟件

如果從某處而不是從資源庫中下載了一個軟件包文件,可以使用底層工具來直接(沒有經(jīng)過依賴解析)安裝它。

表15-5: 底層軟件包安裝命令
風格 命令
Debian dpkg --install package_file
Red Hat rpm -i package_file

例如:如果已經(jīng)從一個并非資源庫的網(wǎng)站下載了軟件包文件 emacs-22.1-7.fc7-i386.rpm, 則可以通過這種方法來安裝它:

rpm -i emacs-22.1-7.fc7-i386.rpm

注意:因為這項技術使用底層的 rpm 程序來執(zhí)行安裝任務,所以沒有運行依賴解析。 如果 rpm 程序發(fā)現(xiàn)缺少了一個依賴,則會報錯并退出。


卸載軟件

可以使用上層或者底層工具來卸載軟件。下面是可用的上層工具。

表15-6: 軟件包刪除命令
風格 命令
Debian apt-get remove package_name
Red Hat yum erase package_name

例如:從 Debian 風格的系統(tǒng)中卸載 emacs 軟件包:

apt-get remove emacs

經(jīng)過資源庫來更新軟件包

最常見的軟件包管理任務是保持系統(tǒng)中的軟件包都是最新的。上層工具僅需一步就能完成 這個至關重要的任務。

表15-7: 軟件包更新命令
風格 命令
Debian apt-get update; apt-get upgrade
Red Hat yum update

例如:更新安裝在 Debian 風格系統(tǒng)中的軟件包:

apt-get update; apt-get upgrade

經(jīng)過軟件包文件來升級軟件

如果已經(jīng)從一個非資源庫網(wǎng)站下載了一個軟件包的最新版本,可以安裝這個版本,用它來 替代先前的版本:

表15-8: 底層軟件包升級命令
風格 命令
Debian dpkg --install package_file
Red Hat rpm -U package_file

例如:把 Red Hat 系統(tǒng)中所安裝的 emacs 的版本更新到軟件包文件 emacs-22.1-7.fc7-i386.rpmz 所包含的 emacs 版本。

rpm -U emacs-22.1-7.fc7-i386.rpm

注意:rpm 程序安裝一個軟件包和升級一個軟件包所用的選項是不同的,而 dpkg 程序所用的選項是相同的。

列出所安裝的軟件包

下表中的命令可以用來顯示安裝到系統(tǒng)中的所有軟件包列表:

表15-9: 列出所安裝的軟件包命令
風格 命令
Debian dpkg --list
Red Hat rpm -qa

確定是否安裝了一個軟件包

這些底端工具可以用來顯示是否安裝了一個指定的軟件包:

表15-10: 軟件包狀態(tài)命令
風格 命令
Debian dpkg --status package_name
Red Hat rpm -q package_name

例如:確定是否 Debian 風格的系統(tǒng)中安裝了這個 emacs 軟件包:

dpkg --status emacs

顯示所安裝軟件包的信息

如果知道了所安裝軟件包的名字,使用以下命令可以顯示這個軟件包的說明信息:

表15-11: 查看軟件包信息命令
風格 命令
Debian apt-cache show package_name
Red Hat yum info package_name

例如:查看 Debian 風格的系統(tǒng)中 emacs 軟件包的說明信息:

apt-cache show emacs

查找安裝了某個文件的軟件包

確定哪個軟件包對所安裝的某個特殊文件負責,使用下表中的命令:

表15-12: 包文件識別命令
風格 命令
Debian dpkg --search file_name
Red Hat rpm -qf file_name

例如:在 Red Hat 系統(tǒng)中,查看哪個軟件包安裝了/usr/bin/vim 這個文件

rpm -qf /usr/bin/vim

總結歸納

在隨后的章節(jié)里面,我們將探討許多不同的程序,這些程序涵蓋了廣泛的應用程序領域。雖然 大多數(shù)程序一般是默認安裝的,但是若所需程序沒有安裝在系統(tǒng)中,那么我們可能需要安裝額外的軟件包。 通過我們新學到的(和了解的)軟件包管理知識,我們應該沒有問題來安裝和管理所需的程序。

Linux 軟件安裝謠言

從其它平臺遷移過來的用戶有時會成為謠言的受害者,說是在 Linux 系統(tǒng)中,安裝軟件有些 困難,并且不同系統(tǒng)發(fā)行版所使用的各種各樣的打包方案是一個障礙。唉,它是一個障礙, 但只是針對于那些希望把他們的秘密軟件只以二進制版本發(fā)行的專有軟件供應商。

Linux 軟件生態(tài)系統(tǒng)是基于開放源代碼理念。如果一個程序開發(fā)人員發(fā)布了一款產(chǎn)品的 源碼,那么與系統(tǒng)發(fā)行版相關聯(lián)的開發(fā)人員可能就會把這款產(chǎn)品打包,并把它包含在 他們的資源庫中。這種方法保證了這款產(chǎn)品能很好地與系統(tǒng)發(fā)行版整合在一起,同時為用戶 “一站式采購”軟件提供了方便,從而用戶不必去搜索每個產(chǎn)品的網(wǎng)站。

設備驅(qū)動差不多也以同樣的方式來處理,但它們不是系統(tǒng)發(fā)行版資源庫中單獨的項目, 它們本身是 Linux 系統(tǒng)內(nèi)核的一部分。一般來說,在 Linux 當中沒有一個類似于“驅(qū)動盤”的東西。 要不內(nèi)核支持一個設備,要不不支持,反正 Linux 內(nèi)核支持很多設備,事實上,多于 Windows 所支持的設備數(shù)目。當然,如果你需要的特定設備不被支持,這里也沒有安慰。當那種情況 發(fā)生時,你需要查找一下原因。缺少驅(qū)動程序支持通常是由以下三種情況之一導致:

  1. 設備太新。 因為許多硬件供應商沒有積極地支持 Linux 的發(fā)展,那么編寫內(nèi)核 驅(qū)動代碼的任務就由一些 Linux 社區(qū)來承擔,而這需要花費時間。

  2. 設備太奇異。 不是所有的發(fā)行版都包含每個可能的設備驅(qū)動。每個發(fā)行版會建立 它們自己的內(nèi)核,因為內(nèi)核是可以配置的(這使得從手表到主機的每臺設備上運行 Linux 成為可能), 這樣它們可能會忽略某個特殊設備。通過定位和下載驅(qū)動程序的源碼,可能需要你自己(是的,由你) 來編譯和安裝驅(qū)動。這個過程不是很難,而是參與。我們將在隨后的章節(jié)里來討論編譯軟件。

  3. 硬件供應商隱藏信息。 他們既不發(fā)布應用于 Linux 系統(tǒng)的驅(qū)動程序代碼, 也不發(fā)布技術文檔來讓某人創(chuàng)建它。這意味著硬件供應商試圖保密此設備的程序接口。因為我們 不想在計算機中使用保密的設備,所以我建議刪除這令人厭惡的軟件, 把它和其它無用的項目都仍到垃圾桶里。

拓展閱讀

花些時間來了解你所用發(fā)行版中的軟件包管理系統(tǒng)。每個發(fā)行版都提供了關于自帶軟件包管理工具的 文檔。另外,這里有一些更普遍的資源:

上一篇:存儲媒介下一篇:使用命令