如何在CentOS上进行软件包管理
RPM包
在CentOS的软件包是RPM格式。
RPM是英文Redhat Package Manager的缩写(Redhat包管理器),它已经成为Redhat和许多其他发行版上管理软件的标准。
RPM是一个包含很多文件的包。
- 首先它包括了一个
.spec
的文件,这个文件提供了关于包的信息,包的功能以及依赖包。同时还包含了一个文件清单,用于指定文件的安装位置及权限。 - PM还可以包含一个由包开发者写的预安装脚本。
- 然后是编译好的二进制文件(很多)。
- 最后是安装后运行的脚本。
即:
/-- 包信息,功能 -- .spec/--- 需要的依赖包 \--- 文件列表(指定安装位置和权限) -- 预安装脚本 -- 二进制文件 -- 二进制文件 -- 二进制文件 -- 安装后运行的脚本
安装RPM时,系统首先会检查包的依赖包是否已安装。
RPM报安装完以后会将包的信息将被添加到RPM数据库中。
RPM数据库通常位于
/var/lib/rpm
目录中,包含了系统上安装的每个RPM的信息。数据库知道包之间的依赖关系,如果删除一个包会导致其他包崩溃,数据库会发出警告。数据库知道与包一起安装的每个文件及其在系统上的原始状态。它还知道每个包的文档和配置文件的位置。
RPM数据库存储位置
[root@yunkai ~]# ll /var/lib/rpm total 53284 -rw-r--r--. 1 root root 5517312 Mar 23 2017 Basenames -rw-r--r--. 1 root root 12288 Mar 23 2017 Conflictname -rw-r--r--. 1 root root 1970176 Mar 23 2017 Dirnames -rw-r--r--. 1 root root 5296128 Mar 23 2017 Filedigests -rw-r--r--. 1 root root 16384 Mar 23 2017 Group -rw-r--r--. 1 root root 16384 Mar 23 2017 Installtid -rw-r--r--. 1 root root 40960 Mar 23 2017 Name -rw-r--r--. 1 root root 12288 Mar 23 2017 Obsoletename -rw-r--r--. 1 root root 41136128 Mar 23 2017 Packages -rw-r--r--. 1 root root 1339392 Mar 23 2017 Providename -rw-r--r--. 1 root root 622592 Mar 23 2017 Provideversion -rw-r--r--. 1 root root 12288 Mar 17 2017 Pubkeys -rw-r--r--. 1 root root 376832 Mar 23 2017 Requirename -rw-r--r--. 1 root root 167936 Mar 23 2017 Requireversion -rw-r--r--. 1 root root 94208 Mar 23 2017 Sha1header -rw-r--r--. 1 root root 45056 Mar 23 2017 Sigmd5 -rw-r--r--. 1 root root 12288 Mar 16 2017 Triggername
还有一种包叫做SRPM, 即Source RPM 。这是源代码RPM包。 安装后还需要编译安装后,软件才能运行。
rpm 命令
RPM包通过rpm命令进行安装,校验或删除。
rpm -i (install安装软件包)
如何在CentOS上安装软件。
示例:安装一个软件包 MyPackage
$ rpm -ivh MyPackage-1.2.3.i386.rpm Preparing... ########################################### [100%] 1:MyPackage ########################################### [100%]
选项 | 说明 |
---|---|
-i或install | 安装一个包 |
-v | 显示详细信息 |
-h | 在控制台上打印的井号(#)来表示进度 |
rpm -e(erase删除)
要删除(卸载)已安装的程序包, 可以使用*-e选项*。 rpm将使用数据库来删除有关包的所有文件。
但是如果其他包还依赖于要删除的包,则rpm将会停止卸载。这时就需要强制卸载(但不建议这样做,因为会导致其他软件包运行异常)
下面是删除我们在上面安装的包的命令:
$ rpm -e MyPackage
强制卸载软件包
$ rpm -e --nodeps MyPackage
rpm -V (verify校验)
校验选项非常有用。它将包文件的当前状态与安装时的原始状态进行比较。不同的地方将使用代码标示出来:
代码 | 说明 |
---|---|
S | 文件大小不同 |
M | 模式不同(包括权限和文件类型) |
5 | md5不同 |
D | 设备主/副号不匹配 |
L | readLink(2) 路径不匹配 |
U | 用户权限不同 |
G | 组权限不同 |
T | 修改时间不同 |
如果您在一个包上运行rpm -V,发现一个可执行文件的大小发生了变化,那么说明可能是被他人修改过的,是一个安全隐患。
rpm -U (upgrade升级)
如果要将包更新到最新版本,请使用*-U选项*进行升级。
示例:
$ rpm -Uvh My*.rpm Preparing... ########################################### [100%] 1:bMyPackageDep ########################################### [ 50%] 1:aMyPackageNew ########################################### [100%]
在上面的例子中,bMyPackageDep是aMyPackageNew的依赖包。
rpm -q (query查询)
使用*rpm -q *可以从rpm数据库查询一些有用的信息。
返回安装包的版本:
$ rpm -q MyPackage MyPackage-1.0.0
如果您不记得包的全名,可以使用grep来查找它。
使用*-qa 选项*来查询所有已安装的包,并通过grep查找它。例如:
$ rpm -qa | grep IBM IBMWSAppDev-Product-5.0-0 IBMWSSiteDevExp-Core-5.0-0 IBMWSSiteDev-Core-5.0-0
除了版本号之外,rpm -q还可以提供关于包的其他有用信息。比如:
通过rpm查询获取信息
查询选项 | 说明 |
---|
rpm -q changelog| 显示包的开发更改历史日志
rpm -qc | 显示包的配置文件
rpm -qd | 显示包的文档文件
rpm -qi | 显示包描述
rpm -ql | 显示包的文件列表
rpm -qR | 显示包的依赖项
另外一个特殊的命令:
rpm -q whatprovides <filename>
上面的命令将找出与给定文件名相关联的包。文件名必须是文件的绝对路径,因为在rpm数据库中存储的是绝对路径。