你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux rpm包管理详述

[日期:2017-09-16] 来源:Linux社区  作者:liubinsh [字体: ]

 二、升级

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
选项:
-U:升级或安装
-F:升级
[install-options]:支持安装不部分的install-options
--oldpackage:降级
--force:强制升级
注意:(1)不要对内核做升级操作,linux支持多内核版本并存,因此直接安装新版本的内核
      (2)如果某原程序包的配置文件安装后曾被修改,升级时,新版本的程序提供的同一个配置文件不会覆盖原有的配置文件。 

 三、卸载

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
选项:
-e:卸载
--allmatches:卸载所有pip指定名称的程序包的各个版本
--nodeps:忽略依赖关系
--test:测试卸载,dry run模式

举例:
卸载zsh,卸载后被修改的配置文件会被保存为.rpmsave的文件。

[root@localhost Packages]# rpm -e  zsh
warning: /etc/zshrc saved as /etc/zshrc.rpmsave
[root@localhost Packages]# 
[root@localhost Packages]# rpm -i zsh-5.0.2-25.el7.x86_64.rpm 
[root@localhost Packages]# 
[root@localhost Packages]# vim /etc/zshrc
zshrc          zshrc.rpmsave   

 四、查询

rpm {-q|--query} [select-options] [query-options]
-q:查询操作
[select-options]:
PACKGE_NAME:查询指定的程序包是否已经按照及版本
-a,--all:查询所有已经按照过得包
-f FILE:查询指定的文件是由哪个程序包安装生成的
-p,--packges PACKAGE_FILE:用户实现对未安装的程序包执行查询操作
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
[query-options]
--changelog:查询rpm包的changelog
-l,--list:程序包安装生成的所有文件列表
-i,--info:程序包相关的信息,版本、大小、所属包组等
-c,--configfiles:查询指定的程序包提供的配置文件
-d,--docfiles:查询指定的程序包提供的文档
--provides:查询指定程序包提供的所有的CAPABILITY
-R,--requires:查询指定的程序包的依赖关系
--scripts:查看程序包自带的脚本片段

举例:

[root@localhost Packages]# rpm -q zsh    #查询zsh是否被安装
zsh-5.0.2-25.el7.x86_64
[root@localhost Packages]# rpm -qf /etc/zshrc   #查询/etc/zshrc是由哪个包安装生成的
zsh-5.0.2-25.el7.x86_64
[root@localhost Packages]# rpm -q --changelog zsh   #查询zsh的修改日志
* Thu Jul 14 2016 Kamil Dudka <kdudka@RedHat.com> - 5.0.2-25
- improve use of new command substitution in completion (#1356388)

* Fri Jun 10 2016 Kamil Dudka <kdudka@redhat.com> - 5.0.2-24
- fix off-by-one error in completion utility cache code (#1344599)

* Mon May 23 2016 Kamil Dudka <kdudka@redhat.com> - 5.0.2-23
- fix parse error on a script with unescaped exclamation mark (#1338689)
......(略)
[root@localhost Packages]# rpm -ql zsh    #查询安装zsh会生成的文件列表
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
/usr/lib64/zsh
/usr/lib64/zsh/5.0.2
......(略)
[root@localhost Packages]# rpm -qc zsh  #查询安装zsh所生成的配置文件
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost Packages]# rpm -qd zsh   #查询安装zsh所生成的文档信息
/usr/share/doc/zsh-5.0.2/BUGS
/usr/share/doc/zsh-5.0.2/CONTRIBUTORS
/usr/share/doc/zsh-5.0.2/FAQ
/usr/share/doc/zsh-5.0.2/FEATURES
/usr/share/doc/zsh-5.0.2/LICENCE
/usr/share/doc/zsh-5.0.2/MACHINES
/usr/share/doc/zsh-5.0.2/NEWS
......(略)
[root@localhost Packages]# rpm -q --provides  zsh   #查询zsh所提供的CAPABILITY
config(zsh) = 5.0.2-25.el7
zsh = 5.0.2-25.el7
zsh(x86-64) = 5.0.2-25.el7
[root@localhost Packages]# rpm -qR zsh  #查询zsh所依赖的CAPABILITY
/bin/sh
/bin/sh
/bin/sh
/bin/sh
/bin/zsh
/sbin/install-info
/sbin/install-info
config(zsh) = 5.0.2-25.el7
coreutils
......(略)
[root@localhost Packages]# rpm -q --scripts  zsh  #查询zsh的自定的脚本片段
postinstall scriptlet (using /bin/sh):  
if [ ! -f /etc/shells ] ; then
    echo "/bin/zsh" > /etc/shells
else
    grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
fi

if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir   --entry="* zsh: (zsh).            An enhanced bourne shell."
fi

:
preuninstall scriptlet (using /bin/sh):   
if [ "$1" = 0 ] ; then
    if [ -f /usr/share/info/zsh.info.gz ]; then
    # This is needed so that --excludedocs works.
    /sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/info/dir       --entry="* zsh: (zsh).            An enhanced bourne shell."
    fi
fi
:
postuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
    if [ -f /etc/shells ] ; then
        TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`
        grep -v '^/bin/zsh$' /etc/shells > $TmpFile
        cp -f $TmpFile /etc/shells
        rm -f $TmpFile
    fi
fi
[root@localhost Packages]# rpm -q --whatprovides 'config(zsh)'  #查询conig(zsh)是由哪个包提供的
zsh-5.0.2-25.el7.x86_64
[root@localhost Packages]# 
[root@localhost Packages]# rpm -q --whatrequires  'config(zsh)' #查询config(zsh)被哪个包所依赖
zsh-5.0.2-25.el7.x86_64
[root@localhost Packages]# rpm -qpl  zenity-3.8.0-5.el7.x86_64.rpm  #这里的zenity是没有安装的,可以直接加-p选项,进行查询操作,查询zenity安装后生成的文件列表
/usr/bin/zenity
/usr/share/doc/zenity-3.8.0
/usr/share/doc/zenity-3.8.0/AUTHORS
/usr/share/doc/zenity-3.8.0/COPYING
/usr/share/doc/zenity-3.8.0/NEWS
......(略)
[root@localhost Packages]# rpm -qp --provides  zenity-3.8.0-5.el7.x86_64.rpm #查询zenity所提供的CAPABILITY
zenity = 3.8.0-5.el7
zenity(x86-64) = 3.8.0-5.el7 

五、 校验

rpm {-V|--verify} [select-options] [verify-options]    
选项:
--nodeps:不检查文件的依赖性关系
--nofiles:不检查文件的任何属性
--nosize:不检查文件大小
--nouser:不检查文件的属主
--nogroup:不检查文件的属组
--nomtime:不检查文件的时间戳

举例:

[root@localhost Packages]# rpm -V zsh
.......T.  c /etc/zshrc  #这里表示时间戳有变,没有任何输出代表校验成功
这里的每个点代表一个校验的类型:
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly 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 Packages]# rpm -V zsh
S.5....T.  c /etc/zshrc  #文件大小发生改变,MD5值改变,时间戳改变
[root@localhost Packages]# rpm -V --nomtime zsh #不检查时间戳
S.5......  c /etc/zshrc

包来源合法性验证和完整性验证:

那么用户如何获取公钥呢?
CentOS发行版在:/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
导入包制作者的秘钥:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
验证:
1.安装程序的时候,会自动执行验证
2.手动验证:rpm -K PACKAGE_FILE
[root@localhost Packages]# rpm -K zsh-5.0.2-25.el7.x86_64.rpm 
zsh-5.0.2-25.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

六、RPM的数据库

rpm管理器的数据库路径位于:/var/lib/rpm/,比如查询操作都是通过此处的数据库进行的,当我们的数据库损坏的时候,可有重建数据库:
获取帮助:
centos 6: man rpm
centos 7:man rpmdb
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;

一般情况下我们都不要去动RPM的数据库。

总结:rpm命令的查询功能是非常的重要的,但是安装却不显的那么重要,因为使用rpm安装包,如果包存在一些依赖的包,你需要将依赖的包一个一个的安装,这样耗时又耗力,所以在安装包的时候,我们一般会使用比较自动化的工具yum,它能帮我们解决依赖性的关系,yum将在下一篇博客中进行详细的介绍http://www.linuxidc.com/Linux/2017-09/146903.htm

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-09/146902.htm

linux
相关资讯       Linux rpm包管理 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款