自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux RPM和YUM包管理完全指南

系統(tǒng) Linux
RPM、YUM和APT有很多相似之處,都可以安裝和刪除Linux程序包。它們都有基本的命令行功能,同時通過其他工具提供對用戶更友好的界面。它們都可以從 Internet 獲取包。本文介紹如何通過RPM和YUM包來解決Linux系統(tǒng)軟件安裝、更新、刪除和查詢的任務(wù)。

在本文中,學(xué)習(xí)如何在 Linux 系統(tǒng)上使用 RPM 和 YUM 包管理工具管理包。學(xué)習(xí):

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

先決條件

為了最有效地利用本系列中的文章,您應(yīng)該具有基本的 Linux 知識,并需要準(zhǔn)備一個 Linux 系統(tǒng)用于練習(xí)本文介紹的命令。有時候不同版本的程序輸出格式不同,因此您所得到的結(jié)果未必總是與這里所示的清單和圖相同,特別是許多輸出高度依賴于系統(tǒng)上已經(jīng)安裝的包。您自己的輸出可能很不一樣,但是應(yīng)該能夠看出重要的共同點(diǎn)。

包管理簡介

過去,許多 Linux 程序以源代碼的形式發(fā)行,用戶把源代碼構(gòu)建為所需的程序或程序集;源代碼還附帶必需的手冊頁、配置文件等等?,F(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)。

從用戶的角度來說,基本的包管理功能由命令提供。Linux 開發(fā)人員一直致力于讓 Linux 更容易使用,他們開發(fā)了其他工具(包括 GUI 工具)來補(bǔ)充基本工具,這對最終用戶隱藏了基本工具的一部分復(fù)雜性。在本文和 學(xué)習(xí) Linux,101:Debian 包管理 中,我們主要討論基本工具,但是也會提到一些其他工具,讓您能夠繼續(xù)研究它們。

RPM、YUM 和 APT(適用于 Debian 系統(tǒng))有許多相似之處。它們都可以安裝和刪除包。關(guān)于安裝的包的信息保存在數(shù)據(jù)庫中。它們都有基本的命令行功能,同時通過其他工具提供對用戶更友好的界面。它們都可以從 Internet 獲取包。

在安裝 Linux 系統(tǒng)時,通常會安裝許多包。這個集合可能是根據(jù)系統(tǒng)的用途定制的,比如服務(wù)器、桌面或開發(fā)工作站。有時候,可能需要安裝新的包以添加新功能,更新現(xiàn)有的包,甚至刪除不再需要或已經(jīng)被新的包取代的包。我們來看看如何完成這些任務(wù)以及如何解決一些相關(guān)的難題,比如尋找包含某一命令的包。

RPM

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

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

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

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

YUM

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

#p#

安裝 RPM 包

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

清單 1. 沒有找到 gcl 命令

				
[ian@echidna ~]$ gcl --help
bash: gcl: command not found

[ian@echidna ~]$ which gcl
/usr/bin/which: no gcl in (/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerber
os/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/
sbin:/home/ian/bin)

[ian@echidna ~]$ type gcl
bash: type: gcl: not found

您可能會問同事要安裝哪個包,也可能猜想 gcl 命令應(yīng)該在 gcl 包中。這種猜測常常是對的,但是也不總是。我們稍后會看到如何尋找正確的包。在這里,需要 gcl 包。假設(shè)您已經(jīng)下載或以其他方式獲得了這個包的拷貝,可以使用帶 -i(代表安裝)選項(xiàng)的 rpm 命令安裝它,見清單 2。

清單 2. 用 rpm 安裝 gcl —— 第一次嘗試

				
[root@echidna ~]# rpm -i gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm
error: Failed dependencies:
gcl-selinux is needed by gcl-2.6.8-0.6.20090701cvs.fc12.x86_64

rpm 命令知道這個包有一個依賴包,但是它并不幫助您解決依賴問題。您需要自己獲取依賴包,然后再次嘗試,看看是否還有其他依賴包 — 重復(fù)這個過程,直到滿足所有依賴關(guān)系為止。好消息是,可以向 rpm 命令提供要安裝的包的列表,如果滿足所有依賴關(guān)系,它會以正確的次序安裝所有包。因此,您至少不必以正確的次序手工安裝每個包。

如果您使用過 Debian 的 APT,可能希望有像 apt-get 命令一樣的功能,apt-get 命令會尋找需要的東西(包括依賴包)并安裝它們。對于基于 RPM 的系統(tǒng),YUM (Yellowdog Updater Modified) 提供這種功能。清單 3 說明如何使用帶 install 選項(xiàng)的 yum 命令安裝 gcl 和必需的 gcl-selinux 包。

清單 3. 使用 yum 安裝 gcl

				
[root@echidna ~]# yum install gcl
Loaded plugins: presto, refresh-packagekit
Setting up Install Process
Resolving 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 Resolution

Dependencies Resolved

=====================================================================================
 Package           Arch         Version                          Repository     Size
=====================================================================================
Installing:
 gcl               x86_64       2.6.8-0.7.20100201cvs.fc12       updates       6.3 M
Installing for dependencies:
 gcl-selinux       x86_64       2.6.8-0.7.20100201cvs.fc12       updates        17 k

Transaction Summary
=====================================================================================
Install       2 Package(s)
Upgrade       0 Package(s)

Total download size: 6.4 M
Installed size: 40 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
updates/prestodelta                                           | 964 kB     00:01     
Processing delta metadata
Package(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_debug
Running Transaction Test
Transaction Test Succeeded
Running 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” 的存儲庫中找到了 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” 同意之后,它下載這兩個包,然后安裝依賴包,最后安裝 gcl。在本文后面會進(jìn)一步討論依賴關(guān)系。

包的位置

在前一節(jié)中,學(xué)習(xí)了如何安裝 RPM 包。但是,包來自什么地方呢?yum 如何知道從哪里下載包?起點(diǎn)是 /etc/yum.repos.d/ 目錄,這個目錄常常包含幾個 repo 文件。這是 repo 的默認(rèn)位置,但是可以在 YUM 配置文件(通常是 /etc/yum.conf)中指定其他位置。清單 4 給出 fedora-updates.repo,我們從它所對應(yīng)的位置獲取 gcl 并安裝在我的 Fedora 12 系統(tǒng)上。

典型的 repo 文件分為三個部分,一個用于一般的包,一個用于調(diào)試包,最后一個用于源代碼包。常??梢詮牟煌奈恢茫寸R像)獲取發(fā)行版的包拷貝。所以 repo 文件告訴 yum 在哪里可以找到每個部分的最新鏡像列表。注意,發(fā)行版的發(fā)布級別和機(jī)器架構(gòu)表示為參數(shù),所以對于我的 x86_64 Fedora 12 系統(tǒng),yum 會從 https://mirrors.fedoraproject.org/metalink?repo=updates-released-f12&arch=x86_64 下載列表。

除了存儲庫位置之外,repo 文件還指出某個存儲庫是否啟用了,以及是否應(yīng)該使用 GPG 簽名檢查下載的包。

清單 4. fedora-updates.repo

				
[ian@echidna ~]$ cat /etc/yum.repos.d/fedora-updates.repo
[updates]
name=Fedora $releasever - $basearch - Updates
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever
/$basearch/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$r
eleasever&arch=$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[updates-debuginfo]
name=Fedora $releasever - $basearch - Updates - Debug
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever
/$basearch/debug/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-deb
ug-f$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[updates-source]
name=Fedora $releasever - Updates Source
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever
/SRPMS/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-sou
rce-f$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

YUM 和 RPM 使用本地數(shù)據(jù)庫判斷安裝的包。本地數(shù)據(jù)庫中存儲的包元數(shù)據(jù)是從啟用的存儲庫獲取的。盡管很少需要為本地數(shù)據(jù)庫操心,但是可以使用 yum clean 命令清除本地存儲的信息的不同部分,使用 yum makecache 在本地數(shù)據(jù)庫中為啟用的 repo 創(chuàng)建信息。例如,如果修改了 repo 配置,就可能需要這么做。

#p#

刪除 RPM 包

如果要刪除包,可以使用 yum 的 remove 選項(xiàng)或 rpm 的 -e 選項(xiàng)。使用 rpm -e 刪除 gcl 的試運(yùn)行見清單 5。如果可以刪除這個包,就不會有輸出。

清單 5. 試刪除 gcl

				
[root@echidna ~]# rpm -e --test gcl

與使用 apt-get 模擬刪除 Debian 包不同,RPM 系統(tǒng)并不維護(hù)自動安裝的包的相關(guān)信息,所以無法通過試刪除查明哪些依賴包也可以刪除。但是,如果在單一命令中指定多個要刪除的包,那么沒有依賴關(guān)系的包會先于有依賴關(guān)系的包刪除。

與安裝包不同,當(dāng)使用 rpm 刪除包時,在刪除包之前沒有提示。但是,如果試圖刪除其他包需要的包,它不會執(zhí)行刪除操作,您會看到清單 6 所示的錯誤消息。

清單 6. 用 rpm 刪除依賴包

				
[root@echidna ~]# rpm -e gcl-selinux
error: Failed dependencies:
	gcl-selinux is needed by (installed) gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

如果使用 yum remove,在執(zhí)行事務(wù)測試之后會顯示提示。如果試圖刪除的包是其他已安裝包的依賴包,YUM 會提議刪除這些包和依賴包,見清單 7。

清單 7. 用 yum 刪除依賴包

				
[root@echidna ~]# yum remove gcl-selinux
Loaded plugins: presto, refresh-packagekit
Setting up Remove Process
Resolving 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 Resolution

Dependencies Resolved

=====================================================================================
 Package          Arch        Version                            Repository     Size
=====================================================================================
Removing:
 gcl-selinux      x86_64      2.6.8-0.7.20100201cvs.fc12         @updates       90 k
Removing for dependencies:
 gcl              x86_64      2.6.8-0.7.20100201cvs.fc12         @updates       40 M

Transaction Summary
=====================================================================================
Remove        2 Package(s)
Reinstall     0 Package(s)
Downgrade     0 Package(s)

Is this ok [y/N]: n
Exiting on user Command
Complete!

#p#

升級 RPM 包

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

清單 8. 使用 yum update 執(zhí)行更新

				
[root@echidna ~]# yum update 'gr*'
Loaded plugins: presto, refresh-packagekit
Setting up Update Process
Resolving 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 Resolution

Dependencies 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 M

Transaction Summary
=====================================================================================
Install       0 Package(s)
Upgrade       2 Package(s)

Total download size: 1.7 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Download delta size: 854 k
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: [Errno 14] HTTP Error 404 : http://fedora.fastsoft.n
et/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_debug
Running Transaction Test
Transaction Test Succeeded
Running 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)。這兩個選項(xiàng)的差異是, -U 選項(xiàng)更新現(xiàn)有的包,如果這個包還沒有安裝,就安裝它;而 -F 選項(xiàng)只升級或刷新 已經(jīng)安裝的包。因此,經(jīng)常使用 -U 選項(xiàng),尤其是在命令行包含 RPM 列表的情況下。這樣的話,就會安裝未安裝的包,升級已經(jīng)安裝的包。常常使用另外兩個選項(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 包要從一個更新鏡像獲取。

清單 9. 用 rpm 更新包

				
[root@echidna ~]# ls *.rpm
vim-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.rpm
Retrieving http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/updates/12/x86
_64/vim-minimal-7.2.411-1.fc12.x86_64.rpm
Preparing...                ########################################### [100%]
   1:vim-common             ########################################### [ 33%]
   2:vim-enhanced           ########################################### [ 67%]
   3:vim-minimal            ########################################### [100%]

#p#

查詢 RPM 包

您在前面的示例中看到,用 rpm 命令安裝 rpm 需要包文件的完整名稱(或 URL),比如 gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm。另一方面,用 yum 安裝或用這兩個命令刪除 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)會得到包的相關(guān)信息。注意,安裝、升級或刪除包需要根權(quán)力,但是非根用戶也可以查詢 rpm 數(shù)據(jù)庫。

清單 10. 顯示 gcl 的相關(guān)信息

				
[ian@echidna ~]$ yum list gcl
Loaded plugins: presto, refresh-packagekit
Installed Packages
gcl.x86_64                  2.6.8-0.7.20100201cvs.fc12                  @updates
[ian@echidna ~]$ rpm -q gcl
gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

[ian@echidna ~]$ yum info gcl
Loaded plugins: presto, refresh-packagekit
Installed Packages
Name       : gcl
Arch       : x86_64
Version    : 2.6.8
Release    : 0.7.20100201cvs.fc12
Size       : 40 M
Repo       : installed
From repo  : updates
Summary    : GNU Common Lisp
URL        : 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 gcl
Name        : gcl                          Relocations: (not relocatable)
Version     : 2.6.8                             Vendor: Fedora Project
Release     : 0.7.20100201cvs.fc12          Build Date: Tue 23 Mar 2010 03:20:36 PM EDT
Install Date: Wed 05 May 2010 01:01:34 PM EDT      Build Host: x86-02.phx2.fedoraproject.
org
Group       : Development/Languages         Source RPM: gcl-2.6.8-0.7.20100201cvs.fc12.sr
c.rpm
Size        : 41667750                         License: GPL+ and LGPLv2+
Signature   : RSA/8, Tue 23 Mar 2010 04:14:06 PM EDT, Key ID 9d1cc34857bbccba
Packager    : Fedora Project
URL         : http://www.gnu.org/software/gcl/
Summary     : GNU Common Lisp
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.

詳細(xì)的清單顯示與 RPM 包相關(guān)聯(lián)的一些標(biāo)記。注意,rpm 和 yum 以不同的格式顯示不同的信息。在本文中,我們都使用標(biāo)準(zhǔn)命令選項(xiàng)提供的基本輸出。如果希望使用 rpm --queryformat 選項(xiàng)定制查詢輸出,請參考手冊頁。如果希望了解您的 rpm 版本支持的所有標(biāo)記,應(yīng)該運(yùn)行 rpm --querytags。

如清單 10 所示,可以使用 yum 列出安裝的包。還可以用它列出有更新可用的包、可以安裝的包以及具有其他性質(zhì)的包,比如廢棄的包或存儲庫中最近添加的包。甚至可以使用 yum 搜索包。在清單 11 中可以看到,texmacs 包還沒有安裝,但是可以從 fedora 存儲庫獲取它。如果搜索 “texmacs”,會看到提到它的四個包。很容易看出為什么會找到 TeXmacs* 包。使用 yum info pydot 查明為什么也會找到 pydot 包。

清單 11. 搜索 "texmacs"

				
[ian@echidna ~]$ yum list texmacs
Loaded plugins: presto, refresh-packagekit
Available Packages
TeXmacs.x86_64                         1.0.7.2-2.fc12                          fedora
[ian@echidna ~]$ yum search texmacs
Loaded plugins: presto, refresh-packagekit
================================= Matched: texmacs ==================================
TeXmacs-devel.i686 : Development files for TeXmacs
TeXmacs-devel.x86_64 : Development files for TeXmacs
TeXmacs.x86_64 : Structured wysiwyg scientific text editor
pydot.noarch : Python interface to Graphviz's Dot language

對于后面的查詢示例,我們主要使用 rpm,因?yàn)樗倪x項(xiàng)更豐富。許多示例也可以使用 yum 完成,yum 有一些基本 rpm 選項(xiàng)不具備的功能。

RPM 包和其中的文件

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

清單 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)安裝的包。如果剛下載了一個包,想獲取同類信息,可以在查詢中使用 -p(代表包文件)選項(xiàng)并指定包的文件 名(與安裝包時一樣)。清單 13 顯示前面下載的兩個 vim 包的信息。我們只作為根用戶運(yùn)行它,因?yàn)槲募诟脩舻闹髂夸浿???梢蕴砑悠渌樵冞x項(xiàng),比如用 -l 列出文件,用 -i 列出信息。

清單 13. 顯示兩個 vim 包的包文件信息

				
[root@echidna ~]# rpm -qp *.rpm
vim-common-7.2.411-1.fc12.x86_64
vim-enhanced-7.2.411-1.fc12.x86_64

查詢安裝的所有包

-a 選項(xiàng)把查詢應(yīng)用于安裝的所有包。這會生成許多輸出,所以通常同時使用一個或多個篩選器,比如用 sort 進(jìn)行排序,用 more 或 less 進(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. 對所有包執(zhí)行查詢

				
[ian@echidna ~]$ rpm -qa | sort | more
aalib-libs-1.4.0-0.18.rc5.fc12.x86_64
abrt-1.0.8-2.fc12.x86_64
abrt-addon-ccpp-1.0.8-2.fc12.x86_64
abrt-addon-kerneloops-1.0.8-2.fc12.x86_64
abrt-addon-python-1.0.8-2.fc12.x86_64
abrt-desktop-1.0.8-2.fc12.x86_64
abrt-gui-1.0.8-2.fc12.x86_64
abrt-libs-1.0.8-2.fc12.x86_64
abrt-plugin-bugzilla-1.0.8-2.fc12.x86_64
abrt-plugin-logger-1.0.8-2.fc12.x86_64
abrt-plugin-runapp-1.0.8-2.fc12.x86_64
abyssinica-fonts-1.0-5.fc12.noarch
acl-2.2.49-2.fc12.x86_64
...
[ian@echidna ~]$ rpm -qa | wc -l
1792
[ian@echidna ~]$ rpm -qal | wc -l
281052
[ian@echidna ~]$ rpm -qad | wc -l
45686
[ian@echidna ~]$ rpm -qa | grep -i gcl
gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64
gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

使用 rpm -qa 可以簡化對多個系統(tǒng)的管理。如果把排序的輸出重定向到一臺機(jī)器上的文件,然后在另一臺機(jī)器上也這么做,就可以使用 diff 程序?qū)ふ也町悺?/p>

哪個包包含某一文件?

既然可以列出所有包和一個包中的所有文件,現(xiàn)在就掌握了查明哪個包包含某一文件所需的所有信息。但是,rpm 命令的 -f(或 --file)選項(xiàng)可以幫助找到包含某一文件的包。假設(shè)您想知道前面看到的哪個 vim 包提供 vim 命令。您需要文件的完整路徑。清單 15 說明如何使用 which 命令得到 vim 命令的完整路徑,可以使用這個輸出作為 rpm -qf 命令的輸入。注意,`which guile-config` 前后的符號是反撇號。在 Bash shell 中,另一種使用方法是 $(which vim)。

清單 15. 哪個包提供 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)榇嬖谝蕾囮P(guān)系。除了文件之外,RPM 包可能包含其他包所依賴的任意功能。

如您所見,依賴關(guān)系通常會正常發(fā)揮作用。如果需要同時安裝幾個包,其中一些依賴于其他包,那么只需使用 yum,或者向 rpm -Uvh 命令提供完整的列表,它會分析依賴關(guān)系并按正確的次序執(zhí)行安裝。

除了在安裝或刪除包時產(chǎn)生的錯誤消息之外,還可以通過幾種方法查明包需要或依賴的文件或功能。

rpm 命令提供的一個選項(xiàng)可以查詢安裝的包或包文件,從而查明它們依賴或需要 什么功能。這個選項(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-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)  
rpmlib(PayloadIsXz) <= 5.2-1

把功能與提供它們的包聯(lián)系起來不太容易。帶 deplist 選項(xiàng)的 yum 命令可以提供幫助。如果只指定包名,沒有版本號,可能會得到其他已知版本的列表。清單 17 說明如何獲得安裝的 gcl 版本的依賴列表。

清單 17. 使用 yum deplist 查明 gcl 需要什么

				
[ian@echidna ~]$ yum deplist $(rpm -q gcl)
Loaded plugins: presto, refresh-packagekit
Finding 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

這個列表還顯示每個功能可能的提供者??梢钥吹酱蠖鄶?shù)依賴功能可以由多個包級別提供。例如,/bin/sh 可以來自 bash 的兩個級別之一。通過使用創(chuàng)造性的篩選,可以把輸出縮減為清單 18 所示的包名列表。

清單 18. 把 yum deplist 的輸出縮減為只列出包名

				
[ian@echidna ~]$ yum deplist $(rpm -q gcl) | grep "provider:" | \
> awk '{ print $2 }'|sort|uniq
bash.x86_64
gcl-selinux.x86_64
glibc.i686
glibc.x86_64
gmp.x86_64
info.x86_64
libX11.x86_64
readline.x86_64
tcl.x86_64
tk.x86_64
zlib.x86_64

如果只想知道需要安裝哪些包,可以運(yùn)行 yum install,查看在提示接受安裝提議之前顯示的列表。

除了查明包需要的功能之外,還可能需要了解哪個包提供某一功能。前面演示了如何查明哪個包包含某一文件。清單 19 說明如何使用 rpm 或 yum 查明哪個包提供 gcl-selinux(x86-64) 功能。除了顯示提供此功能的已安裝包的信息之外,YUM 還顯示存儲庫中可用的包或版本。可以看到,原來的 2.6.8-0.6 版來自 fedora 存儲庫,而 updates 存儲庫中有更新的 2.6.8-0.7 版。

清單 19. 哪個包提供 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-packagekit
gcl-selinux-2.6.8-0.6.20090701cvs.fc12.x86_64 : SELinux policy for GCL images
Repo        : fedora
Matched from:
Other       : gcl-selinux(x86-64)



gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL images
Repo        : updates
Matched from:
Other       : gcl-selinux(x86-64)



gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL images
Repo        : installed
Matched from:
Other       : Provides-match: gcl-selinux(x86-64)

#p#

RPM 包文件完整性

為了確保完整性,RPM 包包含一個摘要(比如 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.rpm
vim-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)

可能會產(chǎn)生下面的輸出:

V3 DSA signature: NOKEY, key ID 16a61572

這意味著這個包是經(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 手冊頁。還可以在 RPM 主頁上找到關(guān)于簽名的二進(jìn)制代碼的更多信息(見 參考資料 中的鏈接)。

檢驗(yàn)安裝的包

與檢查 rpm 的完整性一樣,還可以使用 rpm -V 檢查已安裝的文件的完整性。這個步驟確保從 rpm 安裝文件之后文件沒有修改過。如清單 21 所示,如果包仍然良好,這個命令沒有輸出;但是,可以添加 -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.vim
vim-common-7.2.411-1.fc12.x86_64
vim-common-7.2.411-1.fc12.x86_64
[root@echidna ~]# rm /usr/bin/xxd
rm: remove regular file `/usr/bin/xxd'? y
[root@echidna ~]# cp /bin/bash /usr/share/vim/vim72/syntax/bindzone.vim
cp: overwrite `/usr/share/vim/vim72/syntax/bindzone.vim'? y
[root@echidna ~]# rpm -V vim-common
missing     /usr/bin/xxd
S.5....T.    /usr/share/vim/vim72/syntax/bindzone.vim

輸出表明對 /usr/share/vim/vim72/syntax/bindzone.vim 文件的 MD5 和、文件大小和 mtime 檢查失敗了。解決這個問題的一種方法是刪除這個包,然后重新安裝,依賴于 vim-common 的其他已安裝包仍然可以正常運(yùn)行。這個解決方案使用 rpm 的 --force 選項(xiàng)或 yum 的 reinstall 功能強(qiáng)制重新安裝。清單 23 演示如何用 yum 重新安裝,然后檢查包現(xiàn)在是否良好,檢查刪除的文件是否已經(jīng)恢復(fù)了。

清單 23. 重新安裝 vim-common 包

				
[root@echidna ~]# yum reinstall vim-common
Loaded plugins: presto, refresh-packagekit
Setting up Reinstall Process
Resolving Dependencies
--> Running transaction check
---> Package vim-common.x86_64 2:7.2.411-1.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package            Arch           Version                     Repository       Size
=====================================================================================
Reinstalling:
 vim-common         x86_64         2:7.2.411-1.fc12            updates         6.0 M

Transaction Summary
=====================================================================================
Remove        0 Package(s)
Reinstall     1 Package(s)
Downgrade     0 Package(s)

Total download size: 6.0 M
Installed size: 17 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
updates/prestodelta                                           | 969 kB     00:00     
Processing delta metadata
Package(s) data still to download: 6.0 M
vim-common-7.2.411-1.fc12.x86_64.rpm                          | 6.0 MB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: 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ù)包。但是,如果刪除了包中的重要文件,重新安裝包但不刪除無法解決問題,那么可能需要在重新安裝之前刪除包。對于這種情況,可能希望刪除現(xiàn)有的拷貝并重新安裝,但是不希望卸載和重新安裝依賴它的所有包。為此,在刪除包時,可以使用 rpm 命令的 --nodeps 選項(xiàng)繞過依賴關(guān)系檢查。在清單 24 中,刪除了 vim-common 中的 /usr/bin/xxd 文件,然后演示如何恢復(fù)這個包。

清單 24. 用 rpm 更新包

				
[root@echidna ~]# rm /usr/bin/xxd
rm: 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/xxd
ls: 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-common
error: Failed dependencies:
	vim-common = 2:7.2.411-1.fc12 is needed by (installed) vim-enhanced-2:7.2.411-1.f
c12.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 時也可以繞過依賴關(guān)系檢查,但是這通常不是好做法。

#p#

從存儲庫下載 RPM

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

清單 25. 下載 gcl 包

				
[ian@echidna ~]$ yumdownloader --resolve gcl
Loaded plugins: presto, refresh-packagekit
adobe-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 Resolution
gcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm                     | 6.3 MB     00:01     

使用 rpm2cpio

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

清單 26. 用 rpm2cpio 提取 gcl-selinux 包

				
[ian@echidna ~]$ yumdownloader gcl-selinux
Loaded plugins: presto, refresh-packagekit
gcl-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.pp
182 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

#p#

尋找 RPM

我們在前面看到 YUM 提供了搜索功能,可以搜索包描述和包名。如果需要查明哪個包包含某個還沒有安裝的程序,還有幾種方法:

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

如果通過系統(tǒng)工具無法找到某個 RPM,可以通過 Rpmfind.Net 服務(wù)器尋找 RPM。

命令未找到

如果 Bash shell 搜索一個命令,但是沒有找到,那么 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 輸出錯誤消息并返回退出狀態(tài) 127。常常在系統(tǒng) /etc/bash.bashrc 文件中設(shè)置此函數(shù)。清單 27 說明如何搜索 command-not-found 功能并安裝它。

清單 27. 尋找并安裝 command-not-found 功能

				
[root@echidna ~]# yum search command-not-found
Loaded plugins: presto, refresh-packagekit
========================== Matched: command-not-found ==========================
PackageKit-command-not-found.x86_64 : Ask the user to install command line
                                    : programs automatically
You have new mail in /var/spool/mail/root
[root@echidna ~]# yum install PackageKit-command-not-found.x86_64
Loaded plugins: presto, refresh-packagekit
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package PackageKit-command-not-found.x86_64 0:0.5.7-2.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                          Arch       Version          Repository   Size
================================================================================
Installing:
 PackageKit-command-not-found     x86_64     0.5.7-2.fc12     updates     102 k

Transaction Summary
================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 102 k
Installed size: 262 k
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download: 102 k
PackageKit-command-not-found-0.5.7-2.fc12.x86_64.rpm     | 102 kB     00:00     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running 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 之后如何定義這個函數(shù)。如果函數(shù)無法執(zhí)行搜索,那么它模擬標(biāo)準(zhǔn)的系統(tǒng)行為,返回 127。

清單 28. command_not_found_handle

				
[ian@echidna ~]$ type command_not_found_handle
command_not_found_handle is a function
command_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 之前安裝了這個功能,可能會看到清單 29 所示的輸出。

清單 29. 安裝 command_not_found_handle 之后嘗試運(yùn)行 gcl

				
[ian@echidna ~]$ gcl
Command not found. Install package 'gcl' to provide command 'gcl'? [N/y] 

其他工具

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

  1. YaST (SUSE)
  2. up2date (Red Hat)
  3. Mandrake Software Management (Mandriva)

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

PackageKit

討論包安裝就不能不提到 PackageKit,這是一個為更方便地安裝和更新軟件而設(shè)計的系統(tǒng)。它的意圖是把不同發(fā)行版中使用的所有軟件圖形化工具統(tǒng)一起來。PackageKit 使用一個由系統(tǒng)激活的守護(hù)進(jìn)程,這意味著這個守護(hù)進(jìn)程只在需要時激活。Packagekit 有適用于 Gnome (gnome-packagekit) 和 KDE (KPackageKit) 的版本。上面介紹的 command-not-found 功能也是 PackageKit 的組成部分。它包括命令 pkcon(從控制臺執(zhí)行包管理功能)和 pkmon(監(jiān)視包集活動)。它還包含用于添加軟件包或更新系統(tǒng)的圖形化工具。圖 1 給出 Software Update 圖形界面的示例。

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

Fedora 12 (Gnome) 上 Software Update 圖形界面的屏幕圖 

除了這里討論的內(nèi)容,RPM 和 YUM 包管理系統(tǒng)還有許多特性。本文介紹就到這里為止,想要更加深入的了解,可以參考其他的文章和資料。

【編輯推薦】

  1. 在Ubuntu系統(tǒng)中安裝RPM格式軟件包的方法
  2. CentOS rpm安裝編譯gcc時的步驟
  3. CentOS VSFTPD安裝時RPM軟件包安裝的方法
責(zé)任編輯:yangsai 來源: IBMDW
相關(guān)推薦

2017-08-17 10:47:05

Linux包管理

2024-12-17 18:17:13

Python開發(fā)

2013-11-20 15:32:13

紅帽RedHatYUM包

2009-10-14 15:58:59

布線系統(tǒng)管理

2009-11-05 16:27:31

接入網(wǎng)設(shè)備

2013-09-29 10:14:24

YUM軟件包管理Linux YUM

2018-04-12 14:33:29

2022-08-04 14:54:50

APTDNFYUM

2015-07-31 10:20:13

Linux命令完全指南

2021-07-27 12:58:46

Linux包管理器安命令

2021-02-05 07:48:06

Linux操作系統(tǒng)軟件

2022-05-04 11:10:58

Linuxdnf 命令

2022-05-07 11:08:50

Linuxapt 命令

2010-11-30 09:42:44

jQuery數(shù)組

2022-11-16 08:41:43

2021-12-09 09:27:22

MacOSHomebrew包管理器

2023-12-20 10:14:24

2010-02-23 17:21:06

Fedora yum

2022-06-03 00:42:15

數(shù)據(jù)安全數(shù)據(jù)量

2020-06-15 19:20:00

AppImageLinux軟件包管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號