在linux中有人多的软件使用,比如我们使用的ifconfig,fdisk,btrfs文件系统等。可能这些软件在你原有的linux系统中并不存在,那么我们如何去使用这些工具呢。我们知道windows在需要软件的时候需要安装,当然对于linux系统一样需要安装。在linux下常用的安装工具我们使用的是rpm程序包(当然我们这边是针对CentOS而言),那么什么是rpm,如何安装rpm包以及使用rpm包做一些操作等,在下面的内容中将提到。
一、什么是RPM
RPM全称为“RedHatPackage Manager”,看名字就知道这是RedHat公司搞出来的,后来因为RPM发展的很好,逐渐成为了一种通用的标准,就更名为“RPM is PackageManager"。
RPM最大的特点就是将软件先编译,并打包成为RPM机制的安装包,包中包含了该软件安装时所必须依赖属性软件信息,如果这些被依赖的软件已经安装,则安装包可顺利安装完成,否则软件将会安装失败。
RPM安装时会将该软件的信息写入到RPM数据库中,那么软件的查询、验证、升级、卸载等操作都可以从数据中直接调用执行。
二、认识RPM包
1、RPM包的命名格式
name-version-release.OS.arch.rpm
解释:
name:软件名称。
version:major.minor
major:主版本号;
minor:次版本号;
release:rpm自身的发行号,与程序源码的发行号无关,仅用于标识对rpm包不同制作的修订;同时,release还包含此包适用的OS。
arch:适用于的硬件平台;
x86:i386,i486,i586,i686等;
x86_64:支持64位CPU;
noarch:依赖于虚拟机。
例如:yum-3.2.29-60.el6.centos.noarch.rpm
2、分包机制
对于一个功能比较多的软件来说,而用户可能并不会用户其所有的功能,那么OS Vendor(系统发行商)在制作RPM包时只会用将他们认为用户会经常用到的功能打包成为与源程序名一致的核心包,而将其它的功能再次的打包成为子包;比如:yum程序有20个功能,常用功能有8个,特殊功能A:3个,特殊功B:6个,二次开发相关功能:3个,那么其RPM的形式有可能是这样的:
核心包:
yum-3.2.29-60.el6.centos.noarch.rpm
子包:
yum-a-3.2.29-60.el6.centos.noarch.rpm
yum-b-3.2.29-60.el6.centos.noarch.rpm
yum--devel-3.2.29-60.el6.centos.noarch.rpm
如果需要用到子包中的功能的话,就需要把对应的子包进行安装。
注:很多子包的安装需要依赖一些其他的包,所有在安装的时候要按照提示来进行安装
3、rpm包的获取路径
获取程序包的途径:
(1)系统发行版的光盘或官方版的服务器:
CentOS镜像:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2)项目官方站点
(3)第三方组织
Fedora-EPEL
htt://pkgs.org
http://rpmfind.net
http://pbone.net
(4)自己制作
建议:检查其合法性
来源合法性
程序包的完整性
三、RPM的安装,查询,卸载等使用
Centos系统上rpm命令管理程序包:我们这边以CentOS7为例
1、 rpm包的安装
使用格式:rpm {-i|--install} [install-options] PACKAGE_FILE ...
其他选项:
-v:显示详细信息
-vv:显示更详细信息
-h:以#显示程序包管理执行进度,每个#号表示2%进度
rpm -ivh PACKAGE_FILE... :实现程序包安装可以显示信息及安装进度。如下:
[root@localhost Packages]# rpm -ivh zsh-html-5.0.2-7.el7.x86_64.rpm
警告:zsh-html-5.0.2-7.el7.x86_64.rpm:头V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zsh-html-5.0.2-7.el7 ################################# [100%]
[install-options]的选项有:
--test :测试安装
--nodeps:忽略依赖关系
--replacepkgs:重新安装
[root@localhost Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm
警告:zsh-5.0.2-7.el7.x86_64.rpm:头V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zsh-5.0.2-7.el7 ################################# [100%]
--nodigest:不检查程序包完整性
--nosignature:不检查来源合法性
[root@localhost Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm --nodigest --nosignature
准备中... ################################# [100%]
正在升级/安装...
1:zsh-5.0.2-7.el7 ################################# [100%]
--noscripts:不执行程序包脚本片段
%pre: 安装前脚本; --nopre
%post: 安装后脚本; --nopost
%preun: 卸载前脚本; --nopreun
%postun: 卸载后脚本; --nopost
2、 rpm包的升级:
rpm {-U|--upgrade} [install-options]PACKAGE_FILE ...
安装有旧版程序包,则升级;如果不存在旧版程序包,则安装
rpm {-F|--freshen} [install-options]PACKAGE_FILE ...
安装有旧版程序包,则升级,如果不存在旧版本程序,则不执行升级作
rpm -Uvh PACKAGE_FILE...
rpm -Fvh PACKAGE_FILE...
--oldpackage:降级
--force:强行升级
对于安装的程序在install-options的众多选项中也可以使用
[root@localhost newrpm]# rpm -Uilv yum-langpacks-0.4.2-4.el7.noarch.rpm
警告:yum-langpacks-0.4.2-4.el7.noarch.rpm:头V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY
软件包准备中...
yum-langpacks-0.4.2-4.el7.noarch
yum-langpacks-0.4.2-3.el7.noarch
[root@localhost newrpm]# rpm -Filv yum-langpacks-0.4.2-4.el7.noarch.rpm
警告:yum-langpacks-0.4.2-4.el7.noarch.rpm:头V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY
注意:(1)不要对内核进行升级:Linux支持多内核版本并存,因此,对其直接安装新版本内核
(2)如果原程序包的配置文件安装后曾被修改,长级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
3、 rpm包的查询:
rpm {-q|--query} [select-options] [query-options]
对那些包查询 查询什么
[select-options]的选项: -a :查询所有安装的
[root@localhost Packages]# rpm -qa
-f:查询指定的文件由哪个文件包安装生成
[root@localhost ~]# rpm -qf /usr/bin/yum
yum-3.4.3-125.el7.centos.noarch
-p:针对尚未安装的程序包文件做查询操作
[root@localhost Packages]# rpm -qi php-common-5.4.16-23.el7_0.3.x86_64.rpm #查询RPM包信息
未安装软件包 php-common-5.4.16-23.el7_0.3.x86_64.rpm #这里提示我们这个包没有安装
[root@localhost Packages]# rpm -qip php-common-5.4.16-23.el7_0.3.x86_64.rpm
#这个命令就是我们对未安装的程序包信息
警告:php-common-5.4.16-23.el7_0.3.x86_64.rpm:头V3 RSA/SHA256 Signature,密钥 ID f4a80eb5: NOKEY
Name : php-common
Version :5.4.16
Release :23.el7_0.3
Architecture: x86_64
InstallDate:(not installed)
Group :Development/Languages
Size :3971359
License : PHP and BSD and ASL 1.0
Signature : RSA/SHA256,2014年10月31日星期五22时24分39秒,Key ID 24c6a8a7f4a80eb5
Source RPM : php-5.4.16-23.el7_0.3.src.rpm
BuildDate :2014年10月31日星期五21时07分27秒
BuildHost : worker1.bsys.centos.org
Relocations:(not relocatable)
Packager :CentOSBuildSystem<http://bugs.centos.org>
Vendor :CentOS
URL : http://www.php.net/
Summary :Common files for PHP
Description:
The php-common package contains files used by boththe php
package and the php-cli package.
[query-options]的选项:
--changelog :查询rpm包的修改日志
root@localhost ~]# rpm -q --changelog bash #后面的更新信息太多,所以这边就不插入了
-c:查询配置文件
[root@localhost ~]# rpm -qc yum
/etc/logrotate.d/yum
/etc/yum.conf
/etc/yum/version-groups.conf
--conflicts:查询与什么包冲突
-d:查询程序的帮助文档
[root@localhost ~]# rpm -qd yum
/usr/share/doc/yum-3.4.3/AUTHORS
/usr/share/doc/yum-3.4.3/COPYING
/usr/share/doc/yum-3.4.3/ChangeLog
/usr/share/doc/yum-3.4.3/INSTALL
/usr/share/doc/yum-3.4.3/PLUGINS
/usr/share/doc/yum-3.4.3/README
/usr/share/doc/yum-3.4.3/TODO
/usr/share/man/man5/yum.conf.5
/usr/share/man/man8/yum-shell.8
/usr/share/man/man8/yum.8
-i:安装包的信息
[root@localhost ~]# rpm -qi yum
Name : yum
Version :3.4.3
Release :125.el7.centos
Architecture: noarch
InstallDate:2015年08月19日星期三23时04分19秒
Group :SystemEnvironment/Base
Size :5746020
License :GPLv2+
Signature : RSA/SHA256,2015年03月14日星期六16时41分36秒,Key ID 24c6a8a7f4a80eb5
Source RPM : yum-3.4.3-125.el7.centos.src.rpm
BuildDate :2015年03月10日星期二04时39分21秒
BuildHost : worker1.bsys.centos.org
Relocations:(not relocatable)
Packager :CentOSBuildSystem<http://bugs.centos.org>
Vendor :CentOS
URL : http://yum.baseurl.org/
Summary : RPM package installer/updater/manager
Description:
Yum is a utilitythat can check for and automatically download and
install updated RPM packages.Dependencies areobtained and downloaded
automatically, prompting the user for permission asnecessary.
-l:查看指定的程序包安装后生成的所有文件
root@localhost ~]# rpm -ql yum #查看yum安装完成后所生成的文件
/etc
/etc/bash_completion.d
/etc/bash_completion.d/yum
/etc/bash_completion.d/yummain.py
/etc/cron.daily
/etc/cron.daily/0yum-daily.cron
/etc/cron.hourly
/etc/cron.hourly/0yum-hourly.cron
/etc/dbus-1
/etc/dbus-1/system.d
/etc/logrotate.d
/etc/logrotate.d/yum #后面生成的文件太多 我这边就不一一列举出来,只是其中的一部分
--scripts:显示程序包安装卸载时执行的脚本
[root@localhost ~]# rpm -q --scripts bash
postinstall scriptlet (using<lua>):
nl ='\n'
sh ='/bin/sh'..nl
bash ='/bin/bash'..nl
f = io.open('/etc/shells','a+')
if f then
local shells = nl..f:read('*all')..nl
if not shells:find(nl..sh) then f:write(sh) end
if not shells:find(nl..bash) then f:write(bash) end
f:close()
end
postuninstall scriptlet (using<lua>):
--Run it only if we are uninstalling
if arg[2]=="0"
then
t={}
for line in io.lines("/etc/shells")
do
if line ~="/bin/bash" and line ~="/bin/sh"
then
table.insert(t,line)
end
end
f = io.open("/etc/shells","w+")
for n,line in pairs(t)
do
f:write(line.."\n")
end
f:close()
end
-R:查询指定的程序包所依赖的能力
[root@localhost ~]# rpm -qR zsh
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/zsh
/sbin/install-info
/sbin/install-info
config(zsh)=5.0.2-7.el7
coreutils
grep
grep
--provides:列出指定程序包所提供的CAPABILITY
下面我们总结下RPM包查询中常用的组合选项:
rpm -q package_name :查询某包是否已安装
rpm -qa:查询所有已经安装的包
rpm -qi package_name:查询包的描述信息
rpm -ql package_name:查询某包安装生成了哪些文件
rpm -qc package_name:查询某包安装生成了哪些配置文件
rpm -qd package_name:查询某包安装生成了哪些文档(帮助文件)
rpm -q �Cscripts package_name:查询程序包的相关脚本
rpm -qf /path/to/some_file:查询某文件是由哪个包安装生成的
4、rpm包卸载:
用法:rpm{-e|--erase} [--allmatches] [--nodeps] [--noscripts]
[--notriggers] [--test]PACKAGE_NAME ...
-e:卸载
--noscripts:忽略依赖关系
--test: 测卸载,但不真正执行安装过程;
--nodeps:忽略依赖关系;
--replacepkgs: 重新卸载;
--nosignature: 不检查来源合法性;
--nodigest:不检查包完整性;
[root@localhost ~]# rpm -e zsh 卸载zsh
[root@localhost ~]# rpm -q zsh #再次查看zsh,提示未安装
未安装软件包 zsh
卸载是的大多选项都同安装一样,所以这边就不做演示了。
5、 rpm包校验:
rpm {-V|--verify} [select-options] [verify-options][verify-options]
校验:检查包安装生成的文件属性是否发生变化
[root@localhost Packages]# rpm -V zsh #查看zsh生成的文件是否发生变化
S.5....T. /usr/share/zsh/5.0.2/functions/zmv #这提示发生了改变
的内容没有被修改的情况下rpm -V zsh命令不会有任何输出结果,但上例中出现了一行奇怪的符号,说明zsh的属性已经发生了变化,下面来我看一下前面的文字所代表的含义:
S file Sizediffers:文件的容量大小是否被改变;
M Mode differs(includes permissions and file type):文件的类型或文件的属性是否被改变;
5 digest(formerly MD5 sum) differs:MD5指纹的内容已发生了变化
D Devicemajor/minor number mismatch:设备的主/次代码已经改变;
L readLink(2)path mismatch:Link路径已被改变
U Userownership differs:文件的所有者已被改变;
G Groupownership differs:文件的属组已被改变;
T mTime differs:文件的创建时间被改变。
P caPabilities differ :
包来源合法性及完整性验证
前提:在当前系统上导入包的制作者的公钥
导入所需要公钥:
rpm --import /PATH/FROM/GPG-PUBKEY-FILE
[root@localhost media]# rpm --import RPM-GPG-KEY-CentOS-7 #导入公钥
[root@localhost media]# cd Packages/
[root@localhost Packages]# rpm -ivh --replacepkgs zsh-5.0.2-7.el7.x86_64.rpm #不在提示警告信息
准备中... ################################# [100%]
正在升级/安装...
1:zsh-5.0.2-7.el7 ################################# [100%]
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
6、rpm数据库管理
rpm数据库存放的位置:/var/lib/rpm
如果数据库损毁,我们呢需要对数据库重建:
rpm {--initadb|--rebuilddb}
initdb: 初始化
如果事先不存在数据库,则新建之;否则,不执行任何操作;
rebuilddb:重建
无论当前存在与否,直接重新创建数据库;
四、小结
虽然在安装软件时还有其他更好的工具,比如yum(日后再介绍),但是yum也是基于RPM而衍生出来的,而且在查询软件包很有用,日后也会经常使用这个命令,所以必须要对RPM命令非常熟悉,建议多加练习。以上的的所有内容,都是本人学习的总结,可能有些地方介绍的不足,也许还有很多的命令没有介绍到,希望不足的地方请指出。谢谢!