IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用RPM获取包的信息

    beanlam发表于 2015-08-04 20:26:28
    love 0

    rpm -q 做了什么

    如果你想要在你的系统上安装、卸载或升级软件,但却不知道在你的系统中已经有哪些软件了,这是不是一件很蛋疼的事?你可能会陷入下面这些场景中:

    • 你在你的系统中遇到一个文件,你不认识它,它也不认识你,它到底是哪里来的,是哪个软件安装的。

    • 你的朋友发送一个软件安装包给你,但是你不知道这个软件是干什么的,它将会安装什么功能,它从哪里来。

    • 你记得你安装了一个软件,但是却忘了这个软件的版本,并且找不到关于这个软件的文档。

    这些场景不胜枚举,但是你可以用rpm -q帮助你。

    RPM查询

    当你了解了如何查询软件的信息后,很容易你就能敲出一个查询命令来查询你想要知道的信息。-q是一个最基本的选项,查询可分为对包的查询以及对特定信息的查询,下面看看针对包的查询:

    包查询

    首先你要知道你要查询的是哪一个或那些包。

    包名片

    包名片是标识一个包的唯一字符串,每个名片包含了三种信息:

    1. 安装包的名字
    2. 安装包的版本
    3. 安装包的发行号

    当使用一个包的名片来查询包的信息时,必须有包名,你也可以加上版本号和发行号。第一个限制是,包名片的三种信息的每一个都必须完全给出,如果要写上版本号,就须把版本号写全,如果要写上发行号,就须把发行号写全。如果只给出了三种信息的其中一个或两个,那么RPM在找包的时候就会省略右边的其它部分。第二个限制是,如果你指定了发行号,那么必须也要指定版本号。让我们以几个例子来说明:

    假设,你最近安装了一个新版本的C库,但是你不记得版本号了:

    # rpm -q libc
    libc-5.2.18-1
    

    这样的查询方式中,rpm会从已安装的软件中找到匹配你给出的信息的软件,并会把整个包名片都打印出来。在上面的例子中,假设系统也安装有版本为5.2.17的C库,那它也会显示出来。

    下面的例子中,我们将会把版本号也包括进去查询:

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

    注意,RPM对包名是比较挑剔的,例如,下面这些查询就查不到C库:

    # 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 :查询有哪些包拥有文件

    多少次你坐在你的电脑前看着一个程序,然而并不知道它是干嘛用的。如果这个程序是使用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 :查询一个特定的包

    到目前为止,每个为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 : 查询属于某个组的包的信息

    当包的创建者在创建包时,需要对包进行分类,以把功能相似的包分类到一起。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 : 查询具有功能的包

    RPM对包之间的依赖提供了很多支持,一个包可能依赖于另一包所提供的功能。

    --whatprovides选项就是用来做这种事的,选项后面跟上一个功能,RPM就会查询到具有该功能的所有包,例如:

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

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

    --whatrequires : 查询出需要依赖于功能的所有包

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



沪ICP备19023445号-2号
友情链接