二、升级
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。