本系列文章幫助您學(xué)習(xí) Linux 系統(tǒng)管理任務(wù)相關(guān)知識(shí)。您可以使用本系列文章中的資料準(zhǔn)備 Linux Professional Institute Certification 級(jí)別 1 (LPIC-1)考試 。
請(qǐng)參見我們的 學(xué)習(xí) Linux,101:LPIC-1 路線圖,查看本系列中各文章的介紹和鏈接。該路線圖目前仍然在更新中,目前反映的最新內(nèi)容是 LPIC-1 考試的最新目標(biāo)(2009 年 4 月):在我們完成文章后,我們會(huì)將其添加到路線圖中。但是,與此同時(shí),您可以在我們的 LPI 認(rèn)證考試準(zhǔn)備教程 中找到類似資料的早期版本,這些內(nèi)容支持 2009 年 4 月以前發(fā)布的 LPIC-1 目標(biāo)。
在本文中,學(xué)習(xí)如何在 Linux 系統(tǒng)上使用 RPM 和 YUM 包管理工具管理包。學(xué)習(xí):
本文幫助您準(zhǔn)備 Linux Professional Institute's Junior Level Administration (LPIC-1) 考試 101 中主題 102 下的目標(biāo) 102.5。該目標(biāo)的權(quán)值為 3。
為了最有效地利用本系列中的文章,您應(yīng)該具有基本的 Linux 知識(shí),并需要準(zhǔn)備一個(gè) Linux 系統(tǒng),用于練習(xí)本文介紹的命令。有時(shí)候不同版本的程序輸出格式不同,因此您所得到的結(jié)果未必總是與這里所示的清單和圖相同。特別是,許多輸出高度依賴于系統(tǒng)上已經(jīng)安裝的包。您自己的輸出可能很不一樣,但是應(yīng)該能夠看出重要的共同點(diǎn)。
Ian 是我們最受歡迎、最高產(chǎn)的作者之一。閱讀 Ian 在 developerWorks 上發(fā)表的所有文章。查看 Ian 的個(gè)人信息,與 Ian、其他作者和 My developerWorks 的其他讀者聯(lián)系。
過去,許多 Linux 程序以源代碼的形式發(fā)行,用戶把源代碼構(gòu)建為所需的程序或程序集;源代碼還附帶必需的手冊(cè)頁、配置文件等等。現(xiàn)在,大多數(shù) Linux 發(fā)行商使用稱為包 的預(yù)構(gòu)建的程序或程序集,包便于在發(fā)行版上安裝。在本文中,學(xué)習(xí)幫助安裝、更新和刪除包的包管理 工具。本文主要關(guān)注 Red Hat 開發(fā)的 Red Hat Package Manager (RPM),以及 Duke University 物理系最初為管理 Red Hat Linux 系統(tǒng)開發(fā)的 Yellowdog Updater Modified (YUM)。本系列中的另一篇文章 “學(xué)習(xí) Linux,101:Debian 包管理” 討論 Debian 系統(tǒng)上使用的包管理工具。
從用戶的角度來說,基本的包管理功能由命令提供。Linux 開發(fā)人員一直致力于讓 Linux 更容易使用,他們開發(fā)了其他工具(包括 GUI 工具)來補(bǔ)充基本工具,這對(duì)最終用戶隱藏了基本工具的一部分復(fù)雜性。在本文和 學(xué)習(xí) Linux,101:Debian 包管理 中,我們主要討論基本工具,但是也會(huì)提到一些其他工具,讓您能夠繼續(xù)研究它們。
RPM、YUM 和 APT(適用于 Debian 系統(tǒng))有許多相似之處。它們都可以安裝和刪除包。關(guān)于安裝的包的信息保存在數(shù)據(jù)庫中。它們都有基本的命令行功能,同時(shí)通過其他工具提供對(duì)用戶更友好的界面。它們都可以從 Internet 獲取包。
在安裝 Linux 系統(tǒng)時(shí),通常會(huì)安裝許多包。這個(gè)集合可能是根據(jù)系統(tǒng)的用途定制的,比如服務(wù)器、桌面或開發(fā)工作站。有時(shí)候,可能需要安裝新的包以添加新功能,更新現(xiàn)有的包,甚至刪除不再需要或已經(jīng)被新的包取代的包。我們來看看如何完成這些任務(wù)以及如何解決一些相關(guān)的難題,比如尋找包含某一命令的包。
Red Hat 于 1995 年引入了 RPM。RPM 現(xiàn)在是 Linux Standard Base (LSB) 中采用的包管理系統(tǒng)。rpm
命令選項(xiàng)分為三組:
在本文中,我們主要關(guān)注前兩組命令選項(xiàng)。在 RPM 的手冊(cè)頁中可以找到其他功能的相關(guān)信息。
還應(yīng)該注意 rpm
是操作 RPM 的主要命令,而 .rpm 是 RPM 文件使用的擴(kuò)展名。所以 “一個(gè) rpm” 或 “某某 rpm” 一般是指 RPM 文件,而 rpm
通常指命令。
YUM 在 RPM 系統(tǒng)中增加了自動(dòng)更新和包管理,包括依賴關(guān)系管理。與 Debian Advanced Packaging Tool (APT) 一樣,除了了解系統(tǒng)上安裝的包之外,YUM 還使用存儲(chǔ)庫。存儲(chǔ)庫是包的集合,通??梢酝ㄟ^網(wǎng)絡(luò)連接訪問它們。
假設(shè)您想學(xué) Lisp,一位同事讓您使用 gcl
命令。您試著輸入 gcl --help
、which gcl
或 type gcl
。但是,如果系統(tǒng)無法找到 gcl
,您可能會(huì)看到與清單 1 相似的輸出。
[ian@echidna ~]$ gcl --helpbash: gcl: command not found[ian@echidna ~]$ which gcl/usr/bin/which: no gcl in (/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/ian/bin)[ian@echidna ~]$ type gclbash: type: gcl: not found
您可能會(huì)問同事要安裝哪個(gè)包,也可能猜想 gcl
命令應(yīng)該在 gcl 包中。這種猜測常常是對(duì)的,但是也不總是。我們稍后會(huì)看到如何尋找正確的包。在這里,需要 gcl 包。假設(shè)您已經(jīng)下載或以其他方式獲得了這個(gè)包的拷貝,可以使用帶 -i
(代表安裝)選項(xiàng)的 rpm
命令安裝它,見清單 2。
[root@echidna ~]# rpm -i gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpmerror: Failed dependencies:gcl-selinux is needed by gcl-2.6.8-0.6.20090701cvs.fc12.x86_64
rpm
命令知道這個(gè)包有一個(gè)依賴包,但是它并不幫助您解決依賴問題。您需要自己獲取依賴包,然后再次嘗試,看看是否還有其他依賴包 — 重復(fù)這個(gè)過程,直到滿足所有依賴關(guān)系為止。好消息是,可以向 rpm
命令提供要安裝的包的列表,如果滿足所有依賴關(guān)系,它會(huì)以正確的次序安裝所有包。因此,您至少不必以正確的次序手工安裝每個(gè)包。
如果您使用過 Debian 的 APT,可能希望有像 apt-get
命令一樣的功能,apt-get
命令會(huì)尋找需要的東西(包括依賴包)并安裝它們。對(duì)于基于 RPM 的系統(tǒng),YUM (Yellowdog Updater Modified) 提供這種功能。清單 3 說明如何使用帶 install
選項(xiàng)的 yum
命令安裝 gcl 和必需的 gcl-selinux 包。
[root@echidna ~]# yum install gclLoaded plugins: presto, refresh-packagekitSetting up Install ProcessResolving Dependencies--> Running transaction check---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated--> Processing Dependency: gcl-selinux for package: gcl-2.6.8-0.7.20100201cvs.fc12.x86_64--> Running transaction check---> Package gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated--> Finished Dependency ResolutionDependencies Resolved===================================================================================== Package Arch Version Repository Size=====================================================================================Installing: gcl x86_64 2.6.8-0.7.20100201cvs.fc12 updates 6.3 MInstalling for dependencies: gcl-selinux x86_64 2.6.8-0.7.20100201cvs.fc12 updates 17 kTransaction Summary=====================================================================================Install 2 Package(s)Upgrade 0 Package(s)Total download size: 6.4 MInstalled size: 40 MIs this ok [y/N]: yDownloading Packages:Setting up and reading Presto delta metadataupdates/prestodelta | 964 kB 00:01 Processing delta metadataPackage(s) data still to download: 6.4 M(1/2): gcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm | 6.3 MB 00:12 (2/2): gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm | 17 kB 00:00 -------------------------------------------------------------------------------------Total 398 kB/s | 6.4 MB 00:16 Running rpm_check_debugRunning Transaction TestTransaction Test SucceededRunning Transaction Installing : gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 1/2 Installing : gcl-2.6.8-0.7.20100201cvs.fc12.x86_64 2/2 Installed: gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 Dependency Installed: gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 Complete!
清單 3 中的輸出表明,YUM 在名為 “updates” 的存儲(chǔ)庫中找到了 gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 和 gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12(稍后詳細(xì)討論),并判斷出總下載大小。按 “y” 同意之后,它下載這兩個(gè)包,然后安裝依賴包,最后安裝 gcl。在本文后面會(huì)進(jìn)一步討論依賴關(guān)系。
在前一節(jié)中,學(xué)習(xí)了如何安裝 RPM 包。但是,包來自什么地方呢?yum
如何知道從哪里下載包?起點(diǎn)是 /etc/yum.repos.d/ 目錄,這個(gè)目錄常常包含幾個(gè) repo 文件。這是 repo 的默認(rèn)位置,但是可以在 YUM 配置文件(通常是 /etc/yum.conf)中指定其他位置。清單 4 給出 fedora-updates.repo,我們從它所對(duì)應(yīng)的位置獲取 gcl 并安裝在我的 Fedora 12 系統(tǒng)上。
典型的 repo 文件分為三個(gè)部分,一個(gè)用于一般的包,一個(gè)用于調(diào)試包,最后一個(gè)用于源代碼包。常??梢詮牟煌奈恢茫?em>鏡像)獲取發(fā)行版的包拷貝。所以 repo 文件告訴 yum
在哪里可以找到每個(gè)部分的最新鏡像列表。注意,發(fā)行版的發(fā)布級(jí)別和機(jī)器架構(gòu)表示為參數(shù),所以對(duì)于我的 x86_64 Fedora 12 系統(tǒng),yum
會(huì)從 https://mirrors.fedoraproject.org/metalink?repo=updates-released-f12&arch=x86_64 下載列表。
除了存儲(chǔ)庫位置之外,repo 文件還指出某個(gè)存儲(chǔ)庫是否啟用了,以及是否應(yīng)該使用 GPG 簽名檢查下載的包。
[ian@echidna ~]$ cat /etc/yum.repos.d/fedora-updates.repo[updates]name=Fedora $releasever - $basearch - Updatesfailovermethod=priority#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/$basearch/mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearchenabled=1gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch[updates-debuginfo]name=Fedora $releasever - $basearch - Updates - Debugfailovermethod=priority#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/$basearch/debug/mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f$releasever&arch=$basearchenabled=0gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch[updates-source]name=Fedora $releasever - Updates Sourcefailovermethod=priority#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/SRPMS/mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-source-f$releasever&arch=$basearchenabled=0gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch
YUM 和 RPM 使用本地?cái)?shù)據(jù)庫判斷安裝的包。本地?cái)?shù)據(jù)庫中存儲(chǔ)的包元數(shù)據(jù)是從啟用的存儲(chǔ)庫獲取的。盡管很少需要為本地?cái)?shù)據(jù)庫操心,但是可以使用 yum clean
命令清除本地存儲(chǔ)的信息的不同部分,使用 yum makecache
在本地?cái)?shù)據(jù)庫中為啟用的 repo 創(chuàng)建信息。例如,如果修改了 repo 配置,就可能需要這么做。
如果要?jiǎng)h除包,可以使用 yum
的 remove
選項(xiàng)或 rpm
的 -e
選項(xiàng)。使用 rpm -e
刪除 gcl 的試運(yùn)行見清單 5。如果可以刪除這個(gè)包,就不會(huì)有輸出。
[root@echidna ~]# rpm -e --test gcl
與使用 apt-get
模擬刪除 Debian 包不同,RPM 系統(tǒng)并不維護(hù)自動(dòng)安裝的包的相關(guān)信息,所以無法通過試刪除查明哪些依賴包也可以刪除。但是,如果在單一命令中指定多個(gè)要?jiǎng)h除的包,那么沒有依賴關(guān)系的包會(huì)先于有依賴關(guān)系的包刪除。
與安裝包不同,當(dāng)使用 rpm
刪除包時(shí),在刪除包之前沒有提示。但是,如果試圖刪除其他包需要的包,它不會(huì)執(zhí)行刪除操作,您會(huì)看到清單 6 所示的錯(cuò)誤消息。
[root@echidna ~]# rpm -e gcl-selinuxerror: Failed dependencies: gcl-selinux is needed by (installed) gcl-2.6.8-0.7.20100201cvs.fc12.x86_64
如果使用 yum remove
,在執(zhí)行事務(wù)測試之后會(huì)顯示提示。如果試圖刪除的包是其他已安裝包的依賴包,YUM 會(huì)提議刪除這些包和依賴包,見清單 7。
[root@echidna ~]# yum remove gcl-selinuxLoaded plugins: presto, refresh-packagekitSetting up Remove ProcessResolving Dependencies--> Running transaction check---> Package gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be erased--> Processing Dependency: gcl-selinux for package: gcl-2.6.8-0.7.20100201cvs.fc12.x86_64--> Running transaction check---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be erased--> Finished Dependency ResolutionDependencies Resolved===================================================================================== Package Arch Version Repository Size=====================================================================================Removing: gcl-selinux x86_64 2.6.8-0.7.20100201cvs.fc12 @updates 90 kRemoving for dependencies: gcl x86_64 2.6.8-0.7.20100201cvs.fc12 @updates 40 MTransaction Summary=====================================================================================Remove 2 Package(s)Reinstall 0 Package(s)Downgrade 0 Package(s)Is this ok [y/N]: nExiting on user CommandComplete!
既然已經(jīng)了解了如何安裝和刪除 RPM,我們來看看如何把 RPM 包升級(jí)到更高級(jí)別??梢允褂?yum update
更新整個(gè)系統(tǒng),還可以指定單一包或通配符。清單 8 說明如何更新所有名稱以 “gr” 開頭的包。注意,這里使用撇號(hào)防止 shell 展開 “*”。
[root@echidna ~]# yum update 'gr*'Loaded plugins: presto, refresh-packagekitSetting up Update ProcessResolving Dependencies--> Running transaction check---> Package grep.x86_64 0:2.6.3-1.fc12 set to be updated---> Package groff.x86_64 0:1.18.1.4-20.fc12 set to be updated--> Finished Dependency ResolutionDependencies Resolved===================================================================================== Package Arch Version Repository Size=====================================================================================Updating: grep x86_64 2.6.3-1.fc12 updates 228 k groff x86_64 1.18.1.4-20.fc12 updates 1.5 MTransaction Summary=====================================================================================Install 0 Package(s)Upgrade 2 Package(s)Total download size: 1.7 MIs this ok [y/N]: yDownloading Packages:Setting up and reading Presto delta metadataProcessing delta metadataDownload delta size: 854 khttp://fedora.fastsoft.net/pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_64.drpm: [Errno 14] HTTP Error 404 : http://fedora.fastsoft.net/pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_64.drpm Trying other mirror.(1/2): grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_64.drpm | 214 kB 00:00 (2/2): groff-1.18.1.4-18.fc12_1.18.1.4-20.fc12.x86_64.drpm | 640 kB 00:00 Finishing rebuild of rpms, from deltarpms<delta rebuild> | 1.7 MB 00:02 Presto reduced the update size by 52% (from 1.7 M to 854 k).Running rpm_check_debugRunning Transaction TestTransaction Test SucceededRunning Transaction Updating : grep-2.6.3-1.fc12.x86_64 1/4 Updating : groff-1.18.1.4-20.fc12.x86_64 2/4 Cleanup : grep-2.5.3-6.fc12.x86_64 3/4 Cleanup : groff-1.18.1.4-18.fc12.x86_64 4/4 Updated: grep.x86_64 0:2.6.3-1.fc12 groff.x86_64 0:1.18.1.4-20.fc12 Complete!
如果知道 RPM 文件的位置,或者已經(jīng)下載了它們,那么也可以使用 rpm
命令執(zhí)行更新。這與安裝相似,只是要使用 -U
或 -F
選項(xiàng)而不是 -i
選項(xiàng)。這兩個(gè)選項(xiàng)的差異是, -U
選項(xiàng)更新現(xiàn)有的包,如果這個(gè)包還沒有安裝,就安裝它;而 -F
選項(xiàng)只升級(jí)或刷新 已經(jīng)安裝的包。因此,經(jīng)常使用 -U
選項(xiàng),尤其是在命令行包含 RPM 列表的情況下。這樣的話,就會(huì)安裝未安裝的包,升級(jí)已經(jīng)安裝的包。常常使用另外兩個(gè)選項(xiàng) -v
(詳細(xì))和 -h
(# 標(biāo)志)提供進(jìn)度顯示。清單 9 說明如何使用 rpm
命令更新 vim-common、vim-enhanced 和 vim-minimal 包。我們已經(jīng)把 vim-common 和 vim-enhanced 包下載到根用戶的主目錄中,而 vim-minimal 包要從一個(gè)更新鏡像獲取。
[root@echidna ~]# ls *.rpmvim-common-7.2.411-1.fc12.x86_64.rpm vim-enhanced-7.2.411-1.fc12.x86_64.rpm[root@echidna ~]# rpm -Uvh *.rpm http://mirrors.usc.edu/pub/linux/distributions\> /fedora/linux/updates/12/x86_64/vim-minimal-7.2.411-1.fc12.x86_64.rpmRetrieving http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/updates/12/x86_64/vim-minimal-7.2.411-1.fc12.x86_64.rpmPreparing... ########################################### [100%] 1:vim-common ########################################### [ 33%] 2:vim-enhanced ########################################### [ 67%] 3:vim-minimal ########################################### [100%]
您在前面的示例中看到,用 rpm
命令安裝 rpm 需要包文件的完整名稱(或 URL),比如 gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm。另一方面,用 yum
安裝或用這兩個(gè)命令刪除 rpm 只需要包名,比如 gcl。與 APT 一樣,RPM 在內(nèi)部數(shù)據(jù)庫中維護(hù)安裝的包的信息,因此允許使用包名操作安裝的包。在本節(jié)中,看看可以使用 rpm
的 -q
(代表查詢)選項(xiàng)或相關(guān)聯(lián)的 yum
查詢從數(shù)據(jù)庫獲取的一些信息。
基本查詢只檢查包是否已經(jīng)安裝了,如果安裝了,就查詢版本。增加 -i
選項(xiàng)會(huì)得到包的相關(guān)信息。注意,安裝、升級(jí)或刪除包需要根權(quán)力,但是非根用戶也可以查詢 rpm 數(shù)據(jù)庫。
[ian@echidna ~]$ yum list gclLoaded plugins: presto, refresh-packagekitInstalled Packagesgcl.x86_64 2.6.8-0.7.20100201cvs.fc12 @updates[ian@echidna ~]$ rpm -q gclgcl-2.6.8-0.7.20100201cvs.fc12.x86_64[ian@echidna ~]$ yum info gclLoaded plugins: presto, refresh-packagekitInstalled PackagesName : gclArch : x86_64Version : 2.6.8Release : 0.7.20100201cvs.fc12Size : 40 MRepo : installedFrom repo : updatesSummary : GNU Common LispURL : http://www.gnu.org/software/gcl/License : GPL+ and LGPLv2+Description: GCL is a Common Lisp currently compliant with the ANSI standard. : Lisp compilation produces native code through the intermediary of : the system's C compiler, from which GCL derives efficient : performance and facile portability. Currently uses TCL/Tk as GUI.[ian@echidna ~]$ rpm -qi gclName : gcl Relocations: (not relocatable)Version : 2.6.8 Vendor: Fedora ProjectRelease : 0.7.20100201cvs.fc12 Build Date: Tue 23 Mar 2010 03:20:36 PM EDTInstall Date: Wed 05 May 2010 01:01:34 PM EDT Build Host: x86-02.phx2.fedoraproject.orgGroup : Development/Languages Source RPM: gcl-2.6.8-0.7.20100201cvs.fc12.src.rpmSize : 41667750 License: GPL+ and LGPLv2+Signature : RSA/8, Tue 23 Mar 2010 04:14:06 PM EDT, Key ID 9d1cc34857bbccbaPackager : Fedora ProjectURL : http://www.gnu.org/software/gcl/Summary : GNU Common LispDescription :GCL is a Common Lisp currently compliant with the ANSI standard. Lispcompilation produces native code through the intermediary of thesystem's C compiler, from which GCL derives efficient performance andfacile portability. Currently uses TCL/Tk as GUI.
詳細(xì)的清單顯示與 RPM 包相關(guān)聯(lián)的一些標(biāo)記。注意,rpm
和 yum
以不同的格式顯示不同的信息。在本文中,我們都使用標(biāo)準(zhǔn)命令選項(xiàng)提供的基本輸出。如果希望使用 rpm --queryformat
選項(xiàng)定制查詢輸出,請(qǐng)參考手冊(cè)頁。如果希望了解您的 rpm
版本支持的所有標(biāo)記,應(yīng)該運(yùn)行 rpm --querytags
。
如清單 10 所示,可以使用 yum
列出安裝的包。還可以用它列出有更新可用的包、可以安裝的包以及具有其他性質(zhì)的包,比如廢棄的包或存儲(chǔ)庫中最近添加的包。甚至可以使用 yum
搜索包。在清單 11 中可以看到,texmacs 包還沒有安裝,但是可以從 fedora 存儲(chǔ)庫獲取它。如果搜索 “texmacs”,會(huì)看到提到它的四個(gè)包。很容易看出為什么會(huì)找到 TeXmacs* 包。使用 yum info pydot
查明為什么也會(huì)找到 pydot 包。
[ian@echidna ~]$ yum list texmacsLoaded plugins: presto, refresh-packagekitAvailable PackagesTeXmacs.x86_64 1.0.7.2-2.fc12 fedora[ian@echidna ~]$ yum search texmacsLoaded plugins: presto, refresh-packagekit================================= Matched: texmacs ==================================TeXmacs-devel.i686 : Development files for TeXmacsTeXmacs-devel.x86_64 : Development files for TeXmacsTeXmacs.x86_64 : Structured wysiwyg scientific text editorpydot.noarch : Python interface to Graphviz's Dot language
對(duì)于后面的查詢示例,我們主要使用 rpm
,因?yàn)樗倪x項(xiàng)更豐富。許多示例也可以使用 yum
完成,yum
有一些基本 rpm
選項(xiàng)不具備的功能。更多信息參見手冊(cè)頁。
用戶常常希望知道一個(gè)包中有哪些文件,或者某個(gè)文件來自哪個(gè)包。使用 -ql
選項(xiàng)列出 gcl 包中的文件,見清單 12。這個(gè)包中有許多文件,所以這里只給出部分輸出。
[ian@echidna ~]$ rpm -ql gcl/usr/bin/gcl/usr/lib/gcl-2.6.8/usr/lib/gcl-2.6.8/clcs/usr/lib/gcl-2.6.8/clcs/sys-proclaim.lisp/usr/lib/gcl-2.6.8/cmpnew/usr/lib/gcl-2.6.8/cmpnew/gcl_cmpmain.lsp/usr/lib/gcl-2.6.8/cmpnew/gcl_cmpopt.lsp/usr/lib/gcl-2.6.8/cmpnew/gcl_collectfn.lsp.../usr/share/info/gcl-tk.info.gz/usr/share/info/gcl.info-1.gz/usr/share/info/gcl.info-2.gz/usr/share/info/gcl.info-3.gz/usr/share/info/gcl.info-4.gz/usr/share/info/gcl.info-5.gz/usr/share/info/gcl.info-6.gz/usr/share/info/gcl.info-7.gz/usr/share/info/gcl.info-8.gz/usr/share/info/gcl.info-9.gz/usr/share/info/gcl.info.gz/usr/share/man/man1/gcl.1.gz
通過在查詢中添加 -c
選項(xiàng),可以把列出的文件限制為配置文件。-d
選項(xiàng)把輸出限制為文檔文件。
上面的包查詢命令在 RPM 數(shù)據(jù)庫中查詢已經(jīng)安裝的包。如果剛下載了一個(gè)包,想獲取同類信息,可以在查詢中使用 -p
(代表包文件)選項(xiàng)并指定包的文件 名(與安裝包時(shí)一樣)。清單 13 顯示前面下載的兩個(gè) vim 包的信息。我們只作為根用戶運(yùn)行它,因?yàn)槲募诟脩舻闹髂夸浿???梢蕴砑悠渌樵冞x項(xiàng),比如用 -l
列出文件,用 -i
列出信息。
[root@echidna ~]# rpm -qp *.rpmvim-common-7.2.411-1.fc12.x86_64vim-enhanced-7.2.411-1.fc12.x86_64
-a
選項(xiàng)把查詢應(yīng)用于安裝的所有包。這會(huì)生成許多輸出,所以通常同時(shí)使用一個(gè)或多個(gè)篩選器,比如用 sort
進(jìn)行排序,用 more
或 less
進(jìn)行分頁輸出,用 wc
獲取包或文件內(nèi)容,用 grep
搜索您不確定名稱的包。清單 14 給出以下查詢:
[ian@echidna ~]$ rpm -qa | sort | moreaalib-libs-1.4.0-0.18.rc5.fc12.x86_64abrt-1.0.8-2.fc12.x86_64abrt-addon-ccpp-1.0.8-2.fc12.x86_64abrt-addon-kerneloops-1.0.8-2.fc12.x86_64abrt-addon-python-1.0.8-2.fc12.x86_64abrt-desktop-1.0.8-2.fc12.x86_64abrt-gui-1.0.8-2.fc12.x86_64abrt-libs-1.0.8-2.fc12.x86_64abrt-plugin-bugzilla-1.0.8-2.fc12.x86_64abrt-plugin-logger-1.0.8-2.fc12.x86_64abrt-plugin-runapp-1.0.8-2.fc12.x86_64abyssinica-fonts-1.0-5.fc12.noarchacl-2.2.49-2.fc12.x86_64...[ian@echidna ~]$ rpm -qa | wc -l1792[ian@echidna ~]$ rpm -qal | wc -l281052[ian@echidna ~]$ rpm -qad | wc -l45686[ian@echidna ~]$ rpm -qa | grep -i gclgcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64gcl-2.6.8-0.7.20100201cvs.fc12.x86_64
使用 rpm -qa
可以簡化對(duì)多個(gè)系統(tǒng)的管理。如果把排序的輸出重定向到一臺(tái)機(jī)器上的文件,然后在另一臺(tái)機(jī)器上也這么做,就可以使用 diff
程序?qū)ふ也町悺?
既然可以列出所有包和一個(gè)包中的所有文件,現(xiàn)在就掌握了查明哪個(gè)包包含某一文件所需的所有信息。但是,rpm
命令的 -f
(或 --file
)選項(xiàng)可以幫助找到包含某一文件的包。假設(shè)您想知道前面看到的哪個(gè) vim 包提供 vim
命令。您需要文件的完整路徑。清單 15 說明如何使用 which
命令得到 vim
命令的完整路徑,可以使用這個(gè)輸出作為 rpm -qf
命令的輸入。注意,`which guile-config
` 前后的符號(hào)是反撇號(hào)。在 Bash shell 中,另一種使用方法是 $(which vim)
。
[ian@echidna ~]$ which vim/usr/bin/vim[ian@echidna ~]$ rpm -qf `which vim`vim-enhanced-7.2.411-1.fc12.x86_64[ian@echidna ~]$ rpm -qf $(which vim)vim-enhanced-7.2.411-1.fc12.x86_64
在前面看到刪除 gcl-selinux 包的操作失敗了,這是因?yàn)榇嬖?em>依賴關(guān)系。除了文件之外,RPM 包可能包含其他包所依賴的任意功能。
如您所見,依賴關(guān)系通常會(huì)正常發(fā)揮作用。如果需要同時(shí)安裝幾個(gè)包,其中一些依賴于其他包,那么只需使用 yum
,或者向 rpm -Uvh
命令提供完整的列表,它會(huì)分析依賴關(guān)系并按正確的次序執(zhí)行安裝。
除了在安裝或刪除包時(shí)產(chǎn)生的錯(cuò)誤消息之外,還可以通過幾種方法查明包需要或依賴的文件或功能。
rpm
命令提供的一個(gè)選項(xiàng)可以查詢安裝的包或包文件,從而查明它們依賴或需要 什么功能。這個(gè)選項(xiàng)是 --requires
,它可以簡寫為 -R
。清單 16 顯示 gcl 需要的功能。如果要查詢包文件而不是 RPM 數(shù)據(jù)庫,那么添加 -p
選項(xiàng)并使用完整的 RPM 文件名。
[ian@echidna ~]$ rpm -qR gcl/bin/sh /bin/sh /bin/sh /sbin/install-info /sbin/install-info gcl-selinux libX11.so.6()(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.11)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.7)(64bit) libc.so.6(GLIBC_2.8)(64bit) libdl.so.2()(64bit) libgmp.so.3()(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libreadline.so.6()(64bit) libtcl8.5.so()(64bit) libtk8.5.so()(64bit) libz.so.1()(64bit) rpmlib(CompressedFileNames) <= 3.0.4-1rpmlib(FileDigests) <= 4.6.0-1rpmlib(PayloadFilesHavePrefix) <= 4.0-1rtld(GNU_HASH) rpmlib(PayloadIsXz) <= 5.2-1
把功能與提供它們的包聯(lián)系起來不太容易。帶 deplist
選項(xiàng)的 yum
命令可以提供幫助。如果只指定包名,沒有版本號(hào),可能會(huì)得到其他已知版本的列表。清單 17 說明如何獲得安裝的 gcl 版本的依賴列表。
[ian@echidna ~]$ yum deplist $(rpm -q gcl)Loaded plugins: presto, refresh-packagekitFinding dependencies: package: gcl.x86_64 2.6.8-0.7.20100201cvs.fc12 dependency: libc.so.6(GLIBC_2.3.4)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: gcl-selinux provider: gcl-selinux.x86_64 2.6.8-0.6.20090701cvs.fc12 provider: gcl-selinux.x86_64 2.6.8-0.7.20100201cvs.fc12 dependency: libgmp.so.3()(64bit) provider: gmp.x86_64 4.3.1-5.fc12 dependency: libc.so.6(GLIBC_2.8)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libc.so.6(GLIBC_2.4)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libc.so.6()(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: /sbin/install-info provider: info.x86_64 4.13a-7.fc12 provider: info.x86_64 4.13a-9.fc12 dependency: libX11.so.6()(64bit) provider: libX11.x86_64 1.3-1.fc12 dependency: libc.so.6(GLIBC_2.7)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libtcl8.5.so()(64bit) provider: tcl.x86_64 1:8.5.7-4.fc12 provider: tcl.x86_64 1:8.5.7-5.fc12 dependency: libc.so.6(GLIBC_2.11)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libtk8.5.so()(64bit) provider: tk.x86_64 1:8.5.7-2.fc12 provider: tk.x86_64 1:8.5.7-3.fc12 dependency: libc.so.6(GLIBC_2.3)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libm.so.6()(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libz.so.1()(64bit) provider: zlib.x86_64 1.2.3-23.fc12 dependency: rtld(GNU_HASH) provider: glibc.i686 2.11-2 provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 provider: glibc.i686 2.11.1-6 dependency: libdl.so.2()(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libreadline.so.6()(64bit) provider: readline.x86_64 6.0-3.fc12 dependency: /bin/sh provider: bash.x86_64 4.0.33-1.fc12 provider: bash.x86_64 4.0.35-3.fc12 dependency: libc.so.6(GLIBC_2.2.5)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libm.so.6(GLIBC_2.2.5)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6
這個(gè)列表還顯示每個(gè)功能可能的提供者??梢钥吹酱蠖鄶?shù)依賴功能可以由多個(gè)包級(jí)別提供。例如,/bin/sh 可以來自 bash 的兩個(gè)級(jí)別之一。通過使用創(chuàng)造性的篩選,可以把輸出縮減為清單 18 所示的包名列表。
[ian@echidna ~]$ yum deplist $(rpm -q gcl) | grep "provider:" | \> awk '{ print $2 }'|sort|uniqbash.x86_64gcl-selinux.x86_64glibc.i686glibc.x86_64gmp.x86_64info.x86_64libX11.x86_64readline.x86_64tcl.x86_64tk.x86_64zlib.x86_64
如果只想知道需要安裝哪些包,可以運(yùn)行 yum install
,查看在提示接受安裝提議之前顯示的列表。
除了查明包需要的功能之外,還可能需要了解哪個(gè)包提供某一功能。前面演示了如何查明哪個(gè)包包含某一文件。清單 19 說明如何使用 rpm
或 yum
查明哪個(gè)包提供 gcl-selinux(x86-64) 功能。除了顯示提供此功能的已安裝包的信息之外,YUM 還顯示存儲(chǔ)庫中可用的包或版本??梢钥吹?,原來的 2.6.8-0.6 版來自 fedora 存儲(chǔ)庫,而 updates 存儲(chǔ)庫中有更新的 2.6.8-0.7 版。
[ian@echidna ~]$ rpm -q --whatprovides 'gcl-selinux(x86-64)'gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64[ian@echidna ~]$ yum whatprovides 'gcl-selinux(x86-64)'Loaded plugins: presto, refresh-packagekitgcl-selinux-2.6.8-0.6.20090701cvs.fc12.x86_64 : SELinux policy for GCL imagesRepo : fedoraMatched from:Other : gcl-selinux(x86-64)gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL imagesRepo : updatesMatched from:Other : gcl-selinux(x86-64)gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL imagesRepo : installedMatched from:Other : Provides-match: gcl-selinux(x86-64)
為了確保完整性,RPM 包包含一個(gè)摘要(比如 MD5 或 SHA1),常常經(jīng)過數(shù)字簽名。數(shù)字簽名的包需要用公共密鑰進(jìn)行檢驗(yàn)。使用 rpm
的 --checksig
(簡寫為 -K
)選項(xiàng)檢查 RPM 包文件的完整性。添加 -v
選項(xiàng)以生成更詳細(xì)的輸出常常有幫助。清單 20 給出的示例檢查 vim-enhanced RPM 的完整性。
[root@echidna ~]# rpm -vK vim-enhanced-7.2.411-1.fc12.x86_64.rpmvim-enhanced-7.2.411-1.fc12.x86_64.rpm: Header V3 RSA/SHA256 signature: OK, key ID 57bbccba Header SHA1 digest: OK (f9a199545a515f7ff0716729768b41eb68fe29a8) V3 RSA/SHA256 signature: OK, key ID 57bbccba MD5 digest: OK (d4045f1f72d48073e3f401ee9d1f71cf)
可能會(huì)產(chǎn)生下面的輸出:
V3 DSA signature: NOKEY, key ID 16a61572
這意味著這個(gè)包是經(jīng)過簽名的,但是您的 RPM 數(shù)據(jù)庫中沒有所需的公共密鑰。注意,以前版本的 RPM 可能以不同的方式提供檢驗(yàn)。
如果包是經(jīng)過簽名的,您希望根據(jù)簽名檢驗(yàn)它,就需要找到適當(dāng)?shù)暮灻募阉鼘?dǎo)入 RPM 數(shù)據(jù)庫。應(yīng)該首先下載密鑰,然后檢查它的指紋,最后使用 rpm
命令導(dǎo)入它。更多信息參見 RPM 手冊(cè)頁。還可以在 RPM 主頁上找到關(guān)于簽名的二進(jìn)制代碼的更多信息(見 參考資料 中的鏈接)。
--import
與檢查 rpm 的完整性一樣,還可以使用 rpm -V
檢查已安裝的文件的完整性。這個(gè)步驟確保從 rpm 安裝文件之后文件沒有修改過。如清單 21 所示,如果包仍然良好,這個(gè)命令沒有輸出;但是,可以添加 -v
選項(xiàng)以產(chǎn)生更詳細(xì)的輸出。
[ian@echidna ~]$ rpm -V vim-common
現(xiàn)在,我們作為根用戶刪除 /usr/bin/xxd 并把 /usr/share/vim/vim72/syntax/bindzone.vim 替換為 /bin/bash。然后再次檢查。結(jié)果見清單 22。
[root@echidna ~]# rpm -qf /usr/bin/xxd /usr/share/vim/vim72/syntax/bindzone.vimvim-common-7.2.411-1.fc12.x86_64vim-common-7.2.411-1.fc12.x86_64[root@echidna ~]# rm /usr/bin/xxdrm: remove regular file `/usr/bin/xxd'? y[root@echidna ~]# cp /bin/bash /usr/share/vim/vim72/syntax/bindzone.vimcp: overwrite `/usr/share/vim/vim72/syntax/bindzone.vim'? y[root@echidna ~]# rpm -V vim-commonmissing /usr/bin/xxdS.5....T. /usr/share/vim/vim72/syntax/bindzone.vim
輸出表明對(duì) /usr/share/vim/vim72/syntax/bindzone.vim 文件的 MD5 和、文件大小和 mtime 檢查失敗了。解決這個(gè)問題的一種方法是刪除這個(gè)包,然后重新安裝,依賴于 vim-common 的其他已安裝包仍然可以正常運(yùn)行。這個(gè)解決方案使用 rpm
的 --force
選項(xiàng)或 yum
的 reinstall
功能強(qiáng)制重新安裝。清單 23 演示如何用 yum
重新安裝,然后檢查包現(xiàn)在是否良好,檢查刪除的文件是否已經(jīng)恢復(fù)了。
[root@echidna ~]# yum reinstall vim-commonLoaded plugins: presto, refresh-packagekitSetting up Reinstall ProcessResolving Dependencies--> Running transaction check---> Package vim-common.x86_64 2:7.2.411-1.fc12 set to be updated--> Finished Dependency ResolutionDependencies Resolved===================================================================================== Package Arch Version Repository Size=====================================================================================Reinstalling: vim-common x86_64 2:7.2.411-1.fc12 updates 6.0 MTransaction Summary=====================================================================================Remove 0 Package(s)Reinstall 1 Package(s)Downgrade 0 Package(s)Total download size: 6.0 MInstalled size: 17 MIs this ok [y/N]: yDownloading Packages:Setting up and reading Presto delta metadataupdates/prestodelta | 969 kB 00:00 Processing delta metadataPackage(s) data still to download: 6.0 Mvim-common-7.2.411-1.fc12.x86_64.rpm | 6.0 MB 00:01 Running rpm_check_debugRunning Transaction TestTransaction Test SucceededRunning TransactionWarning: RPMDB altered outside of yum. Installing : 2:vim-common-7.2.411-1.fc12.x86_64 1/1 Installed: vim-common.x86_64 2:7.2.411-1.fc12 Complete![root@echidna ~]# rpm -V vim-common[root@echidna ~]# ls /usr/bin/xxd/usr/bin/xxd
包管理系統(tǒng)通??梢曰謴?fù)包。但是,如果刪除了包中的重要文件,重新安裝包但不刪除無法解決問題,那么可能需要在重新安裝之前刪除包。對(duì)于這種情況,可能希望刪除現(xiàn)有的拷貝并重新安裝,但是不希望卸載和重新安裝依賴它的所有包。為此,在刪除包時(shí),可以使用 rpm
命令的 --nodeps
選項(xiàng)繞過依賴關(guān)系檢查。在清單 24 中,刪除了 vim-common 中的 /usr/bin/xxd 文件,然后演示如何恢復(fù)這個(gè)包。
[root@echidna ~]# rm /usr/bin/xxdrm: remove regular file `/usr/bin/xxd'? y[root@echidna ~]# # Oops! we needed that file[root@echidna ~]# rpm -Fvh vim-common-7.2.411-1.fc12.x86_64.rpm [root@echidna ~]# ls /usr/bin/xxdls: cannot access /usr/bin/xxd: No such file or directory[root@echidna ~]# # Oh! Freshening the package didn't replace the missing file[root@echidna ~]# rpm -e vim-commonerror: Failed dependencies: vim-common = 2:7.2.411-1.fc12 is needed by (installed) vim-enhanced-2:7.2.411-1.fc12.x86_64[root@echidna ~]# # Can't remove vim-common because vim-enhanced needs it[root@echidna ~]# rpm -e --nodeps vim-common[root@echidna ~]# # Bypassing the dependency check allowed removal[root@echidna ~]# rpm -Uvh vim-common-7.2.411-1.fc12.x86_64.rpm Preparing... ########################################### [100%] 1:vim-common ########################################### [100%][root@echidna ~]# # Update (or install) vim-common again[root@echidna ~]# ls /usr/bin/xxd/usr/bin/xxd[root@echidna ~]# # And /usr/bin/xxd is back
現(xiàn)在,如果發(fā)生意外或一般的更新失敗,您可以以幾種方法更新或修復(fù)。注意,在安裝 RPM 時(shí)也可以繞過依賴關(guān)系檢查,但是這通常不是好做法。
盡管 yum
會(huì)自動(dòng)地從存儲(chǔ)庫獲取包,但是您可能希望下載并保存 RPM,比如為了在不連網(wǎng)的系統(tǒng)上安裝它們、為了檢查它們的內(nèi)容或有其他原因。可以使用清單 25 所示的 yumdownloader
命令。對(duì)于我們的示例,這個(gè)包已經(jīng)安裝了,所以沒有要下載的包。如果有這樣的包,可以使用 --resolve
選項(xiàng)再次下載它們。
[ian@echidna ~]$ yumdownloader --resolve gclLoaded plugins: presto, refresh-packagekitadobe-linux-i386 17/17--> Running transaction check---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated--> Finished Dependency Resolutiongcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm | 6.3 MB 00:01
如果下載一個(gè) RPM,需要檢查它的內(nèi)容而不是安裝它,可以使用 rpm2cpio
命令把內(nèi)容轉(zhuǎn)換為 cpio
存檔,然后通過 cpio
命令提取出包中的某些或所有文件。清單 26 對(duì) gcl-selinux 包執(zhí)行轉(zhuǎn)換,然后顯示提取出的文件(和目錄)。關(guān)于 rpm2cpio
和 cpio
命令的更多信息參見它們的手冊(cè)頁。
[ian@echidna ~]$ yumdownloader gcl-selinuxLoaded plugins: presto, refresh-packagekitgcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm | 17 kB 00:00 [ian@echidna ~]$ mkdir gcl-selinux[ian@echidna ~]$ cd gcl-selinux[ian@echidna gcl-selinux]$ rpm2cpio ../gcl-selinux*.rpm | cpio -idv./usr/share/selinux/packages/gcl./usr/share/selinux/packages/gcl/gcl.pp182 blocks[ian@echidna gcl-selinux]$ find .../usr./usr/share./usr/share/selinux./usr/share/selinux/packages./usr/share/selinux/packages/gcl./usr/share/selinux/packages/gcl/gcl.pp
我們?cè)谇懊婵吹?YUM 提供了搜索功能,可以搜索包描述和包名。如果需要查明哪個(gè)包包含某個(gè)還沒有安裝的程序,還有幾種方法:
如果通過系統(tǒng)工具無法找到某個(gè) RPM,可以通過 Rpmfind.Net 服務(wù)器尋找 RPM(見 參考資料 中的鏈接)。
如果 Bash shell 搜索一個(gè)命令,但是沒有找到,那么 shell 就搜索 shell 函數(shù) command_not_found_handle
。如果 command_not_found_handle
函數(shù)存在,shell 以原來的命令和參數(shù)作為參數(shù)調(diào)用它,函數(shù)的退出狀態(tài)成為 shell 的退出狀態(tài)。如果沒有定義此函數(shù),shell 輸出錯(cuò)誤消息并返回退出狀態(tài) 127。常常在系統(tǒng) /etc/bash.bashrc 文件中設(shè)置此函數(shù)。清單 27 說明如何搜索 command-not-found 功能并安裝它。
[root@echidna ~]# yum search command-not-foundLoaded plugins: presto, refresh-packagekit========================== Matched: command-not-found ==========================PackageKit-command-not-found.x86_64 : Ask the user to install command line : programs automaticallyYou have new mail in /var/spool/mail/root[root@echidna ~]# yum install PackageKit-command-not-found.x86_64Loaded plugins: presto, refresh-packagekitSetting up Install ProcessResolving Dependencies--> Running transaction check---> Package PackageKit-command-not-found.x86_64 0:0.5.7-2.fc12 set to be updated--> Finished Dependency ResolutionDependencies Resolved================================================================================ Package Arch Version Repository Size================================================================================Installing: PackageKit-command-not-found x86_64 0.5.7-2.fc12 updates 102 kTransaction Summary================================================================================Install 1 Package(s)Upgrade 0 Package(s)Total download size: 102 kInstalled size: 262 kIs this ok [y/N]: yDownloading Packages:Setting up and reading Presto delta metadataProcessing delta metadataPackage(s) data still to download: 102 kPackageKit-command-not-found-0.5.7-2.fc12.x86_64.rpm | 102 kB 00:00 Running rpm_check_debugRunning Transaction TestTransaction Test SucceededRunning Transaction Installing : PackageKit-command-not-found-0.5.7-2.fc12.x86_64 1/1 Installed: PackageKit-command-not-found.x86_64 0:0.5.7-2.fc12 Complete!
清單 28 說明在安裝 PackageKit-command-not-found 之后如何定義這個(gè)函數(shù)。如果函數(shù)無法執(zhí)行搜索,那么它模擬標(biāo)準(zhǔn)的系統(tǒng)行為,返回 127。
[ian@echidna ~]$ type command_not_found_handlecommand_not_found_handle is a functioncommand_not_found_handle () { runcnf=1; retval=127; [ ! -S /var/run/dbus/system_bus_socket ] && runcnf=0; [ ! -x /usr/sbin/packagekitd ] && runcnf=0; if [ $runcnf -eq 1 ]; then /usr/libexec/pk-command-not-found $1; retval=$?; else echo "bash: $1: command not found"; fi; return $retval}
如果在 清單 1 中運(yùn)行 gcl 之前安裝了這個(gè)功能,可能會(huì)看到清單 29 所示的輸出。
[ian@echidna ~]$ gclCommand not found. Install package 'gcl' to provide command 'gcl'? [N/y]
除了 yum
和 rpm
之外,發(fā)行商可能提供了用于從存儲(chǔ)庫安裝包或更新整個(gè)系統(tǒng)的其他工具。這些工具可能是圖形化工具或命令行工具,或者同時(shí)提供這兩種界面。例如:
通常,這些工具以自動(dòng)或半自動(dòng)方式處理多個(gè)包更新。它們還可能提供顯示存儲(chǔ)庫內(nèi)容或搜索包的功能。更多信息參見發(fā)行版的文檔。
討論包安裝就不能不提到 PackageKit,這是一個(gè)為更方便地安裝和更新軟件而設(shè)計(jì)的系統(tǒng)。它的意圖是把不同發(fā)行版中使用的所有軟件圖形化工具統(tǒng)一起來。PackageKit 使用一個(gè)由系統(tǒng)激活的守護(hù)進(jìn)程,這意味著這個(gè)守護(hù)進(jìn)程只在需要時(shí)激活。Packagekit 有適用于 Gnome (gnome-packagekit) 和 KDE (KPackageKit) 的版本。上面介紹的 command-not-found 功能也是 PackageKit 的組成部分。它包括命令 pkcon
(從控制臺(tái)執(zhí)行包管理功能)和 pkmon
(監(jiān)視包集活動(dòng))。它還包含用于添加軟件包或更新系統(tǒng)的圖形化工具。圖 1 給出 Software Update 圖形界面的示例。
除了這里討論的內(nèi)容,RPM 和 YUM 包管理系統(tǒng)還有許多特性。更多信息參見 參考資料 中的鏈接。
聯(lián)系客服