开心六月综合激情婷婷|欧美精品成人动漫二区|国产中文字幕综合色|亚洲人在线成视频

    1. 
      
        <b id="zqfy3"><legend id="zqfy3"><fieldset id="zqfy3"></fieldset></legend></b>
          <ul id="zqfy3"></ul>
          <blockquote id="zqfy3"><strong id="zqfy3"><dfn id="zqfy3"></dfn></strong></blockquote>
          <blockquote id="zqfy3"><legend id="zqfy3"></legend></blockquote>
          打開APP
          userphoto
          未登錄

          開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

          開通VIP
          學(xué)習(xí) Linux,101: RPM 和 YUM 包管理

          關(guān)于本系列

          本系列文章幫助您學(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í):

          • 使用 RPM 和 YUM 安裝、卸載、升級(jí)和刪除包
          • 獲取版本、狀態(tài)、依賴關(guān)系、完整性和簽名等 RPM 包相關(guān)信息
          • 判斷一個(gè)包提供哪些文件,查明某個(gè)文件來自哪個(gè)包

          本文幫助您準(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)。

          回頁首

          包管理簡介

          聯(lián)系 Ian

          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)的難題,比如尋找包含某一命令的包。

          RPM

          Red Hat 于 1995 年引入了 RPM。RPM 現(xiàn)在是 Linux Standard Base (LSB) 中采用的包管理系統(tǒng)。rpm 命令選項(xiàng)分為三組:

          • 用于查詢和檢查包
          • 用于安裝、升級(jí)和刪除包
          • 用于執(zhí)行其他功能

          在本文中,我們主要關(guān)注前兩組命令選項(xiàng)。在 RPM 的手冊(cè)頁中可以找到其他功能的相關(guān)信息。

          還應(yīng)該注意 rpm 是操作 RPM 的主要命令,而 .rpm 是 RPM 文件使用的擴(kuò)展名。所以 “一個(gè) rpm” 或 “某某 rpm” 一般是指 RPM 文件,而 rpm 通常指命令。

          YUM

          YUM 在 RPM 系統(tǒng)中增加了自動(dòng)更新和包管理,包括依賴關(guān)系管理。與 Debian Advanced Packaging Tool (APT) 一樣,除了了解系統(tǒng)上安裝的包之外,YUM 還使用存儲(chǔ)庫。存儲(chǔ)庫是包的集合,通??梢酝ㄟ^網(wǎng)絡(luò)連接訪問它們。

          回頁首

          安裝 RPM 包

          假設(shè)您想學(xué) Lisp,一位同事讓您使用 gcl 命令。您試著輸入 gcl --help、which gcltype gcl。但是,如果系統(tǒng)無法找到 gcl,您可能會(huì)看到與清單 1 相似的輸出。

          清單 1. 沒有找到 gcl 命令
          [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。

          清單 2. 用 rpm 安裝 gcl —— 第一次嘗試
          [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 包。

          清單 3. 使用 yum 安裝 gcl
          [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 簽名檢查下載的包。

          清單 4. fedora-updates.repo
          [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 配置,就可能需要這么做。

          回頁首

          刪除 RPM 包

          如果要?jiǎng)h除包,可以使用 yumremove 選項(xiàng)或 rpm-e 選項(xiàng)。使用 rpm -e 刪除 gcl 的試運(yùn)行見清單 5。如果可以刪除這個(gè)包,就不會(huì)有輸出。

          清單 5. 試刪除 gcl
          [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ò)誤消息。

          清單 6. 用 rpm 刪除依賴包
          [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。

          清單 7. 用 yum 刪除依賴包
          [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í) RPM 包

          既然已經(jīng)了解了如何安裝和刪除 RPM,我們來看看如何把 RPM 包升級(jí)到更高級(jí)別??梢允褂?yum update 更新整個(gè)系統(tǒng),還可以指定單一包或通配符。清單 8 說明如何更新所有名稱以 “gr” 開頭的包。注意,這里使用撇號(hào)防止 shell 展開 “*”。

          清單 8. 使用 yum update 執(zhí)行更新
          [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è)更新鏡像獲取。

          清單 9. 用 rpm 更新包
          [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 命令安裝 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ù)庫。

          清單 10. 顯示 gcl 的相關(guān)信息
          [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)記。注意,rpmyum 以不同的格式顯示不同的信息。在本文中,我們都使用標(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 包。

          清單 11. 搜索 "texmacs"
          [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è)頁。

          RPM 包和其中的文件

          用戶常常希望知道一個(gè)包中有哪些文件,或者某個(gè)文件來自哪個(gè)包。使用 -ql 選項(xiàng)列出 gcl 包中的文件,見清單 12。這個(gè)包中有許多文件,所以這里只給出部分輸出。

          清單 12. 顯示 gcl 包中的文件
          [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 列出信息。

          清單 13. 顯示兩個(gè) vim 包的包文件信息
          [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)行排序,用 moreless 進(jìn)行分頁輸出,用 wc 獲取包或文件內(nèi)容,用 grep 搜索您不確定名稱的包。清單 14 給出以下查詢:

          1. 系統(tǒng)上所有包的排序列表
          2. 系統(tǒng)上所有包的數(shù)量
          3. 系統(tǒng)上所有包中的所有文件的數(shù)量
          4. 用 RPM 安裝的所有文檔文件的數(shù)量
          5. 搜索名稱中包含 “gcl” 的所有包(區(qū)分大小寫)
          清單 14. 對(duì)所有包執(zhí)行查詢
          [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è)包包含某一文件?

          既然可以列出所有包和一個(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)。

          清單 15. 哪個(gè)包提供 vim 可執(zhí)行文件
          [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

          RPM 依賴關(guān)系

          在前面看到刪除 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 文件名。

          清單 16. gcl 需要什么
          [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 版本的依賴列表。

          清單 17. 使用 yum deplist 查明 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 所示的包名列表。

          清單 18. 把 yum deplist 的輸出縮減為只列出包名
          [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 說明如何使用 rpmyum 查明哪個(gè)包提供 gcl-selinux(x86-64) 功能。除了顯示提供此功能的已安裝包的信息之外,YUM 還顯示存儲(chǔ)庫中可用的包或版本??梢钥吹?,原來的 2.6.8-0.6 版來自 fedora 存儲(chǔ)庫,而 updates 存儲(chǔ)庫中有更新的 2.6.8-0.7 版。

          清單 19. 哪個(gè)包提供 gcl-selinux(x86-64) 功能
          [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 包文件完整性

          為了確保完整性,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 的完整性。

          清單 20. 檢查 vim-enhanced 包文件的完整性
          [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
                              --import
          命令導(dǎo)入它。更多信息參見 RPM 手冊(cè)頁。還可以在 RPM 主頁上找到關(guān)于簽名的二進(jìn)制代碼的更多信息(見 參考資料 中的鏈接)。

          回頁首

          檢驗(yàn)安裝的包

          與檢查 rpm 的完整性一樣,還可以使用 rpm -V 檢查已安裝的文件的完整性。這個(gè)步驟確保從 rpm 安裝文件之后文件沒有修改過。如清單 21 所示,如果包仍然良好,這個(gè)命令沒有輸出;但是,可以添加 -v 選項(xiàng)以產(chǎn)生更詳細(xì)的輸出。

          清單 21. 檢驗(yàn)已安裝的 vim-common 包
          [ian@echidna ~]$ rpm -V vim-common

          現(xiàn)在,我們作為根用戶刪除 /usr/bin/xxd 并把 /usr/share/vim/vim72/syntax/bindzone.vim 替換為 /bin/bash。然后再次檢查。結(jié)果見清單 22。

          清單 22. 篡改 vim-common 包
          [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)或 yumreinstall 功能強(qiáng)制重新安裝。清單 23 演示如何用 yum 重新安裝,然后檢查包現(xiàn)在是否良好,檢查刪除的文件是否已經(jīng)恢復(fù)了。

          清單 23. 重新安裝 vim-common 包
          [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è)包。

          清單 24. 用 rpm 更新包
          [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)系檢查,但是這通常不是好做法。

          回頁首

          從存儲(chǔ)庫下載 RPM

          盡管 yum 會(huì)自動(dòng)地從存儲(chǔ)庫獲取包,但是您可能希望下載并保存 RPM,比如為了在不連網(wǎng)的系統(tǒng)上安裝它們、為了檢查它們的內(nèi)容或有其他原因。可以使用清單 25 所示的 yumdownloader 命令。對(duì)于我們的示例,這個(gè)包已經(jīng)安裝了,所以沒有要下載的包。如果有這樣的包,可以使用 --resolve 選項(xiàng)再次下載它們。

          清單 25. 下載 gcl 包
          [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

          回頁首

          使用 rpm2cpio

          如果下載一個(gè) RPM,需要檢查它的內(nèi)容而不是安裝它,可以使用 rpm2cpio 命令把內(nèi)容轉(zhuǎn)換為 cpio 存檔,然后通過 cpio 命令提取出包中的某些或所有文件。清單 26 對(duì) gcl-selinux 包執(zhí)行轉(zhuǎn)換,然后顯示提取出的文件(和目錄)。關(guān)于 rpm2cpiocpio 命令的更多信息參見它們的手冊(cè)頁。

          清單 26. 用 rpm2cpio 提取 gcl-selinux 包
          [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

          回頁首

          尋找 RPM

          我們?cè)谇懊婵吹?YUM 提供了搜索功能,可以搜索包描述和包名。如果需要查明哪個(gè)包包含某個(gè)還沒有安裝的程序,還有幾種方法:

          • 可以猜測可能包含它的包,下載這個(gè)包,但是不安裝。得到這個(gè)包之后,就可以查詢它。
          • 可以搜索 Internet。
          • 可以試試下面介紹的 command-not-found 功能。

          如果通過系統(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 功能并安裝它。

          清單 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。

          清單 28. command_not_found_handle
          [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 所示的輸出。

          清單 29. 安裝 command_not_found_handle 之后嘗試運(yùn)行 gcl
          [ian@echidna ~]$ gclCommand not found. Install package 'gcl' to provide command 'gcl'? [N/y]

          回頁首

          其他工具

          除了 yumrpm 之外,發(fā)行商可能提供了用于從存儲(chǔ)庫安裝包或更新整個(gè)系統(tǒng)的其他工具。這些工具可能是圖形化工具或命令行工具,或者同時(shí)提供這兩種界面。例如:

          • YaST (SUSE)
          • up2date (Red Hat)
          • Mandrake Software Management (Mandriva)

          通常,這些工具以自動(dòng)或半自動(dòng)方式處理多個(gè)包更新。它們還可能提供顯示存儲(chǔ)庫內(nèi)容或搜索包的功能。更多信息參見發(fā)行版的文檔。

          回頁首

          PackageKit

          討論包安裝就不能不提到 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 圖形界面的示例。

          圖 1. Fedora 12 (Gnome) 上的 Software Update 圖形界面

          除了這里討論的內(nèi)容,RPM 和 YUM 包管理系統(tǒng)還有許多特性。更多信息參見 參考資料 中的鏈接。




          本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
          打開APP,閱讀全文并永久保存 查看更多類似文章
          猜你喜歡
          類似文章
          Redhat系列Linux系統(tǒng):RPM和YUM包管理
          博客園 - chiname - Subversion比CVS更好用
          配置管理小報(bào)111105:隱藏的CVS/目錄
          LINUX命令大全
          為你詳解Linux安裝GCC方法
          Linux系統(tǒng)故障排查和修復(fù)技巧
          更多類似文章 >>
          生活服務(wù)
          分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
          綁定賬號(hào)成功
          后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
          如果VIP功能使用有故障,
          可點(diǎn)擊這里聯(lián)系客服!

          聯(lián)系客服