第十二章 软件包管理

12.1 使用 RPM 来管理软件包
12.2 软件包管理工具
12.3 Red Hat 网络系统管理
  12.1 使用 RPM 来管理软件包

12.1.1 RPM 的设计目标。

RPM 的设计目标是: 可升级性,强大的查询功能,系统校验,纯净源码

可升级性
基于 RPM 的操作系统的新版本(如 Red Hat Linux),不必重新安装你的系统。RPM 允许智能化、自动化地就地升级系统。软件包中的配置文件在升级中被保留,因此不会丢失定制的设置。
强大的查询功能
在整个数据库中搜索软件包或某些特定文件,以及文件所属的RPM包等。RPM 软件包的文件包括在被压缩的文件中,其中有定制的二进制文件头,该文件头内包含关于软件包及其内容的信息,允许你快速简捷地查询某个软件包。
系统校验
若担心可能删除了某软件包上的一个重要文件,只需校验该软件包即可查明。可以在必要时重装该软件包。配置文件在重装中会被保留。
纯净源码
与软件的原创者所发行源码一致的“纯净”软件源码。使用 RPM,你会有纯净源码、使用过的补丁、以及完整的建构指令。如果程序的新版本被推出,你不必从头开始编译。你可以看一看补丁来判定你可能需要做什么。使用这种技术,所有内编译的默认值,以及为正确建构软件而进行的任何改变都一目了然。

12.1.2 使用RPM

RPM有五种基本操作模式:安装(-i)、删除(-e)、升级(-U)、查询(-q)和校验(-V)。想了解完整选项和细节,使用 rpm --help 命令。

  • 安装:典型RPM软件包名称类似foo-1.0-1.i386.rpm。该文件名包括软件包名称(foo)、版本(1.0)、发行版本(1)、以及体系(i386)。登录为根用户,在 shell 提示下键入下面的命令来安装软件包:
     rpm -Uvh foo-1.0-1.i386.rpm 

    如果安装成功,你会看到如下所示的输出:

    Preparing...                ########################################### [100%]
       1:foo                    ########################################### [100%] 

    如上面所示,RPM 显示软件包的名称,然后在软件包被安装时在屏幕上打印井号来显示安装进度。

    从 RPM 版本 4.1 开始,在安装或升级软件包时会检查软件包的签名。如果签名校验失败,你就会看到如下所示的错误消息:

    error: V3 DSA signature: BAD, key ID 0352860f 

    如果它是新的、只针对文件头的签名,你会看到如下所示的错误消息:

    error: Header V3 DSA signature: BAD, key ID 0352860f 

    如果你没有安装合适的钥匙来校验签名,消息中就会包含 NOKEY ,如:

    warning: V3 DSA signature: NOKEY, key ID 0352860f 

    如果某软件包的同一版本已经安装,你就会看到:

    Preparing...                ########################################### [100%]
    package foo-1.0-1 is already installed 

    如果你在软件包已安装的情况下仍打算安装同一版本的软件包,你可以使用 --replacepkgs 选项,它告诉 RPM 来忽略这个错误:

     rpm -ivh --replacepkgs foo-1.0-1.i386.rpm 

    如果从 RPM 安装的文件被删除了,或者你想安装 RPM 中的最初配置文件,该选项就会很有用。

    如果你试图安装的软件包中包含已被另一个软件包或同一软件包的早期版本安装了的文件,你会看到:

    Preparing...                ########################################### [100%]
    file /usr/bin/foo from install of foo-1.0-1 conflicts with file from package bar-2.0.20 

    要使 RPM 忽略这个错误,使用 --replacefiles 选项:

     rpm -ivh --replacefiles foo-1.0-1.i386.rpm 
    RPM 软件包可能“依赖”于其它软件包,这意味着它们需要安装其它软件包才能正确运行。如果你试图安装具有未解决依赖关系的软件包,你会看到:
    Preparing...                ########################################### [100%]
    error: Failed dependencies:
            bar.so.2 is needed by foo-1.0-1
        Suggested resolutions:
            bar-2.0.20-3.i386.rpm 

    如果你安装的是 Red Hat,它通常会向你建议解决依赖关系所需的软件包。在 Red Hat Linux 光盘或 Red Hat FTP 站点(或镜像)上找到这个软件包,使用以下命令来添加:

     rpm -ivh foo-1.0-1.i386.rpm bar-2.0.20-3.i386.rpm 

    如果这两个软件包都安装成功,你会看到:

    Preparing...                ########################################### [100%]
       1:foo                    ########################################### [ 50%]
       2:bar                    ########################################### [100%] 

    如果它不向你建议解决依赖关系所需的软件包,你可以试用 --redhatprovides 选项来判定哪个软件包包含所需的文件。你需要安装 rpmdb-redhat 软件包才能使用这个选项。

    rpm -q --redhatprovides bar.so.2 

    如果包含 bar.so.2 的软件包在来自 rpmdb-redhat 软件包的安装了的数据库中,该软件包的名称就会被显示:

    bar-2.0.20-3.i386.rpm 

    如果你想强制安装(不是好办法,因为软件包可能不能够正确运行),使用 --nodeps 选项。

  • 删除:在 shell 提示下键入下面的命令来删除RPM软件包。

     rpm -e foo 
  • 你在删除安装某软件包时也会遇到依赖关系错误,当另一个已安装的软件包依赖于你试图删除的软件包时,依赖关系错误就会发生。例如:

    Preparing...                ########################################### [100%]
    error: removing these packages would break dependencies:
            foo is needed by  bar-2.0.20-3.i386.rpm 

    要使 RPM 忽略这个错误,并强制删除该软件包(不是个好办法,因为依赖于它的软件包可能无法正常运行),使用 --nodeps 选项。

     
  • 升级:在 shell 提示下键入以下命令:
    rpm -Uvh foo-2.0-1.i386.rpm 

    你在上面的例子里看不到的是,RPM 自动删除 foo 软件包的任何老版本。事实上,你可能想一直使用 -U 来安装软件包,因为即便没有安装软件包的任何先前版本,它也可以用来安装该软件包。

    因为 RPM 对软件包和配置文件执行智能升级,你可能会看到和下面相似的消息:

    saving /etc/foo.conf as /etc/foo.conf.rpmsave 

    这条消息意味着你对配置文件所作的改变可能不会和软件包中的新配置文件“前向兼容”,因此,RPM 保存了你的原始文件,并安装了一个新文件。你应该调查一下这两个配置文件的区别,然后尽快地解决这些区别来确保系统继续正确运行。

    升级实际上是删除和安装的组合,因此,在 RPM 升级中,你除了遇到删除和安装中会遇到的错误外,还会看到另一个错误。如果 RPM 认为你试图升级到软件包的老版本,你会看到:

    package foo-2.0-1 (which is newer than foo-1.0-1) is already installed 

    要使 RPM 强制“升级”,使用 --oldpackage 选项:

     rpm -Uvh --oldpackage foo-1.0-1.i386.rpm 
  • 查询:

    与其指定软件包名称,你可以和 -q 一起使用下列选项来指定你要查询的软件包。它们叫做软件包指定选项。

    • -a 查询所有已安装的软件包。
    • -f <file> 会查询拥有 <file> 的软件包。当指定文件时,你必须指定文件的完整路径(如 /usr/bin/ls )。
    • -p <packagefile> 查询软件包 <packagefile>

    指定被查询的软件包要显示哪些信息的方法多种多样。以下选项用来选择你要搜索的信息类型。它们叫做信息选择选项。

    • -i 显示软件包信息,包括名称、描述、发行版本、大小、制造日期、生产商,以及其它杂项。
    • -l 显示软件包所含的文件列表。
    • -s 显示软件包中所有文件的状态。
    • -d 显示被标记为文档(man 页、info 页、README 等等)的文件列表。
    • -c 显示被标记为配置文件的文件列表。你在安装后改变这些文件来使软件包适用于你的系统(譬如, sendmail.cf 、 passwd 、 inittab 等等)。

    对于用来显示文件列表的选项,你可以在命令后添加 -v 来用你熟悉的 ls -l 格式来显示文件列表。

  • 检验:
    它校验每个文件的大小、MD5 值、权限、类型、所有者、以及组群。 rpm -V 命令校验软件包。你可以查询任何软件包选择选项列举的条目来指定要校验的软件包。校验的最简单用法是 rpm -V foo ,它校验所有在 foo 软件包内的文件是否和最初安装时一样。例如:
    • 要校验包含某一特定文件的软件包:
       rpm -Vf /bin/vi 
    • 要校验所有安装了的软件包:
       rpm -Va 
    • 要根据 RPM 软件包文件来校验安装了的软件包:
       rpm -Vp foo-1.0-1.i386.rpm 

      如果你怀疑 RPM 数据库已被损坏,该命令就会很有用。

    如果一切都被校验正确,就不会有输出。如果出现矛盾,它们就会被显示。输出的格式为包括八个字符的字符串(c 代表配置文件),然后是文件名称。这八个字符的每个字符都代表一种文件属性的比较结果,所比较的是文件的属性和 RPM 数据库中记录的属性。单用一个 .(点)意味着测试通过。下列字符代表某类测试失败:

    • 5 — MD5 校验和
    • S — 文件大小
    • L — 符号链接
    • T — 文件修改时间
    • D — 设备
    • U — 用户
    • G — 组群
    • M — 模式(包括权限和文件类型)
    • ? — 不可读文件

    如果你看到任何输出,最好开动脑筋来判断是应该删除还是重新安装该软件包,或用另一种方法来解决这个问题。

12.1.3 检查软件包的签名

如果你想校验某软件包是否被损坏或篡改过,只需检查 md5sum。在 shell 提示下键入下面的命令(把 <rpm-file>  换成 RPM 软件包的文件名):

 rpm -K --nogpg <rpm-file>  

你会看到消息“<rpm-file> : md5 OK ”。这条消息意味着文件在下载中没有被损坏。要看到更详细的消息,把命令中的 -K 换成 -Kvv 。

另一方面,创建软件包的开发者是不是值得信任?如果该软件包使用开发者的 GnuPG 钥匙(key)签名(signed),你就会知道这位开发者的身份确实如他们所言。

RPM 软件包可以使用 Gnu 隐私卫士(或称 GnuPG)来签名,从而帮助你肯定下载软件包的可信任性。

GnuPG 是安全通讯工具;它是 PGP(一种电子隐私程序)加密技术的完全和免费的替换品。使用 GnuPG,你可以验证文档的有效性,在其它通讯者之间加密或解密数据。GnuPG 还具有解密和校验 PGP 5.x 文件的能力。

在 Red Hat Linux 的安装过程中,GnuPG 被默认安装。这样,你便可以立即开始使用 GnuPG 来校验你从 Red Hat 收到的软件包。首先,你需要导入 Red Hat 的公钥。

  • 导入钥匙

要校验 Red Hat 软件包,你必须导入 Red Hat GPG 公钥。要导入公钥,在 shell 提示下执行以下命令:

 rpm --import /usr/share/rhn/RPM-GPG-KEY 

要显示用来校验 RPM 而安装的钥匙列表,执行以下命令:

 rpm -qa gpg-pubkey* 

对于 Red Hat 公钥而言,其输出应包括:

gpg-pubkey-db42a60e-37ea5438 

要显示关于某一指定钥匙的细节,使用 rpm -qi ,其后跟随前一命令的输出:

 rpm -qi gpg-pubkey-db42a60e-37ea5438 
  • 校验软件包的签名

导入了建构者的 GnuPG 公钥后,要检查 RPM 文件的 GnuPG 签名,使用以下命令(把 <rpm-file> 换成 RPM 软件包的名称):

 rpm -K <rpm-file>  

如果一切顺利,你会看到这条消息:md5 gpg OK 。这意味着软件包的签名已被校验,该软件包没有被损坏。

12.1.4 RPM示范

RPM 对于管理系统、诊断和修正问题都极有用途。要理解它的选项的最佳途径是通过示范。

  • 可能你不小心删除了一些文件,却不能肯定删除了哪些文件。如果你想校验整个系统来看一看缺少哪些文件,你可以试一试下面的命令:
     rpm -Va 

    如果缺少某些文件或它们似乎被损坏,你可能应该重新安装该软件包或删除安装然后再重新安装该软件包。

  • 有时候,你可能会看到不认识的文件。要发现哪个软件包拥有它,你可以输入:
     rpm -qf /usr/X11R6/bin/ghostview 

    它的输出和以下相似:

    gv-3.5.8-22 
  • 我们可以在以下的假想情况下组合以上的两个例子。假设你的 /usr/bin/paste 出了问题,你想校验拥有该程序的软件包,但是你不知道哪个软件包拥有 paste 。你只需输入以下命令就可以了:
     rpm -Vf /usr/bin/paste 

    这样,适当的软件包就会被校验。

  • 你想知道关于某一特定的程序的详细信息吗?你可以试用下面的命令来查找拥有该程序的软件包所附带的文档:
     rpm -qdf /usr/bin/free 

    它的输出和以下相似:

    /usr/share/doc/procps-2.0.11/BUGS
    /usr/share/doc/procps-2.0.11/NEWS
    /usr/share/doc/procps-2.0.11/TODO
    /usr/share/man/man1/free.1.gz
    /usr/share/man/man1/oldps.1.gz
    /usr/share/man/man1/pgrep.1.gz
    /usr/share/man/man1/pkill.1.gz
    /usr/share/man/man1/ps.1.gz
    /usr/share/man/man1/skill.1.gz
    /usr/share/man/man1/snice.1.gz
    /usr/share/man/man1/tload.1.gz
    /usr/share/man/man1/top.1.gz
    /usr/share/man/man1/uptime.1.gz
    /usr/share/man/man1/w.1.gz
    /usr/share/man/man1/watch.1.gz
    /usr/share/man/man5/sysctl.conf.5.gz
    /usr/share/man/man8/sysctl.8.gz
    /usr/share/man/man8/vmstat.8.gz 
  • 你可能会发现一个新的 RPM,但是你不知道它的用途。要寻找关于它的信息,使用下面的命令:
     rpm -qip crontabs-1.10-5.noarch.rpm 

    它的输出看起来和以下相似:

    Name        : crontabs                     Relocations: (not relocateable)
    Version     : 1.10                              Vendor: Red Hat, Inc.
    Release     : 5                             Build Date: Fri 07 Feb 2003 04:07:32 PM EST
    Install date: (not installed)               Build Host: porky.devel.redhat.com
    Group       : System Environment/Base       Source RPM: crontabs-1.10-5.src.rpm
    Size        : 1004                             License: Public Domain
    Signature   : DSA/SHA1, Tue 11 Feb 2003 01:46:46 PM EST, Key ID fd372689897da07a
    Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
    Summary     : Root crontab files used to schedule the execution of programs.
    Description :
    The crontabs package contains root crontab files. Crontab is the
    program used to install, uninstall, or list the tables used to drive the
    cron daemon. The cron daemon checks the crontab files to see when
    particular commands are scheduled to be executed. If commands are
    scheduled, then it executes them. 
  • 也许你想指定 crontabs RPM 会安装哪些文件。你可以输入下面的命令:
     rpm -qlp crontabs-1.10-5.noarch.rpm 

    它的输出看起来和下面相似:

    Name        : crontabs                     Relocations: (not relocateable)
    Version     : 1.10                              Vendor: Red Hat, Inc.
    Release     : 5                             Build Date: Fri 07 Feb 2003 04:07:32 PM EST
    Install date: (not installed)               Build Host: porky.devel.redhat.com
    Group       : System Environment/Base       Source RPM: crontabs-1.10-5.src.rpm
    Size        : 1004                             License: Public Domain
    Signature   : DSA/SHA1, Tue 11 Feb 2003 01:46:46 PM EST, Key ID fd372689897da07a
    Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
    Summary     : Root crontab files used to schedule the execution of programs.
    Description :
    The crontabs package contains root crontab files. Crontab is the
    program used to install, uninstall, or list the tables used to drive the
    cron daemon. The cron daemon checks the crontab files to see when
    particular commands are scheduled to be executed. If commands are
    scheduled, then it executes them. 

 TOP

 
  12.2 软件包管理工具

在安装中,用户选择「工作站」「服务器」之类的安装类型。软件包就是根据这个选择来安装的。因为用户使用计算机的方法、目的不同,可能在安装后想再安装或删除某些软件包。软件包管理工具 允许用户执行这类操作。

运行 软件包管理工具 需要 X 窗口系统。要启动这个程序,点击面板上的「主菜单」 => 「系统设置」 => 「添加/删除应用程序」,或在 shell 提示下键入 redhat-config-packages 命令。

如果你在计算机中插入了 Red Hat Linux 光盘 #1,你会看到相同的界面。

该程序的界面和安装中使用的相似。软件包被分成软件包组,每一组包含一列标准软件包(standard packages)和一列分享公用功能的额外软件包(extra packages)。例如,「图形化互联网」组包含万维网浏览器、电子邮件客户、以及其它用来连接到互联网的程序。 你不能删除标准软件包,除非整个软件包组都要被删除。只要软件包组被选,其中的额外软件包是你能够选择要安装或删除的可选软件包。

主菜单显示了软件包组的列表。如果软件包组旁边的复选箱内有一个选择符号,这说明该组当前已被安装。要查看其中的单个软件包列表,点击它旁边的「细节」按钮。带有选择符号的单个软件包当前已被安装。

要删除某个软件包组内的所有软件包,取消选择它旁边的复选箱。要删除单个软件包组,点击该软件包组旁边的「细节」按钮,然后取消选择单个软件包。

当你选定了要删除的软件包后,点击主窗口中的「更新」按钮。该程序会计算它会滕出的空闲空间以及软件包依赖关系。如果其它软件包依赖于你选择要删除的软件包,它们会被自动加入到要被删除的软件包列表中。点击「显示细节」按钮来查看要删除的软件包列表。

TOP

 
  12.3 Red Hat 网络

Red Hat 网络是用来管理 Red Hat Linux 系统的互联网解决方案。所有的安全警告、错误修正警告、以及增进警告(通称勘误警告)可从 Red Hat 上直接下载,你可以使用 Red Hat 更新代理 这个独立程序,也可以通过 RHN 万维网界面来下载:http://rhn.redhat.com/.

Red Hat 网络为用户节省时间,因为在更新软件包一发行用户就会收到电子邮件通知。用户不必在万维网上苦寻更新的软件包或安全警告。按照默认设置,Red Hat 网络还安装这些软件包。用户不需要学习如何使用 RPM,也不必为解决软件包依赖关系而搅尽脑汁;RHN 全盘包办。

每个 Red Hat 网络 帐号都带有:

  • 勘误警告 — 通过“基本 ”界面获悉用于你的网络中所有系统的安全警告、错误修正警告和增进警告在何时会被发出。
  • 自动电子邮件通知 — 向你的系统发出勘误警告时自动收到电子邮件通知
  • 调度的勘误更新 — 调度勘误更新的投递
  • 安装软件包 — 点击一个按钮就可以在一个或多个系统上调度软件包的安装。
  • Red Hat 更新代理 — 使用 Red Hat 更新代理 来为你的系统下载最新的软件包(还可以安装软件包)
  • Red Hat 网络 网站 — 通过任何计算机上的安全万维网浏览器来管理多个系统、下载单个软件包,以及调度勘误更新之类的任务

TOP