CentOS Linux 安装命令之 rpm 详解

文章
林里克斯

CentOS Linux 安装命令之 rpm 详解


实验平台:CentOS Linux release 7.6.1810

RPM 版本:RPM version 4.11.3


一、rpm 参数详解


$ rpm --help

#查询或验证包选择 options:
  -a, --all                        #查询或验证所有 rpm 包
  -f, --file                       #查询/验证 rpm 包所属文件
  -g, --group                      #查询/验证组内的 rpm 包  
  -p, --package                    #查询/验证 rpm 包文件
  --pkgid                          #查询/验证 rpm 包的标识符
  --hdrid                          #查询/验证 rpm 包头部标识符
  --triggeredby                    #查询由 rpm 包触发的包
  --whatrequires                   #查询/验证需要依赖项的 rpm 包
  --whatprovides                   #查询/验证提供依赖项的 rpm 包
  --nomanifest                     #不将非 rpm 包文件作为清单处理

#查询 options (使用 -q 或 --query):
  -c, --configfiles                #列出所有配置文件
  -d, --docfiles                   #只显示文档文件
  -L, --licensefiles               #只显示许可证文件
  --dump                           #转储文件下列信息
  -l, --list                       #显示 rpm 包的文件
  --queryformat=QUERYFORMAT        #使用下面的查询格式
:armor     以 ASCII 形式编码的公钥
:arraysize 在数组标记中显示单元数目
:base64    使用 base64 编码二进制数据
:date      使用 strftime(3) 的 "%c" 格式
:day       使用 strftime(3) 的 "%a %b %d %Y" 格式
:depflags  格式化依赖比较操作符
:deptype   格式化依赖类型
:expand    对宏进行展开
:fflags    格式化文件标记
:fstate    格式化文件状态
:fstatus   格式化文件校验状态
:hex       以16进制格式化
:octal     以八进制格式化
:perms     格式化文件权限
:pgpsig    显示签名指纹和时间
:shescape  对单引号进行转义(为了可以在脚本中使用)
:triggertype 显示触发器后缀
:vflags    文件校验标记
:xml       以 XML 格式编码数据
  -s, --state                      #显示软件包中文件的状态
[normal(正常,表明文件未被其他软件包修改过)|not installed(未安装,表明文件未安装)|replaced(已替换,表明文件已被其他软件包修改替换过,不再是原先的文件)|net shared(网络共享,表明文件处于网络共享状态)]

#验证 options (使用 -V 或 --verify):
  --nofiledigest                   #不验证文件摘要
  --nofiles                        #不校验文件的任何属性
  --nodeps                         #不校验软件包的依赖关系
  --noscript                       #不执行 %verifyscript 脚本

#安装/升级/卸载 options:
  --allfiles                       #安装或升级软件包中所有文件,即使它们可能应该被跳过
  --allmatches                     #移除所有匹配的包(如果指定了多个包,通常会产生一个错误)
  --badreloc                       #允许重新定位所有文件的路径,而不仅仅是二进制包中重定位提示(hint)包含的那些 OLDPATH,与 --relocate 搭配使用
  -e, --erase=<package>+           #卸载指定的 rpm 包
  --excludedocs                    #不安装任何被标记为文档的文件,包含手册或 textinfo
  --excludepath=<path>             #跳过安装 <path> 的文件
  --force                          #与 --replacepkgs 和 --replacefiles 一样的效果
  -F, --freshen=<packagefile>+     #若已经安装了就升级版本
  -h, --hash                       #在包被解压时,输出 50 个井号(#),与 -v|--verbose 配合使用,得到漂亮一点的输出
  --ignorearch                     #不验证 rpm 包架构
  --ignoreos                       #安装前不验证操作系统
  --ignoresize                     #安装前不检查磁盘空间是否够用
  -i, --install                    #安装 rpm 包,后接 rpm 包文件
  --justdb                         #只更新数据库,而不更新文件系统
  --nodeps                         #不验证 rpm 包的依赖关系
  --nofiledigest                   #不验证文件摘要
  --nocontexts                     #不安装文件安全上下文
  --noorder                        #不安装重排序。通常软件包列表会被重排序,以满足依赖关系
  --noscripts                      #不执行对应脚本
  --notriggers                     #不执行任何对应的触发脚本
  --nocollections                  #不执行任何收集操作
  --oldpackage                     #允许用旧软件包替换新软件包 (--force 会自动带上这个参数)
  --percent                        #打印从软件包中解压文件的百分比。这是为了使 rpm 在其他工具中运行时更简单一些
  --prefix=<dir>                   #对于可重定位的包,将把软件包重定位提示中所有以安装前缀(prefix)开头的文件路径转换为以 <dir> 目录
  --relocate=<old>=<new>           #对于可重定位的二进制包,将软件包重定位提示中所有以 <old> 开头的文件路径转换为以 <new> 开头
  --replacefiles                   #忽略包之间的文件冲突,强制安装软件包,即使它将覆盖其他已安装软件包的文件
  --replacepkgs                    #如果已经安装了包,再重新覆盖安装
  --test                           #不安装软件包,仅仅检测并报告可能的冲突
  -U, --upgrade=<packagefile>+     #升级 rpm 包
  --reinstall=<packagefile>+       #重新安装

#所有 rpm 模式和可执行文件的通用 options:
  -D, --define='MACRO EXPR'        #将 MACRO 宏的值定义为 EXPR
  --undefine=MACRO                 #撤销 MACRO 宏
  -E, --eval='EXPR'                #打印出值 EXPR 对应的宏
  --macros=<FILE:...>              #指定 <FILE:...> 来替代 macros 配置文件
  --noplugins                      #不启用任何插件
  --nodigest                       #读取时不校验包或头部的摘要信息
  --nosignature                    #读取时不校验软件包或头部签名
  --rcfile=<FILE:...>              <FILE:...>中冒号分隔的每个文件都被 rpm 按顺序读取,从中获得配置信息
  -r, --root=ROOT                  以 ROOT 作为根文件系统进行操作 (默认是: "/")
  --dbpath=DIRECTORY               #使用 DIRECTORY 中的数据库,而不是默认的 /var/lib/rpm
  --querytags                      #显示已知的查询标签
  --showrc                         #显示 rpmrc 和 macros 配置文件中定义的选项的值
  --quiet                          #输出尽可能少的信息,通常只有错误信息才会显示出来
  -v, --verbose                    #提供更详细的输出
  --version                        #打印版本信息

Options implemented via popt alias/exec:
  --scripts                        #列出软件包自定义的脚本,他们是安装和卸载等过程的一部分
  --setperms                       #设置 rpm 包中的文件权限
  --setugids                       ##设置 rpm 包中属主/属组
  --conflicts                      #显示此软件包与哪些功能有冲突
  --obsoletes                      #列出被此软件包废弃的软件包
  --provides                       #列出软件包提供的功能
  --requires                       #列出此软件包所依赖的功能(通常是一个软件包)
  --info                           #显示软件包信息,包括名称、版本、描述
  --changelog                      #显示软件包的变更信息
  --xml                            #用 xml 列出元数据
  --triggers                       #显示软件包中包含的触发脚本
  --last                           #列出软件包时以安装时间排序,最新的在上面
  --dupes                          #列出重复的包
  --filesbypkg                     #列出每个所选软件包中的文件
  --fileclass                      #以类列出文件名
  --filecolor                      #以颜色列出文件名
  --fscontext                      #以安全上下文列出文件名
  --fileprovide                    #以 provides 了的列出文件名
  --filerequire                    #以 required 列出文件名
  --filecaps                       #以 POSIX1.e capabilities 列出文件名

帮助信息 options:
  -?, --help                       #打印帮助信息
  --usage                          #查看简要的常用的选项信息

二、使用案例


1.查询所有已安装的 rpm

$ rpm -qa "httpd*" ; rpm -qa | grep httpd

2.不安装查看 httpd 包里的内容

$ rpm -qlp mysql-community-client-5.7.10-1.el7.x86_64.rpm 

3.查看一个文件属于哪个 rpm

$ rpm -qf `which vim`
vim-enhanced-7.4.160-5.el7.x86_64

4.查看最近安装的 10 个包

$ rpm -qa --last | head 

5.查看已安装 rpm 包的信息

$ rpm -qi bash
Name        : bash
Version     : 4.2.46
Release     : 31.el7
Architecture: x86_64
Install Date: Tue 18 Dec 2018 05:34:17 PM CST
Group       : System Environment/Shells
Size        : 3667773
License     : GPLv3+
Signature   : RSA/SHA256, Mon 12 Nov 2018 10:21:49 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : bash-4.2.46-31.el7.src.rpm
Build Date  : Wed 31 Oct 2018 01:09:33 AM CST
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://www.gnu.org/software/bash
Summary     : The GNU Bourne Again shell
Description :
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.

6.查看已安装的 rpm 包的配置文件

$ rpm -qc bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc

7.查看已安装的 rpm 包的文档文件

$ rpm -qd bash
/usr/share/doc/bash-4.2.46/COPYING
/usr/share/info/bash.info.gz
/usr/share/man/man1/..1.gz
/usr/share/man/man1/:.1.gz
/usr/share/man/man1/[.1.gz
/usr/share/man/man1/alias.1.gz
/usr/share/man/man1/bash.1.gz

8.查看已安装的 rpm 包的文件状态

$ rpm -qs lrzsz
normal        /usr/bin/rb
normal        /usr/bin/rx
normal        /usr/bin/rz
normal        /usr/bin/sb
normal        /usr/bin/sx
normal        /usr/bin/sz
normal        /usr/share/locale/de/LC_MESSAGES/lrzsz.mo
normal        /usr/share/man/man1/rz.1.gz
normal        /usr/share/man/man1/sz.1.gz
#参数可参考 -s, --state 参数

9.查看已安装的 rpm 包的所有文件

$ rpm -ql lrzsz
/usr/bin/rb
/usr/bin/rx
/usr/bin/rz
/usr/bin/sb
/usr/bin/sx
/usr/bin/sz
/usr/share/locale/de/LC_MESSAGES/lrzsz.mo
/usr/share/man/man1/rz.1.gz
/usr/share/man/man1/sz.1.gz

10.查看 rpm 包安装、卸载前后的脚本

$ rpm -q --scripts mysql-server 
preinstall scriptlet (using /bin/sh): 
/usr/sbin/groupadd -g 27 -o -r mysql >/dev/null 2>&1 || : 
/usr/sbin/useradd -M -N -g mysql -o -r -d /var/lib/mysql -s /bin/bash \ 
       -c "MySQL Server" -u 27 mysql >/dev/null 2>&1 || : 
postinstall scriptlet (using /bin/sh): 
if [ $1 = 1 ]; then 
   /sbin/chkconfig --add mysqld 
fi 
/bin/chmod 0755 /var/lib/mysql 
/bin/touch /var/log/mysqld.log 
preuninstall scriptlet (using /bin/sh): 
if [ $1 = 0 ]; then 
   /sbin/service mysqld stop >/dev/null 2>&1 
   /sbin/chkconfig --del mysqld 
fi 
postuninstall scriptlet (using /bin/sh): 
if [ $1 -ge 1 ]; then 
   /sbin/service mysqld condrestart >/dev/null 2>&1 || : 

11.验证 rpm 包的状态

$ rpm -Va
#验证已安装的所有 rpm 包状态
missing     /usr/local/cloudSafed/nylib/libthriftnb-0.9.3.so
S.5....T.    /usr/local/cloudSafed/secure
..5....T.    /usr/local/cloudSafed/verserv
S.5....T.  c /etc/sysconfig/authconfig
.....UG..    /etc/supervisord.d
.M.......    /var/run/supervisor
S.5....T.  c /etc/yum.repos.d/CentOS-Base.repo
代码 含义
S 表示文件大小
M 表示文件权限
5 表示 MD5 校验和
D 表示主从设备号
L 表示符号链接
U 表示属主
G 表示属组
T 表示最后修改时间

三、RPM 的文件详解


1.rpmrc 配置文件

/usr/lib/rpm/rpmrc
/usr/lib/rpm/redhat/rpmrc
/etc/rpmrc
~/.rpmrc

2.Macro 配置文件

/usr/lib/rpm/macros
/usr/lib/rpm/redhat/macros
/etc/rpm/macros
~/.rpmmacros

3.数据库

/var/lib/rpm/Basenames
/var/lib/rpm/Conflictname
/var/lib/rpm/Dirnames
/var/lib/rpm/Group
/var/lib/rpm/Installtid
/var/lib/rpm/Name
/var/lib/rpm/Obsoletename
/var/lib/rpm/Packages
/var/lib/rpm/Providename
/var/lib/rpm/Requirename
/var/lib/rpm/Sha1header
/var/lib/rpm/Sigmd5
/var/lib/rpm/Triggername

4.临时文件

/var/tmp/rpm*

四、RPM Database 的备份与恢复


1.RPM Database 基本结构

$ file /var/lib/rpm/*
/var/lib/rpm/Basenames:    Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Conflictname: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/__db.001:     Applesoft BASIC program data
/var/lib/rpm/__db.002:     386 pure executable
/var/lib/rpm/__db.003:     386 pure executable not stripped
/var/lib/rpm/Dirnames:     Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Group:        Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Installtid:   Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Name:         Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Obsoletename: Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Packages:     Berkeley DB (Hash, version 9, native byte-order)
/var/lib/rpm/Providename:  Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Requirename:  Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Sha1header:   Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Sigmd5:       Berkeley DB (Btree, version 9, native byte-order)
/var/lib/rpm/Triggername:  Berkeley DB (Btree, version 9, native byte-order)
#默认情况下,RPM 存放在 /var/lib/rpm 目录,除了 __db.00* 是数据文件外,其他文件都属于 Berkeley DB 格式
#包名查询命令 rpm -q package_name就是通过 /var/lib/rpm/Name文件得到的。如果这个文件受到损坏或缺失,则 rpm -q package_name命令无法正常工作

2.RPM Database 备份

$ tar cf rpm_backup.tar /var/lib/rpm

3.恢复

$ rpm --rebuild
  • 通常,恢复方法有下面三种:
  1. 只移除 /var/lib/rpm/__db* 文件,然后执行 rpm --rebuilddb 命令
  2. 当上面的方法没能恢复数据库时,转移 /var/lib/rpm 文件夹,然后执行 rpm --rebuilddb 命令
  3. 当前面两个方法都没奏效时,则表示情况比较严重,需要重新创建 RPM 数据库,再进行重建数据库操作。
    首先,选择一个目录创建新的数据库,执行 rpm --initdb --dbpath new_db_path;然后,执行重构数据库命令:rpm --rebuilddb

Over~

版权协议须知!

本篇文章来源于 Uambiguous ,如本文章侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意

921 0 2020-12-23


分享:
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif
博主卡片
林里克斯 博主大人
一个致力于Linux的运维平台
运维时间
搭建这个平台,只为分享及记载自己所遇之事和难题。

现在时间 2024-04-28

今日天气
站点统计
  • 文章总数:240篇
  • 分类总数:29个
  • 评论总数:10条
  • 本站总访问量 216726 次

@奥奥

@Wong arrhenius 牛比

@MakerFace 厉害了!