使用RPM獲取包的信息

rpm -q 作了什麼

若是你想要在你的系統上安裝、卸載或升級軟件,但殊不知道在你的系統中已經有哪些軟件了,這是否是一件很蛋疼的事?你可能會陷入下面這些場景中:html

  • 你在你的系統中遇到一個文件,你不認識它,它也不認識你,它究竟是哪裏來的,是哪一個軟件安裝的。
  • 你的朋友發送一個軟件安裝包給你,可是你不知道這個軟件是幹什麼的,它將會安裝什麼功能,它從哪裏來。
  • 你記得你安裝了一個軟件,可是卻忘了這個軟件的版本,而且找不到關於這個軟件的文檔。

這些場景不勝枚舉,可是你能夠用rpm -q幫助你。微信

RPM查詢

當你瞭解瞭如何查詢軟件的信息後,很容易你就能敲出一個查詢命令來查詢你想要知道的信息。-q是一個最基本的選項,查詢可分爲對包的查詢以及對特定信息的查詢,下面看看針對包的查詢:ide

包查詢

首先你要知道你要查詢的是哪個或那些包。ui

包名片

包名片是標識一個包的惟一字符串,每一個名片包含了三種信息:spa

  1. 安裝包的名字
  2. 安裝包的版本
  3. 安裝包的發行號

當使用一個包的名片來查詢包的信息時,必須有包名,你也能夠加上版本號和發行號。第一個限制是,包名片的三種信息的每個都必須徹底給出,若是要寫上版本號,就須把版本號寫全,若是要寫上發行號,就須把發行號寫全。若是隻給出了三種信息的其中一個或兩個,那麼RPM在找包的時候就會省略右邊的其它部分。第二個限制是,若是你指定了發行號,那麼必須也要指定版本號。讓咱們以幾個例子來講明:code

假設,你最近安裝了一個新版本的C庫,可是你不記得版本號了:orm

# rpm -q libc
libc-5.2.18-1

這樣的查詢方式中,rpm會從已安裝的軟件中找到匹配你給出的信息的軟件,並會把整個包名片都打印出來。在上面的例子中,假設系統也安裝有版本爲5.2.17的C庫,那它也會顯示出來。htm

下面的例子中,咱們將會把版本號也包括進去查詢:crontab

# rpm -q rpm-2.3
rpm-2.3-1

注意,RPM對包名是比較挑剔的,例如,下面這些查詢就查不到C庫:ip

# rpm -q LibC
package LibC is not installed

# rpm -q lib
package lib is not installed

# rpm -q "lib*"
package lib* is not installed

# rpm -q libc-5
package libc-5 is not installed

# rpm -q libc-5.2.1
package libc-5.2.1 is not installed

正如你能看到的,RPM對於包名是大小寫敏感的,而且不接受沒有寫全的包名、版本號和發行號。並且它也不能使用通配符。可是從上面咱們能夠看到,給出包名片的一部分信息依然是能找到該包的,rpm -q libc-5.2.18和rpm -q libc-5.2.18-1都能正確地找到包libc-5.2.18-1。

僅僅根據包名片來查詢,顯得有點寒酸。畢竟有的時候,你須要知道一個包的名字後才能去查詢它的信息。不過,還有其餘方式能夠指定特定的包...

-a:查詢全部已經安裝的包

使用-a選項能查詢到在你係統上安裝好的全部包:

# rpm -qa
ElectricFence-2.0.5-2
ImageMagick-3.7-2
…
tetex-xtexsh-0.3.3-8
lout-3.06-4

其實-a的輸出可能會有不少,所以上面省略了不少包。你可使用more或者grep重定向輸出。

-f <file>:查詢有哪些包擁有文件<file>

多少次你坐在你的電腦前看着一個程序,然而並不知道它是幹嗎用的。若是這個程序是使用RPM安裝的包所安裝的一部分程序,那麼很容易用RPM來獲得你想要的答案。只要使用-f選項。例如,你找到一個陌生的程序叫作/bin/ls(好吧,大多數人對ls不陌生),想要知道是哪一個包安裝了它嗎?很簡單:

# rpm -qf /bin/ls
fileutils-3.12-3

若是你指定的文件並非使用安裝包安裝的:

# rpm -qf .cshrc
file /home/ed/.cshrc is not owned by any package
小騙局

上述中,若是你獲得了"not owned by any package",其實並不表明文件不是一個安裝包安裝的:

# rpm -qf /usr/X11/bin/xterm
file /usr/X11/bin/xterm is not owned by any package

經過上面的消息,咱們很容易認爲xterm不是任何一個包所安裝的。
可是,讓咱們去它的目錄下看看:

# ls -lF /usr
…
lrwxrwxrwx   1 root     root            5 May 13 12:46 X11 -> X11R6/
drwxrwxr-x   7 root     root         1024 Mar 21 00:21 X11R6/
…

關鍵的地方就是這個X11 -> X11R6/,這是一個符號連接,但RPM不認帳,它只認X11,而無論X11R6。

怎麼辦,有兩種方法:

  1. 不要使用符號連接來查詢,這一般很難作到。不過能夠經過namei命令來追蹤連接的真實文件地址

    # namei /usr/X11/bin/xterm
       f: /usr/X11/bin/xterm
        d /
        d usr
        l X11 -> X11R6
          d X11R6
        d bin
        - xterm

很顯然,上面命令的輸出結果中很容易看出X11到X11R6的符號連接,因此你可使用真實的文件地址來獲取信息:

# rpm -qf /usr/X11R6/bin/xterm
    XFree86-3.1.2-5
  1. 直接切換到你所要查詢文件的目錄下,即便是個符號連接,也能帶你到真實的路徑下:

    cd /usr/X11/bin

    rpm -qf xterm

    XFree86-3.1.2-5

當你遇到"not owned by any package" 時, 若是你心生懷疑,那麼就試試上面兩種方法吧。

-p <file>:查詢一個特定的包

到目前爲止,每一個爲RPM查詢指定安裝包的方法都側重於那些已經被安裝好的包。-p選項就是用來查詢那些還沒安裝到你係統的中的包的。

若是你須要瞭解一個包中的信息,但這個包的名字已經被改變過了。雖然包的名字改變過了,可是包的內容尚未改變過。咱們查詢的信息來源主要是從包裏來。這時咱們能夠經過這個選項來找到這個包中到底包含了哪些內容:

# rpm -qp foo.bar
rpm-2.3-1

只須要一個命令,RPM就能給你想要的答案。

-p選項也能使用URL來指定包。

-p選項還能夠從標準輸入中查詢包的信息,例如:

# cat bother-3.5-1.i386.rpm | rpm -qp -    
bother-3.5-1

把cat的輸出管道定向到RPM,最後一個-告訴RPM從標準輸入中讀取。

-g <group>: 查詢屬於某個組<group>的包的信息

當包的建立者在建立包時,須要對包進行分類,以把功能類似的包分類到一塊兒。RPM可以經過分組來查詢包,例如,有一個分組名叫Base,這個分組的包都提供了比較底層的Linux功能,咱們能夠看看這個分組有哪些包組成:

# rpm -qg Base
setup-1.5-1
pamconfig-0.50-5
filesystem-1.2-1
crontabs-1.3-1
dev-2.3-1
etcskel-1.1-1
initscripts-2.73-1
mailcap-1.0-3
pam-0.50-17
passwd-0.50-2
redhat-release-4.0-1
rootfiles-1.3-1
termcap-9.12.6-5

不過要注意的是分組名是大小寫敏感的。rpm -qg base將不會查詢到任何信息。

--whatprovides <x>: 查詢具備<x>功能的包

RPM對包之間的依賴提供了不少支持,一個包可能依賴於另外一包所提供的功能。

--whatprovides選項就是用來作這種事的,選項後面跟上一個功能,RPM就會查詢到具備該功能的全部包,例如:

# rpm -q --whatprovides module-info
kernel-2.0.18-5

在這裏,只有kernel-2.0.18-5提供了module-info的功能。

--whatrequires <x>: 查詢出須要依賴於功能<x>的全部包

--whatrequires選項與上面的--whatprovides選項在邏輯上是對立的,用這個選項能找出須要依賴於特定功能的全部包,下面是一個例子:

# rpm -q --whatrequires module-info
kernelcfg-0.3-2

能夠看到惟一須要module-info功能的包是kernelcfg-0.3-2

信息查詢

指定好包後,你可能須要指出你須要查找這個包的哪方面的信息,正如咱們已經看到的,默認狀況下,使用rpm -q只會返回包名片,可是包的信息可不止這些哦。接下來咱們會查看全部咱們能查找到的信息:

-i 查找包的詳細信息

在rpm -q上加上-i選項將會給出包的詳細信息 :

# rpm -qi rpm
Name        : rpm                    Distribution: Red Hat Linux Vanderbilt
Version     : 2.3                          Vendor: Red Hat Software
Release     : 1                        Build Date: Tue Dec 24 09:07:59 1996
Install date: Thu Dec 26 23:01:51 1996 Build Host: porky.redhat.com
Group       : Utilities/System         Source RPM: rpm-2.3-1.src.rpm
Size        : 631157
Summary     : Red Hat Package Manager
Description :
RPM is a powerful package manager, which can be used to build, install,
query, verify, update, and uninstall individual software packages. A
package consists of an archive of files, and package information, including
name, version, and description.

上面各項信息的意義以下所示:

  • Name -- 包名
  • Version-- 包的版本
  • Release -- 發行號
  • Install date -- 安裝日期
  • Group -- 分組名
  • Size -- 包的大小,以byte爲單位
  • Summary -- 簡潔的描述
  • Description -- 詳細的描述
  • Distribution -- 所屬產品
  • Vendor -- 軟件的做者
  • Build Date -- 安裝包的構建時間
  • Build Host -- 構建時所在的系統類型
  • Source RPM -- 源碼包

-l:查找包所安裝的全部文件

經過加上-l選項能查找出安裝包安裝的全部文件:

# rpm -ql adduser
/usr/sbin/adduser

因爲adduser只安裝了一個文件,因此只有一個文件被列出來。

參考資料

Maximum RPM

掃一掃關注個人微信公衆號

相關文章
相關標籤/搜索