Fedora软件安装初探
【原文地址】
http://www.ibm.com/developerworks/cn/linux/l-roadmap/part9/index.html
【正文】
1.RPM剖析
RPM 代表 Redhat Package Manager(Redhat 包管理器),它包括的.spec 文件提供了关于包及其功能和依赖关系(即在该包能够运行之前必须安装其他哪些包)的信息。.spec 还包含包中的文件清单,指定这些文件必须加载到系统中的何处,以及它们的初始权限如何。RPM 还包含安装前脚本,这是由包开发人员编写的。RPM 其次还包含已编译的二进制文件。最后,RPM 包含了安装后脚本。
2.RPM结构
在安装 RPM 时,系统首先检查该包的依赖关系是否得到满足。如果不满足, 安装过程就会终止,除非您指定了迫使安装无论如何都要继续的选项。
如果一切顺利,安装前脚本就会运行。这个脚本可以做任何事情。它通常创建用户和目录。然而,它可以做许多类型的动态配置,甚至以自定义的方式编译运行系统的源代码。
一旦完成所有这些步骤,关于包的信息就被添加到 RPM 数据库,安装过程就完成了。使用这种简单的机制,您能够执行通过更完善的商业安装程序所能执行的所有功能。
3.RPM 数据库
RPM 数据库通常位于 /var/lib/rpm 目录,它包含关于系统上已安装的每个 RPM 的信息。这个数据库知道包之间的依赖关系,当删除某个包将导致其他包无法工作时,它将发出警告。这个数据库知道最初随某个包安装的每个文件以及这些文件在系统上的最初状态。它还知道每个包的文档和配置文件的位置。在加载和卸载包时,RPM 使用这个数据库来检查依赖关系。用户还可以在这个数据库中查询关于包的信息。
4.使用 RPM
rpm
以多种不同的模式运行,最常见的任务是安装、升级、查询、验证和删除。
1) rpm -i(装)
在第一次安装某个包时,您要使用 -i 或安装模式。只需将 rpm 指向某个二进制包并执行它, rpm 就会把该包安装到您的系统上。在安装包时可以使用 -v (详细)开关来提供关于该过程的更多信息,以及使用 -h (哈希线)开关来通过输出在控制台上的哈希(#)符号提供安装进度更新。
2) rpm -e (删除)
要删除已安装的包,可使用 -e 开关。 rpm 将使用数据库来删除该包的所有文件。如果有已安装的其他包依赖正在删除的包, rpm 将会异常退出。您必须使用 nodeps 开关来执行强制删除( nodeps 还可以用于强制安装)。在使用这个开关来强制安装或删除时,务必 非常 小心。删除其他包所依赖的包,可能会导致灾难性的结果。
下面这个命令删除已经安装的某个包:
1 $ rpm -e MyPackage
3) rpm -V(验证)
验证开关非常有用。它将包文件的当前状态与它们在安装时的原始状态作比较。两种状态之间的区别将用一个代码来显示:
S
|
文件大小不一致 |
M
|
模式不一致(包括权限和文件类型) |
5
|
MD5 校验和不一致 |
D
|
设备主要/次要编号不匹配 |
L
|
readLink(2) 路径不匹配 |
U
|
用户拥有关系不一致 |
G
|
群组拥有关系不一致 |
T
|
mTime 不一致 |
如果您对某个包运行
rpm -V
,并且发现某个可执行文件的大小发生了变化,那可能就是安全漏洞的征兆。
5) rpm -q(查询)
包的名称必须精确匹配,不允许使用通配符。然而,如果记不住包的完整名称,您可以使用
grep
工具来帮助找到它。可以使用
-qa
开关来查询所有已安装的包,并用
grep
来管道输出您能记住的信息。例如:
1 $ rpm -qa | grep IBM
2 IBMWSAppDev-Product-5.0-0
3 IBMWSSiteDevExp-Core-5.0-0
4 IBMWSSiteDev-Core-5.0-0
5 IBMWSTools-WAS-BASE-V5-5.0-0
6 IBMJava118-SDK-1.1.8-5.0
7 IBMWSWB-samples-5.0-0
8 IBMWSWB-5.0-0
9 IBMWSAppDev-Core-5.0-0
10 IBMWSAppDev-5.0-0
11 IBMWSTools-5.0-0
rpm -q
还可以提供关于包的其他有用信息。例如:
rpm -q changelog
|
显示包的开发变更历史记录 |
rpm -qc
|
显示包的配置文件 |
rpm -qd
|
显示包的文档文件 |
rpm -qi
|
显示包描述 |
rpm -ql
|
显示包的文件的列表 |
rpm -qR
|
显示包的依赖关系 |
还有另一个有趣的查询命令,它针对文件而不是针对包运行。
rpm -q whatprovides <filename>
上面这个命令将识别与给定的 filename(文件名)相关联的包。filename 必须包括文件的绝对路径,因为信息就是以这种方式存储在 rpm 数据库中的。