rpm
version:major.minor.release
rpm包命名格式:
name-version-release.arch.rpm
release后也会跟os,release.os
arch:archetecture的缩写,如i386表示32位的,x64(或者叫amd64,注意可不是适用于amd处理器的64)表示64位的,noarch是所有平台通用的。
例子:
redis-3.0.2-1.el7.x64.rpm
redis对应name,3.0.2对应version,1对应release,el7表示centos7对应os,x86对应arch
其中rpm包还可以分为主包,支包。主包是最基本的包,支包是一些支持其他功能的包,比如
因为linux都是开源的,所以他的软件也会有对应的开发包,方便开发人员对这个软件进行二次研发
但是这对于只是用这个软件的人来说就没什么用了,开发工具包的包名叫做devel
主包:name-version-release.arch.rpm
支包:name-function-version-release.arch.rpm
function:devel,untils,libs,...
rpm包存在依赖关系:
X,Y,Z
x--y,z
y---a,b,c
c ---y
以上存在循环依赖,比如安装a之前要先安装b,安装b之前要安装c,安装c之前要先安装a
为了解决这种循环依赖的问题,就会有很多安装工具,能自动解决依赖关系:
yum:centos上的rpm包管理器
apt-get:ubuntu
zypper:suse
dnf:fedora 22+
程序包管理器的数据库:这个数据库里面有安装的程序包的名称,版本,依赖关系,功能说明,等等,在/var/lib/rpm。
获取程序包的途径:
1,系统发型版的光盘,或官方文件服务器,或镜像站点,有名的镜像站点有aliyun,sohu,1632:
http://mirrors.aliyun.com
2,各种软件的官方站点
3,第三方组织:
epel(这个是红帽社区比较权威的组织,他们收录的很多软件的rpm包,比如有些软件,官方没有收录,但是会被epel收购,而aliyun等镜像站点也会包含epel的镜像)
搜索rmp包的网站:pkgs.org,rpmfind.net , rpm.pbone.net
rpm命令:
安装:-i,--install
升级:-U,--update
卸载:-e,--erase
查询:-q,--query
校验:-V
数据库维护: --builddb,--initdb
-v: verbose,通常与-i搭配,安装时输出详细信息
-vv:更详细的信息
-h:显示进度条
--test:测试安装,只检查依赖关系冲突信息,不是真正安装
--nodeps :忽略依赖关系,与i搭配,安装时忽略依赖关系,装上去的程序有可能不能用。所以不建议这么做,只适用于有些场景
安装:
安装常用选项:
rpm -ivh
rpm -ivvh
rpm -ivh --test
注意:rpm可自带脚本(了解即可,自己制作rpm包的时候可能有用)
四类:--noscripts
preinstall:安装过程开始之前运行的脚本,%pre,--nopre
postinstall:安装过程完成之后运行的脚本,%post,--nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun,--nopreun
postuninstall:卸载过程完成之后运行的脚本,%postun,--nopostun
升级:
升级或安装(意思是如果当前不存在老版本则直接安装新版本):-U 常用搭配:rpm -Uvh;rpm -Uvh --test
升级(如果不存在老版本就不升级了):-F 常用搭配:rpm -Fvh;rpm -Fvh --test
升级还可以与以下搭配:
--oldpackage :降级安装
--force:强制升级;(因为升级很可能带来这样的问题:以前老版本被其他软件所依赖,但是新版本中这些被依赖的文件不存在了,不能满足依赖关系,这时候升级就会报错,这时候加这个选项就表示强制升级)
升级时需要注意的:
1,不要对内核做升级操作;lInux支持多内核并存,因此,直接安装新版本内核
2,如果某原程序的配置文件安装后被修改过,升级时,新版本的程序提供的同一配置文件不会覆盖原来版本的配置文件,而是把新版本的配置文件重命名(filename.rpmnew)后提供
卸载:
-e
--allmatches:卸载所有匹配指定名称的程序包的个版本;(貌似统一软件可以在系统上荣是存在多个版本)
--nodeps:忽略依赖关系
--test
查询:
-q:rpm -q packagename,查询指定的程序包是否已经安装,及其版本
-a,-all: rpm -qa :查询已安装的所有包
-f:rpm -qf filename:查询这个文件是由哪个软件安装生成的
-p,--package:用于实现对未安装的程序包执行查询操作 比如:rpm -qpl用于查询未安装的程序安装后会生成哪些文件或目录,rpm -qpi;rpm -qpd;rpm -qp --scripts;rpm -qpc;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
-l:程序安装生成的所有文件列表
-i,--info:程序包相关的信息,版本号,大小,所属的包组,等等
-c,--configfiles:查询程序的配置文件
-d,--docfiles:查询程序提供了哪些文档
--provides:列出程序提供的所有的CAPABILITY
[root@localhost boot]# rpm -q --provides bash
config(bash) = 4.1.2-40.el6
bash = 4.1.2-40.el6
bash(x86-64) = 4.1.2-40.el6
[root@localhost boot]# rpm -q --whatrequires 'config(bash)'
bash-4.1.2-40.el6.x86_64
[root@localhost boot]# rpm -q --whatrequires bash
initscripts-9.03.53-1.el6.centos.x86_64
dracut-004-409.el6.noarch
rsyslog-5.8.10-10.el6_6.x86_64
cronie-1.4.4-15.el6_7.1.x86_64
autofs-5.0.5-122.el6.x86_64
lvm2-2.02.143-7.el6.x86_64
-R:查询程序包依赖哪些CAPABILITY
[root@localhost ~]# rpm -qR bash
/bin/sh
/bin/sh
config(bash) = 4.1.2-40.el6
libc.so.6()(64bit)
libc.so.6(GLIBC_2.11)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libdl.so.2()(64bit)
libdl.so.2(GLIBC_2.2.5)(64bit)
libtinfo.so.5()(64bit)
ncurses-libs
rpmlib(BuiltinLuaScripts) <= 4.2.2-1
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1
--scripts:查看程序包自带的脚本片段
校验:
此命令的目的是防止安装的软件被修改,他会与软件刚安装时候进行对比,一旦某个文件被修改了或者权限属组什么的修改了,他会显示出来
-V:rpm -V zsh
S file Size differs
M Mode differs(includes permissions and file type)
5 digest(firmerly MD5 sum)differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs 时间戳改了
P capabilities differ
[root@localhost scripts]# vi newuser
[root@localhost scripts]# rpm -V zsh
S.5....T. /usr/share/zsh/4.3.11/scripts/newuser
包来源合法性和完整性验证:
先补充一个数字签名的概念:
数字签名:比如一个文件,我先用md5算出他的特征码,然后用私钥加密这个特征码,然后跟这个文件一起分发到互联网上,下载者下载到了这个文件,为了验证这个包有没有被其他人篡改,就用软件制作者在网上公开的公钥对这个文件进行解密,解密拿到这个特征码,然后算出这个文件特征码,比对自己算出的特征码与解密出来的特征码。
对于Centos来说,我们要验证一个rpm包的完整性,只需要导入这个包对应的并且是我们信任的公钥(rpm --import 公钥),rpm命令安装时就能自动帮我们验证,或者也能手动验证:rpm -K PACKAGE_FILE
一般centos会自带公钥,比如我这台电脑centos6.8的公钥就放在了/etc/pki/rpm-gpg/ RPM-GPG-KEY-CentOS-6,我们知道在centos发行版的iso镜像中就集成了诸多的官方收录的rpm包(在Packages目录下),我这里将我当初安装centos的iso镜像挂载到系统中,然后将iso镜像里的zsh-4.3.11-4.el6.centos.2.x86_64.rpm文件复制了出来,同时我在163镜像站点中下载了centos7版的zsh-5.0.2-28.el7.x86_64.rpm
可以很清楚的看到,用rpm -K 验证zsh4.3的时候显示ok,而验证zsh5.0的时候显示not ok,
这是因为,centos6一个公钥私钥对,而centos7又是一个公钥私钥对,官方在放出rpm包的时候,会用私钥将rpm包签名认证,那么我们就可以用与私钥相匹配的公钥对rpm包进行完整性验证,如果验证合格了,证明这个rpm包确实是官方放出的,如果验证不通过,则说明这个包不是官方放出的,这样就保证了rpm包的安全,避免下载到的是其他人篡改了的植入了后门的rpm包
在本例中,因为系统中只有centos6的公钥,所以在验证centos7版本的rpm包的时候不通过,那么我们可以在系统中添加163镜像站点上下载的centos7的公钥,也就是上图中的RPM-GPG-KEY-CentOS-7
这个时候就发现,zsh5.0就能通过验证了,同时zsh4.3依然能验证通过,说明rpm --import 执行的是添加公钥,而非替换公钥
·
rpm数据库重建(此命令一般用于不小心把rpm数据库的某个文件删了,那么有可能通过这个命令来恢复):
--initdb:初始化数据库,如果已经存在了不进行任何操作,如果不存在则初始化创建一个新的
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建
rpm --initdb --dbpath=/tem/rpm
rpm --rebuilddb --dbpath=/tem/rpm