如果我們花些時間在 Linux 社區(qū)里,我們會得知很多針對, 類如在眾多 Linux 發(fā)行版中哪個是最好的(等問題的)看法。 這些集中在像這些事情上的討論,比方說最漂亮的桌面背景(一些人不使用 Ubuntu, 只是因為 Ubuntu 默認(rèn)主題顏色是棕色的!)和其它的瑣碎東西,經(jīng)常變得非常無聊。
Linux 發(fā)行版本質(zhì)量最重要的決定因素是軟件包管理系統(tǒng)和其支持社區(qū)的持久性。隨著我們 花更多的時間在 Linux 上,我們會發(fā)現(xiàn)它的軟件園地是非常動態(tài)的。軟件不斷變化。大多數(shù)一線 Linux 發(fā)行版每隔六個月發(fā)布一個新版本,并且許多獨立的程序每天都會更新。為了能和這些 如暴風(fēng)雪一般多的軟件保持聯(lián)系,我們需要一些好工具來進行軟件包管理。
軟件包管理是指系統(tǒng)中一種安裝和維護軟件的方法。今天,通過從 Linux 發(fā)行版中安裝的軟件包, 已能滿足許多人所有需要的軟件。這不同于早期的 Linux,人們需要下載和編輯源碼來安裝軟件。 編輯源碼沒有任何問題,事實上,擁有對源碼的訪問權(quán)限是 Linux 的偉大奇跡。它賦予我們( 其它每個人)才干來檢測和提高系統(tǒng)性能。只是若有一個預(yù)先編譯好的軟件包處理起來要相對 容易快速些。這章中,我們將查看一些用于包管理的命令行工具。雖然所有主流 Linux 發(fā)行版都 提供了強大且精致的圖形管理程序來維護系統(tǒng),但是學(xué)習(xí)命令行程序也非常重要。因為它們 可以完成許多讓圖形化管理程序處理起來困難(或者不可能)的任務(wù)。
## 打包系統(tǒng)
不同的 Linux 發(fā)行版使用不同的打包系統(tǒng),一般而言,大多數(shù)發(fā)行版分別屬于兩大包管理技術(shù)陣營: 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ū)А保瑏碓谙到y(tǒng)中安裝新的應(yīng)用程序。
Linux 不是這樣。Linux 系統(tǒng)中幾乎所有的軟件都可以在互聯(lián)網(wǎng)上找到。其中大多數(shù)軟件由發(fā)行商以 包文件的形式提供,剩下的則以源碼形式存在,可以手動安裝。在后面章節(jié)里,我們將會談?wù)勗鯓?通過編譯源碼來安裝軟件。
## 包文件
在包管理系統(tǒng)中軟件的基本單元是包文件。包文件是一個構(gòu)成軟件包的文件壓縮集合。一個軟件包 可能由大量程序以及支持這些程序的數(shù)據(jù)文件組成。除了安裝文件之外,軟件包文件也包括 關(guān)于這個包的元數(shù)據(jù),如軟件包及其內(nèi)容的文本說明。另外,許多軟件包還包括預(yù)安裝和安裝后腳本, 這些腳本用來在軟件安裝之前和之后執(zhí)行配置任務(wù)。
軟件包文件是由軟件包維護者創(chuàng)建的,他通常是(但不總是)一名軟件發(fā)行商的雇員。軟件維護者 從上游提供商(程序作者)那里得到軟件源碼,然后編輯源碼,創(chuàng)建軟件包元數(shù)據(jù)以及所需要的 安裝腳本。通常,軟件包維護者要把所做的修改應(yīng)用到最初的源碼當(dāng)中,來提高此軟件與 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ā)行版可能也會擁有相關(guān)第三方的資源庫。這些資源庫需要支持一些因法律原因, 比如說專利或者是 DRM 反規(guī)避問題,而不能被包含到發(fā)行版中的軟件。可能最著名的案例就是 那個加密的 DVD 支持,在美國這是不合法的。第三方資源庫在這些軟件專利和反規(guī)避法案不 生效的國家中起作用。這些資源庫通常完全地獨立于它們所支持的資源庫,要想使用它們, 你必須了解它們,手動地把它們包含到軟件包管理系統(tǒng)的配置文件中。
## 依賴性
程序很少是”孤立的”,而是依賴于其它軟件組件來完成它們的工作。常見活動,以 輸入/輸出為例,就是由共享程序例程來處理的。這些程序例程存儲在共享庫中,共享庫不只 為一個程序提供基本服務(wù)。如果一個軟件包需要共享資源,比如說共享庫,據(jù)說就有一個依賴。 現(xiàn)代的軟件包管理系統(tǒng)都提供了一些依賴項解析方法,以此來確保當(dāng)安裝軟件包時,也安裝了 其所有的依賴程序。
## 上層和底層軟件包工具
軟件包管理系統(tǒng)通常由兩種工具類型組成:底層工具用來處理這些任務(wù),比方說安裝和刪除軟件包文件, 和上層工具,完成元數(shù)據(jù)搜索和依賴解析。在這一章中,我們將看一下由 Debian 風(fēng)格的系統(tǒng) (比如說 Ubuntu,還有許多其它系統(tǒng))提供的工具,還有那些由 Red Hat 產(chǎn)品使用的工具。雖然所有基于 Red Hat 風(fēng)格的發(fā)行版都依賴于相同的底層程序(rpm), 但是它們卻使用不同的上層工具。我們將研究上層程序 yum 供我們討論,F(xiàn)edora, Red Hat 企業(yè)版,和 CentOs 都是使用 yum。其它基于 Red Hat 風(fēng)格的發(fā)行版提供了帶有可比較特性的上層工具。
表15-2: 包管理工具
| 發(fā)行版 | 底層工具 | 上層工具 |
|---------|------------|---|
| Debian-Style | dpkg | apt-get, aptitude |
| Fedora, Red Hat Enterprise Linux, CentOS | rpm | yum |
### 常見軟件包管理任務(wù)
通過命令行軟件包管理工具可以完成許多操作。我們將會看一下最常用的工具。注意底層工具也 支持軟件包文件的創(chuàng)建,這個話題超出了本書敘述的范圍。在以下的討論中,”package_name” 這個術(shù)語是指軟件包實際名稱,而不是指”package_file”,它是包含在軟件包中的文件名。
## 查找資源庫中的軟件包
使用上層工具來搜索資源庫元數(shù)據(jù),可以根據(jù)軟件包的名字和說明來定位它。
表15-3: 軟件包查找工具
| 風(fēng)格 | 命令 |
|---------|------------|
| Debian | apt-get update; apt-cache search search_string |
| Red Hat | yum search search_string |
例如:搜索一個 yum 資源庫來查找 emacs 文本編輯器,使用以下命令:
~~~
yum search emacs
~~~
## 從資源庫中安裝一個軟件包
上層工具允許從一個資源庫中下載一個軟件包,并經(jīng)過完全依賴解析來安裝它。
表15-4: 軟件包安裝命令
| 風(fēng)格 | 命令 |
|---------|------------|
| 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: 底層軟件包安裝命令
| 風(fēng)格 | 命令 |
|---------|------------|
| 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
~~~
* * *
注意:因為這項技術(shù)使用底層的 rpm 程序來執(zhí)行安裝任務(wù),所以沒有運行依賴解析。 如果 rpm 程序發(fā)現(xiàn)缺少了一個依賴,則會報錯并退出。
* * *
## 卸載軟件
可以使用上層或者底層工具來卸載軟件。下面是可用的上層工具。
表15-6: 軟件包刪除命令
| 風(fēng)格 | 命令 |
|---------|------------|
| Debian | apt-get remove package_name |
| Red Hat | yum erase package_name |
例如:從 Debian 風(fēng)格的系統(tǒng)中卸載 emacs 軟件包:
~~~
apt-get remove emacs
~~~
## 經(jīng)過資源庫來更新軟件包
最常見的軟件包管理任務(wù)是保持系統(tǒng)中的軟件包都是最新的。上層工具僅需一步就能完成 這個至關(guān)重要的任務(wù)。
表15-7: 軟件包更新命令
| 風(fēng)格 | 命令 |
|---------|------------|
| Debian | apt-get update; apt-get upgrade |
| Red Hat | yum update |
例如:更新安裝在 Debian 風(fēng)格系統(tǒng)中的軟件包:
~~~
apt-get update; apt-get upgrade
~~~
## 經(jīng)過軟件包文件來升級軟件
如果已經(jīng)從一個非資源庫網(wǎng)站下載了一個軟件包的最新版本,可以安裝這個版本,用它來 替代先前的版本:
表15-8: 底層軟件包升級命令
| 風(fēng)格 | 命令 |
|---------|------------|
| 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: 列出所安裝的軟件包命令
| 風(fēng)格 | 命令 |
|---------|------------|
| Debian | dpkg --list |
| Red Hat | rpm -qa |
## 確定是否安裝了一個軟件包
這些底端工具可以用來顯示是否安裝了一個指定的軟件包:
表15-10: 軟件包狀態(tài)命令
| 風(fēng)格 | 命令 |
|---------|------------|
| Debian | dpkg --status package_name |
| Red Hat | rpm -q package_name |
例如:確定是否 Debian 風(fēng)格的系統(tǒng)中安裝了這個 emacs 軟件包:
~~~
dpkg --status emacs
~~~
## 顯示所安裝軟件包的信息
如果知道了所安裝軟件包的名字,使用以下命令可以顯示這個軟件包的說明信息:
表15-11: 查看軟件包信息命令
| 風(fēng)格 | 命令 |
|---------|------------|
| Debian | apt-cache show package_name |
| Red Hat | yum info package_name |
例如:查看 Debian 風(fēng)格的系統(tǒng)中 emacs 軟件包的說明信息:
~~~
apt-cache show emacs
~~~
## 查找安裝了某個文件的軟件包
確定哪個軟件包對所安裝的某個特殊文件負(fù)責(zé),使用下表中的命令:
表15-12: 包文件識別命令
| 風(fēng)格 | 命令 |
|---------|------------|
| Debian | dpkg --search file_name |
| Red Hat | rpm -qf file_name |
例如:在 Red Hat 系統(tǒng)中,查看哪個軟件包安裝了/usr/bin/vim 這個文件
~~~
rpm -qf /usr/bin/vim
~~~
## 總結(jié)歸納
在隨后的章節(jié)里面,我們將探討許多不同的程序,這些程序涵蓋了廣泛的應(yīng)用程序領(lǐng)域。雖然 大多數(shù)程序一般是默認(rèn)安裝的,但是若所需程序沒有安裝在系統(tǒng)中,那么我們可能需要安裝額外的軟件包。 通過我們新學(xué)到的(和了解的)軟件包管理知識,我們應(yīng)該沒有問題來安裝和管理所需的程序。
> Linux 軟件安裝謠言
>
> 從其它平臺遷移過來的用戶有時會成為謠言的受害者,說是在 Linux 系統(tǒng)中,安裝軟件有些 困難,并且不同系統(tǒng)發(fā)行版所使用的各種各樣的打包方案是一個障礙。唉,它是一個障礙, 但只是針對于那些希望把他們的秘密軟件只以二進制版本發(fā)行的專有軟件供應(yīng)商。
>
> Linux 軟件生態(tài)系統(tǒng)是基于開放源代碼理念。如果一個程序開發(fā)人員發(fā)布了一款產(chǎn)品的 源碼,那么與系統(tǒng)發(fā)行版相關(guān)聯(lián)的開發(fā)人員可能就會把這款產(chǎn)品打包,并把它包含在 他們的資源庫中。這種方法保證了這款產(chǎn)品能很好地與系統(tǒng)發(fā)行版整合在一起,同時為用戶 “一站式采購”軟件提供了方便,從而用戶不必去搜索每個產(chǎn)品的網(wǎng)站。
>
> 設(shè)備驅(qū)動差不多也以同樣的方式來處理,但它們不是系統(tǒng)發(fā)行版資源庫中單獨的項目, 它們本身是 Linux 系統(tǒng)內(nèi)核的一部分。一般來說,在 Linux 當(dāng)中沒有一個類似于“驅(qū)動盤”的東西。 要不內(nèi)核支持一個設(shè)備,要不不支持,反正 Linux 內(nèi)核支持很多設(shè)備,事實上,多于 Windows 所支持的設(shè)備數(shù)目。當(dāng)然,如果你需要的特定設(shè)備不被支持,這里也沒有安慰。當(dāng)那種情況 發(fā)生時,你需要查找一下原因。缺少驅(qū)動程序支持通常是由以下三種情況之一導(dǎo)致:
>
> 1. 設(shè)備太新。?因為許多硬件供應(yīng)商沒有積極地支持 Linux 的發(fā)展,那么編寫內(nèi)核 驅(qū)動代碼的任務(wù)就由一些 Linux 社區(qū)來承擔(dān),而這需要花費時間。
>
>
> 2. 設(shè)備太奇異。?不是所有的發(fā)行版都包含每個可能的設(shè)備驅(qū)動。每個發(fā)行版會建立 它們自己的內(nèi)核,因為內(nèi)核是可以配置的(這使得從手表到主機的每臺設(shè)備上運行 Linux 成為可能), 這樣它們可能會忽略某個特殊設(shè)備。通過定位和下載驅(qū)動程序的源碼,可能需要你自己(是的,由你) 來編譯和安裝驅(qū)動。這個過程不是很難,而是參與。我們將在隨后的章節(jié)里來討論編譯軟件。
>
>
> 3. 硬件供應(yīng)商隱藏信息。?他們既不發(fā)布應(yīng)用于 Linux 系統(tǒng)的驅(qū)動程序代碼, 也不發(fā)布技術(shù)文檔來讓某人創(chuàng)建它。這意味著硬件供應(yīng)商試圖保密此設(shè)備的程序接口。因為我們 不想在計算機中使用保密的設(shè)備,所以我建議刪除這令人厭惡的軟件, 把它和其它無用的項目都仍到垃圾桶里。
## 拓展閱讀
花些時間來了解你所用發(fā)行版中的軟件包管理系統(tǒng)。每個發(fā)行版都提供了關(guān)于自帶軟件包管理工具的 文檔。另外,這里有一些更普遍的資源:
* Debian GNU/Linux FAQ 關(guān)于軟件包管理一章對軟件包管理進行了概述:
[http://www.debian.org/doc/FAQ/ch-pkgtools.en.html](http://www.debian.org/doc/FAQ/ch-pkgtools.en.html)
* RPM 工程的主頁:
[http://www.rpm.org](http://www.rpm.org/)
* 杜克大學(xué) YUM 工程的主頁:
[http://linux.duke.edu/projects/yum/](http://linux.duke.edu/projects/yum/)
* 了解一點兒背景知識,Wikipedia 上有一篇關(guān)于 metadata 的文章:
[http://en.wikipedia.org/wiki/Metadata](http://en.wikipedia.org/wiki/Metadata)
- 第一章:引言
- 第二章:什么是shell
- 第三章:文件系統(tǒng)中跳轉(zhuǎn)
- 第四章:研究操作系統(tǒng)
- 第五章:操作文件和目錄
- 第六章:使用命令
- 第七章:重定向
- 第八章:從shell眼中看世界
- 第九章:鍵盤高級操作技巧
- 第十章:權(quán)限
- 第十一章:進程
- 第十二章:shell環(huán)境
- 第十三章:VI簡介
- 第十四章:自定制shell提示符
- 第十五章:軟件包管理
- 第十六章:存儲媒介
- 第十七章:網(wǎng)絡(luò)系統(tǒng)
- 第十八章:查找文件
- 第十九章:歸檔和備份
- 第二十章:正則表達式
- 第二十一章:文本處理
- 第二十二章:格式化輸出
- 第二十三章:打印
- 第二十四章:編譯程序
- 第二十五章:編寫第一個shell腳本
- 第二十六章:啟動一個項目
- 第二十七章:自頂向下設(shè)計
- 第二十八章:流程控制 if分支結(jié)構(gòu)
- 第二十九章:讀取鍵盤輸入
- 第三十章:流程控制 while/until 循環(huán)
- 第三十一章:疑難排解
- 第三十二章:流程控制 case分支
- 第三十三章:位置參數(shù)
- 第三十四章:流程控制 for循環(huán)
- 第三十五章:字符串和數(shù)字
- 第三十六章:數(shù)組
- 第三十七章:奇珍異寶
