如何直接从 Oracle Linux RPM 程序包中提取文件而无需安装整个程序包

2011 年 7 月

作者:Lenz Grimmer

本文介绍如何直接查看 Oracle Linux RPM 程序包的内容并从中提取文件无需安装整个程序包。如果您不具备 root 系统权限,但又需要访问 RPM 程序包内部所含的某些文件,那么采用此方法会非常方便。

关于 RPM Package Manager

Linux 系统上的软件和应用程序通常组织成“程序包”的形式,程序包包含应用程序的所有相关部分(例如,二进制文件、配置文件和库)。Oracle Linux 使用 RPM(著名的 RPM 程序包管理器)来简化应用程序程序包的安装、升级和删除。另一方面,Debian Linux 及其衍生产品(如 Ubuntu Linux)使用名为 deb 的另一种打包格式。尽管这两种方式各有优缺点,并且都能完成任务,但本文我主要介绍 RPM。

“RPM”不仅指的是 .rpm 文件格式,而且还是一个命令行工具的名称。这个命令行工具通过将程序包版本以及程序包中所含文件等信息存储在一个本地 Oracle Berkeley DB 数据库中来跟踪这些信息。RPM 确保顾及程序包的要求和依赖关系以及程序包之间的冲突。它会留意配置文件,确保更新期间不会覆盖管理员所做的更改。此外,通过支持加密签名和文件校验和,RPM 还能够验证程序包的完整性和真实性。

有关 RPM 及其各种命令行选项和参数的详细说明,请参见 rpm(8) man 页,该页可以通过在命令行输入 man rpm 来阅读。

oracle-validated 程序包

RPM 程序包是存档文件,类似于 .zip.tar.gz 文件。.rpm 文件所使用的存档格式是 cpio,文件中附加了其他一些元数据。使用 rpm 命令行工具,无需安装程序包即可获取这些信息并查看程序包的内容。

在下面的示例中,我将使用 oracle-validated 程序包进行演示,不过您可以使用任何其他 RPM 程序包来执行同样的步骤。

oracle-validated 程序包对于在安装 Oracle Database 之前准备 Oracle Linux 系统非常有用,因为它一步就可以执行许多必需的准备工作。此程序包执行的任务包括:创建相应的用户帐户和组帐户,配置各种 Linux 内核参数,确保安装所有必需的库和应用程序等等。

oracle-validated 程序包包含在最新的 Oracle Linux 5 发布版本中,不过您也可以从 oss.oracle.com 单独下载该程序包,如清单 1 所示。

清单 1:下载 oracle-validated 程序包
$ wget http://oss.oracle.com/el5/oracle-validated/oracle-validated-1.1.0-7.el5.x86_64.rpm
--2011-07-27 10:18:27--  http://oss.oracle.com/el5/oracle-validated/oracle-validated-1.1.0-7.el5.x86_64.rpm
Resolving oss.oracle.com... 141.146.12.120
Connecting to oss.oracle.com|141.146.12.120|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 23838 (23K) [application/x-rpm]
Saving to: `oracle-validated-1.1.0-7.el5.x86_64.rpm'

100%[======================================>] 23,838      44.1K/s   in 0.5s

2011-07-27 10:18:28 (44.1 KB/s) - `oracle-validated-1.1.0-7.el5.x86_64.rpm' saved [23838/23838]

现在您已经拥有了该程序包的一个本地副本,名为 oracle-validated-1.1.0-7.el5.x86_64.rpm,就在您的当前目录下,如清单 2 所示。

清单 2:验证是否拥有程序包的本地副本
$ ls -lh oracle-validated-1.1.0-7.el5.x86_64.rpm
-rw-r--r-- 1 lenz lenz 24K Nov 17  2010 oracle-validated-1.1.0-7.el5.x86_64.rpm

首先我们来看看程序包的元数据。RPM 程序包包含相当多的有关其自身的有用信息,您不必安装程序包即可获得这些信息,如清单 3 所示。

清单 3:显示程序包的元数据
$  rpm -qip oracle-validated-1.1.0-7.el5.x86_64.rpm
warning: oracle-validated-1.1.0-7.el5.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 1e5e0159: NOKEY
Name        : oracle-validated             Relocations: (not relocatable)
Version     : 1.1.0                             Vendor: Oracle
Release     : 7.el5                         Build Date: Wed Nov 17 20:03:20 2010
Install Date: (not installed)               Build Host: ca-build9.us.oracle.com
Group       : Test Environment/Libraries    Source RPM: oracle-validated-1.1.0-7.el5.src.rpm
Size        : 61204                            License: GPL
Signature   : DSA/SHA1, Wed Nov 17 20:03:31 2010, Key ID 66ced3de1e5e0159
Summary     : Verifies and sets system parameters based on Oracle validated configuration recommendations for OEL5
Description :
This package verifies and sets system parameters based on Oracle validated
configuration recommendations for Oracle Enterprise Linux Release 5
Files affected: /etc/sysctl.conf, /etc/security/limits.conf, /etc/modprobe.conf, /boot/grub/menu.lst.
For changes to modules, this package installation will modify module parameters and re-insert.

还可以查看程序包中包含的文件,如清单 4 所示。

清单 4:列出程序包中所含文件
$ rpm -qlp oracle-validated-1.1.0-7.el5.x86_64.rpm
/etc/rc.d/init.d/oraclevalidated
/etc/sysconfig/oracle-validated/oracle-validated-verify
/etc/sysconfig/oracle-validated/oracle-validated.params
/usr/bin/oracle-validated-verify

查看程序包文件的三种方法

假设我们要仔细查看初始化脚本 /etc/rc.d/init.d/oraclevalidated。如何能在不必安装程序包的情况下做到这一点呢?因为安装会拖进来许多目前不需要的其他软件。实际上,有好几种方法可以实现这一目标。我来介绍三种可选方法。

要知道,RPM 利用 CPIO 进行实际的文件存档。因此,一种方法是直接使用 cpio 命令行工具提取文件。然而,我们首先需要从存档中剥离 RPM 元数据;否则,CPIO 会抱怨文件格式不对。

大多数发布版本都自带了一个名为 rpm2cpio 的工具,该工具可以从 RPM 程序包提取 cpio 存档。您可以将其输出重定向到一个本地文件,也可以通过管道直接将其输入 cpio 命令。

我们先将 RPM 程序包转换成 cpio 存档,并让 CPIO 来列出其内容,如清单 5 所示。

清单 5:将程序包转换成 cpio 存档
$  rpm2cpio oracle-validated-1.1.0-7.el5.x86_64.rpm | \
   cpio -i --list
./etc/rc.d/init.d/oraclevalidated
./etc/sysconfig/oracle-validated/oracle-validated-verify
./etc/sysconfig/oracle-validated/oracle-validated.params
./usr/bin/oracle-validated-verify
122 blocks

-i(或 --extract)选项可用于从存档中列出和提取文件。您可以提供文件名(包括通配符)来限制输出匹配某种文件名模式,如清单 6 所示。

清单 6:限制输出匹配文件名
$ rpm2cpio oracle-validated-1.1.0-7.el5.x86_64.rpm | \
  cpio --extract --list "*oraclevalidated"
./etc/rc.d/init.d/oraclevalidated
122 blocks

默认情况下,CPIO 不会创建目录。因为我们不能(也不想)将查看的文件提取到“真正的”/etc/rc.d/init.d 目录中,所以需要指示 cpio 在提取文件时创建子目录。因此,最好单独创建一个工作目录(例如,在 /tmp 中),如清单 7 所示,这样您就不会无意中弄乱主目录。

清单 7:将文件提取到临时目录
$ mkdir /tmp/rpm2cpio
$ cp oracle-validated-1.1.0-7.el5.x86_64.rpm /tmp/rpm2cpio
$ cd /tmp/rpm2cpio
$ rpm2cpio oracle-validated-1.1.0-7.el5.x86_64.rpm | \
  cpio --extract --make-directories --verbose "*oraclevalidated"
./etc/rc.d/init.d/oraclevalidated
122 blocks

我们的文件就在这里了。现在,您可以查看该文件的内容,如清单 8 所示。

清单 8:验证是否已提取到文件
$ [lenz@thebe rpm2cpio]% ls -lh etc/rc.d/init.d/oraclevalidated
-rwxr-xr-x 1 lenz lenz 1.3K Jul 27 10:45 etc/rc.d/init.d/oraclevalidated

除了使用命令行外,您还可以使用文件管理器或 GUI 工具。有许多基于 Linux 的实用程序可以直接读取和打开 RPM 程序包。例如 GNU Midnight Commander,它是经典 Norton Commander 实用程序的免费实现。您可以从命令行调用它,如果您高亮显示一个 RPM 程序包名称并按 Enter 键,它就会打开该程序包,如图 1 所示。

图 1:使用 GNU Midnight Commander 打开 RPM 程序包

图 1:使用 GNU Midnight Commander 打开 RPM 程序包

实际文件包含在 CONTENTS.cpio 文件中,如图 2 所示。


图 2:使用 GNU Midnight Commander 查看 RPM 程序包的内容

 

图 2:使用 GNU Midnight Commander 查看 RPM 程序包的内容

您可以像在任何其他文件系统中一样浏览存档的目录结构,如图 3 所示。


图 3:浏览存档的目录结构

 

图 3:浏览存档的目录结构

要打开一个文件,您可以高亮显示其文件名并按 Enter 键,如图 4 所示。


图 4:打开文件

 

图 4:打开文件

进入 /etc/rc.d/init.d/ 目录,按 F3 可在内置文本查看器中查看文件,如图 5 所示。


图 5:查看文件

 

图 5:查看文件

F10 功能键即可退出该查看器。

如果使用的是 GNOME 桌面,则只需使用 GNOME 存档管理器 File Roller 即可打开 RPM 程序包。您通过 GNOME 文件管理器 Nautilus 来调用 File Roller,具体方法是右键单击 RPM 文件图标并选择 Open With Archive Manager,如图 6 所示。


图 6:使用 File Roller 打开 RPM 程序包

 

图 6:使用 File Roller 打开 RPM 程序包

您还可以通过传递 RPM 程序包名作为参数从命令行启动存档管理器,如清单 9 所示。

清单 9:从命令行启动 File Roller
$ file-roller oracle-validated-1.1.0-7.el5.x86_64.rpm

现在您可以像对待任何其他存档一样浏览 RPM 程序包的内容。单击点目录可查看顶级目录结构,如图 7 所示。


图 7:查看顶级目录结构

 

图 7:查看顶级目录结构

现在可以浏览 /etc/rc.d/init.d 子目录找到 oraclevalidated 脚本。然后可以通过拖拉从存档中提取该脚本,也可以通过右键单击该文件并选择 Open 来直接查看该文件,如图 8 所示。


图 8:从 File Roller 查看文件

 

图 8:从 File Roller 查看文件

于是该脚本显示在 GNOME 文本编辑器(或与显示文本文件相关联的任何应用程序)中。

如您所见,可以通过许多方法来访问 RPM 程序包的内容和文件,无需安装程序包。

资源

以下是本文前面所引用的资源:

修订版 1,2011 年 7 月 29 日