Windows 到 Linux 之旅 第 9 部分. 安装软件-1
- UID
- 1066743
|
Windows 到 Linux 之旅 第 9 部分. 安装软件-1
安装 Linux 时首先注意到的事情之一,就是 Linux 发行版本中有如此多可用的包。大多数发行版本都附带了 Linux 操作系统、安装工具和管理工具。它们还包括Internet 工具、开发工具、办公工具、游戏,以及一些您不曾听说过的程序。Linux 发行版本附带 数千个可用包的情况并不鲜见。如果您没有选择“完整安装”,则只会安装这些包的一个子集。
现在您可能想知道“如何删除不想要的包?如何安装遗漏了的包?是否能够使用不是该发行版本附带的软件?”
RPM在安装 Linux 时,您或许会注意到关于正在安装的 RPM 的许多信息。 RPM 代表 Redhat Package Manager(Redhat包管理器),这是 Redhat 的贡献,现在已成为管理 Redhat 和 UnitedLinux 以及其他许多发行版本上的软件的标准。
RPM 本质上就是一个包,包含可以立即在特定机器体系结构上安装和运行的 Linux 软件。例如,在“ ”中,我们通过一个 RPM 安装了 Webmin 包。最初加载到发行版本中的所有软件都是通过一个 RPM来安装的。
RPM 剖析RPM 是文件包。它包括的 .spec 文件提供了关于包及其功能和依赖关系(即在该包能够运行之前必须安装其他哪些包)的信息。.spec 还包含包中的文件清单,指定这些文件必须加载到系统中的何处,以及它们的初始权限如何。RPM还包含安装前脚本,这是由包开发人员编写的。RPM 其次还包含已编译的二进制文件。最后,RPM 包含了安装后脚本。
RPM 结构
.spec安装前脚本二进制文件二进制文件...二进制文件安装后脚本在安装 RPM 时,系统首先检查该包的依赖关系是否得到满足。如果不满足, 安装过程就会终止,除非您指定了迫使安装无论如何都要继续的选项。
如果一切顺利,安装前脚本就会运行。这个脚本可以做任何事情。它通常创建用户和目录。然而,它可以做许多类型的动态配置,甚至以自定义的方式编译运行系统的源代码。
了解 RPM 来自何处RPM 在安装时将文件复制到您的系统上,并执行脚本。由于 RPM 是以 root 身份运行的,因此所有这些功能都以 root身份执行。因而在将某个 RPM 安装到系统之前,知道它的由来是很重要的。就像许多 Windows 软件一样,恶意的代码可以像包含在其他包中一样容易地包含在RPM 中。来自厂商的 RPM 一般都是安全的,但是要对从未知来源随机下载和安装的内容保持警惕。
如果安装前脚本成功完成,二进制文件将依照清单被复制到系统上。在复制完所有的文件和设置了它们的权限之后,安装后脚本就会运行。同样,这个脚本几乎能够做任何事情。
一旦完成所有这些步骤,关于包的信息就被添加到 RPM 数据库,安装过程就完成了。使用这种简单的机制,您能够执行通过更完善的商业安装程序所能执行的所有功能。
RPM 数据库RPM 的优雅之处是 RPM 数据库。这个数据库通常位于 /var/lib/rpm 目录,它包含关于系统上已安装的每个 RPM 的信息。这个数据库知道包之间的依赖关系,当删除某个包将导致其他包无法工作时,它将发出警告。这个数据库知道最初随某个包安装的每个文件以及这些文件在系统上的最初状态。它还知道每个包的文档和配置文件的位置。这听起来好像是大量的信息,事实上确实如此。但它并不是过多而庞大的。在一个包含1,066 个包、由 203,272 个文件组成的系统上,数据库文件仅有 45 MB!在加载和卸载包时,RPM 使用这个数据库来检查依赖关系。用户还可以在这个数据库中查询关于包的信息。
使用 RPM配合 RPM 包使用的程序被相应地命名为 rpm 。 rpm 以多种不同的模式运行,不过最常见的任务是安装、升级、查询、验证和删除。
rpm -i (装)在第一次安装某个包时,您要使用 -i 或安装模式。只需将 rpm 指向某个二进制包并执行它, rpm 就会把该包安装到您的系统上。安装过程一般只需几秒钟。我经常会在安装包时使用 -v (详细)开关来提供关于该过程的更多信息,以及使用 -h (哈希线)开关来通过输出在控制台上的哈希(#)符号提供安装进度更新。下面是安装某个包的例子:
清单 1. 安装 MyPackage$ rpm -ivh MyPackage-1.0.0.i386.rpmPreparing... ########################################### [100%] 1:MyPackage ########################################### [100%]就是这个样子!MyPackage 现在已经安装完成,可供使用了。
rpm 必须以 root 身份运行 必须以 root 身份执行 rpm 安装和删除,因为需要访问文件系统和 rpm 数据库。
rpm -e (删除)要删除已安装的包,可使用 -e 开关。 rpm 将使用数据库来删除该包的所有文件。如果有已安装的其他包依赖正在删除的包, rpm 将会异常退出。您必须使用 nodeps 开关来执行强制删除( nodeps 还可以用于强制安装)。在使用这个开关来强制安装或删除时,务必 非常小心。删除其他包所依赖的包,可能会导致灾难性的结果。下面这个命令删除我们在上面安装的包:
$ rpm -e MyPackage 注意,包的删除并不一定需要它的完整名称(包括版本号)。安装时需要完整名称,因为我们是在引用一个文件名称。已安装的包仅通过它们的名称来引用。包的名称是版本号之前的所有内容。
rpm -V(验证)验证开关非常有用。它将包文件的当前状态与它们在安装时的原始状态作比较。两种状态之间的区别将用一个代码来显示:
文件验证结果S文件大小不一致M模式不一致(包括权限和文件类型)5MD5 校验和不一致D设备主要/次要编号不匹配LreadLink(2) 路径不匹配U用户拥有关系不一致G群组拥有关系不一致TmTime 不一致 如果您对某个包运行 rpm -V ,并且发现某个可执行文件的大小发生了变化,那可能就是安全漏洞的征兆。
rpm -U(升级)一旦某个包已经安装,尝试安装具有相同名称的包将产生一条消息,指出该包已经安装。 如果想要将某个包升级到更新的版本,可使用 -U 开关来升级。升级还具有另一个影响。当对多个包名称运行升级时,它将设法按依赖关系的顺序放置包。换句话说,必需的包将首先安装。不管某个包是否已经安装,都可以对它使用升级开关,许多人使用它而不是使用 -i 开关来执行安装和升级。下面是使用升级开关来加载多个 rpm 包的例子:
清单 2. 交互式升级$ rpm -Uvh My*.rpmPreparing... ########################################### [100%] 1:bMyPackageDep ########################################### [ 50%] 1:aMyPackageNew ########################################### [100%]在上面的例子中,bMyPackageDep 是 aMyPackageNew 的前提条件,因此尽管文件名称以相反的顺序排列, rpm 也会对它们正确排序。
rpm -q(查询)可以从 rpm 数据库中查询多种有用的信息。对 rpm 数据库拥有读访问权限的任何用户都能够运行查询。默认情况下,全部用户都拥有读访问权限。要运行一个查询,可使用 -q 开关带上要查询的包的名称。这样将返回该包的版本。
$ rpm -q MyPackage
MyPackage-1.0.0 包的名称必须精确匹配,不允许使用通配符。然而,如果记不住包的完整名称,您可以使用 grep 工具来帮助找到它。可以使用 -qa 开关来查询所有已安装的包,并用 grep 来管道输出您能记住的信息。例如:
grep 之乐grep 是一个具有广泛用途的文本搜索工具。默认情况下, grep 将搜索文件以显示您指定的行。在这里的例子中,它搜索单词“IBM”。 grep 是脚本编写和控制台工作方面的一个强大工具。
$ rpm -qa | grep IBM
IBMWSAppDev-Product-5.0-0
IBMWSSiteDevExp-Core-5.0-0
IBMWSSiteDev-Core-5.0-0
IBMWSTools-WAS-BASE-V5-5.0-0
IBMJava118-SDK-1.1.8-5.0
IBMWSWB-samples-5.0-0
IBMWSWB-5.0-0
IBMWSAppDev-Core-5.0-0
IBMWSAppDev-5.0-0
IBMWSTools-5.0-0 除了版本号外, rpm -q 还可以提供关于包的其他有用信息。下面就是这样一些例子:
使用 rpm 查询获取信息rpm -q changelog显示包的开发变更历史记录rpm -qc显示包的配置文件rpm -qd显示包的文档文件rpm -qi显示包描述rpm -ql显示包的文件的列表rpm -qR显示包的依赖关系还有另一个有趣的查询命令,它针对文件而不是针对包运行。
rpm -q whatprovides <filename> 上面这个命令将识别与给定的 filename(文件名)相关联的包。filename 必须包括文件的绝对路径,因为信息就是以这种方式存储在rpm 数据库中的。 |
|
|
|
|
|