rpm
一、说明
RMP 是 LINUX 下的一种软件的可执行程序,你只要安装它就可以了。这种软件安装包通常是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器)。RPM是一种数据库记录的方式来将你所需要的套件安装到你的linux主机的一套管理程序。它记录了安装的包以及包与包之间依赖相关性。RPM包是预先在linux机器上编译好并打包好的文件,安装起来非常快捷。
但是也有缺点,比如安装的环境必须与编译时的环境一致或者相当;包与包之间存在着相互依赖的情况;卸载时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。
二、包命名规则
appname-VERSION-RELEASE.ARCH.rpm
- appname:包名称
- VERSION
- major:主版本号
- minio:次版本号
- release:发行号
- RELEASE:包自身的修订号,有时候还会包含适用于os信息:比如bash-4.3.2-2.centos.x86_64.rpm
- ARCH:适用的平台
- x86:i386,i486,i586,i686
- x86_64,adm64:x86 64bits
- powerpc:ppc
- noarch:跟平台无关
每个 rpm 包的名称都由 "-" 和 "." 分成了若干部分。就拿 a2ps-4.13b-57.2.el5.i386.rpm 这个包来解释一下,a2ps为包名;4.13b则为版本信息;57.2.el5为发布版本号;i386为运行平台。其中运行平台常见的有 i386,i586,i686,x86_64,需要注意的是CPU是分为32位和64位的,i386,i586和i686都为32位平台,x86_64则代表为64位的平台。另外有些rpm包并没有写具体的平台而是noarch,这代表这个rpm包没有硬件平台限制。
例如:alacarte-0.10.0-1.fc6.noarch.rpm。
三、常见命令
语法:
rpm [-acdhilqRsv][-b<完成阶段><套间档>+][-e<套件挡>][-f<文件>+][-i<套件档>][-p<套件档>+][-U<套件档>][-vv][--addsign<套件档>+][--allfiles][--allmatches][--badreloc][--buildroot<根目录>][--changelog][--checksig<套件档>+][--clean][--dbpath<数据库目录>][--dump][--excludedocs][--excludepath<排除目录>][--force][--ftpproxy<主机名称或IP地址>][--ftpport<通信端口>][--help][--httpproxy<主机名称或IP地址>][--httpport<通信端口>][--ignorearch][--ignoreos][--ignoresize][--includedocs][--initdb][justdb][--nobulid][--nodeps][--nofiles][--nogpg][--nomd5][--nopgp][--noorder][--noscripts][--notriggers][--oldpackage][--percent][--pipe<执行指令>][--prefix<目的目录>][--provides][--queryformat<档头格式>][--querytags][--rcfile<配置档>][--rebulid<套件档>][--rebuliddb][--recompile<套件档>][--relocate<原目录>=<新目录>][--replacefiles][--replacepkgs][--requires][--resign<套件档>+][--rmsource][--rmsource<文件>][--root<根目录>][--scripts][--setperms][--setugids][--short-circuit][--sign][--target=<安装平台>+][--test][--timecheck<检查秒数>][--triggeredby<套件档>][--triggers][--verify][--version][--whatprovides<功能特性>][--whatrequires<功能特性>]
命令 | 说明 | 备注 |
-a | 查询所有套件 | |
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+ | 设置包装套件的完成阶段,并指定套件档的文件名称 | |
-c | 只列出组态配置文件,本参数需配合"-l"参数使用 | |
-d | 只列出文本文件,本参数需配合"-l"参数使用 | |
-e<套件档>或--erase<套件档> | 删除指定的套件 | |
-f<文件>+ | 查询拥有指定文件的套件 | |
-h或--hash | 套件安装时列出标记 | |
-i | 显示套件的相关信息 | |
-i<套件档>或--install<套件档> | 安装指定的套件档 | |
-l | 显示套件的文件列表 | |
-p<套件档>+ | 查询指定的RPM套件档 | |
-q | 使用询问模式,当遇到任何问题时,rpm指令会先询问用户 | |
-R | 显示套件的关联性信息 | |
-s | 显示文件状态,本参数需配合"-l"参数使用 | |
-U<套件档>或--upgrade<套件档> | 升级指定的套件档 | |
-v | 显示指令执行过程 | |
-vv | 详细显示指令执行过程,便于排错 | |
-addsign<套件档>+ | 在指定的套件里加上新的签名认证 | |
--allfiles | 安装所有文件 | |
--allmatches | 删除符合指定的套件所包含的文件 | |
--badreloc | 发生错误时,重新配置文件 | |
--buildroot<根目录> | 设置产生套件时,欲当作根目录的目录 | |
--changelog | 显示套件的更改记录 | |
--checksig<套件档>+ | 检验该套件的签名认证 | |
--clean | 完成套件的包装后,删除包装过程中所建立的目录 | |
--dbpath<数据库目录> | 设置欲存放RPM数据库的目录 | |
--dump | 显示每个文件的验证信息。本参数需配合"-l"参数使用 | |
--excludedocs | 安装套件时,不要安装文件 | |
--excludepath<排除目录> | 忽略在指定目录里的所有文件 | |
--force | 强行置换套件或文件 | |
--ftpproxy<主机名称或IP地址> | 指定FTP代理服务器 | |
--ftpport<通信端口> | 设置FTP服务器或代理服务器使用的通信端口 | |
--help | 在线帮助 | |
--httpproxy<主机名称或IP地址> | 指定HTTP代理服务器 | |
--httpport<通信端口> | 设置HTTP服务器或代理服务器使用的通信端口 | |
--ignorearch | 不验证套件档的结构正确性 | |
--ignoreos | 不验证套件档的结构正确性 | |
--ignoresize | 安装前不检查磁盘空间是否足够 | |
--includedocs | 安装套件时,一并安装文件 | |
--initdb | 确认有正确的数据库可以使用 | |
--justdb | 更新数据库,当不变动任何文件 | |
--nobulid | 不执行任何完成阶段 | |
--nodeps | 不验证套件档的相互关联性 | |
--nofiles | 不验证文件的属性 | |
--nogpg | 略过所有GPG的签名认证 | |
--nomd5 | 不使用MD5编码演算确认文件的大小与正确性 | |
--nopgp | 略过所有PGP的签名认证 | |
--noorder | 不重新编排套件的安装顺序,以便满足其彼此间的关联性 | |
--noscripts | 不执行任何安装Script文件 | |
--notriggers | 不执行该套件包装内的任何Script文件 | |
--oldpackage | 升级成旧版本的套件 | |
--percent | 安装套件时显示完成度百分比 | |
--pipe<执行指令> | 建立管道,把输出结果转为该执行指令的输入数据 | |
--prefix<目的目录> | 若重新配置文件,就把文件放到指定的目录下 | |
--provides | 查询该套件所提供的兼容度 | |
--queryformat<档头格式> | 设置档头的表示方式 | |
--querytags | 列出可用于档头格式的标签 | |
--rcfile<配置文件> | 使用指定的配置文件 | |
--rebulid<套件档> | 安装原始代码套件,重新产生二进制文件的套件 | |
--rebuliddb | 以现有的数据库为主,重建一份数据库 | |
--recompile<套件档> | 此参数的效果和指定"--rebulid"参数类似,当不产生套件档 | |
--relocate<原目录>=<新目录> | 把本来会放到原目录下的文件改放到新目录 | |
--replacefiles | 强行置换文件 | |
--replacepkgs | 强行置换套件 | |
--requires | 查询该套件所需要的兼容度 | |
--resing<套件档>+ | 删除现有认证,重新产生签名认证 | |
--rmsource | 完成套件的包装后,删除原始代码 | |
--rmsource<文件> | 删除原始代码和指定的文件 | |
--root<根目录> | 设置欲当作根目录的目录 | |
--scripts | 列出安装套件的Script的变量 | |
--setperms | 设置文件的权限 | |
--setugids | 设置文件的拥有者和所属群组 | |
--short-circuit | 直接略过指定完成阶段的步骤 | |
--sign | 产生PGP或GPG的签名认证 | |
--target=<安装平台>+ | 设置产生的套件的安装平台 | |
--test | 仅作测试,并不真的安装套件 | |
--timecheck<检查秒数> | 设置检查时间的计时秒数 | |
--triggeredby<套件档> | 查询该套件的包装者 | |
--triggers | 展示套件档内的包装Script | |
--verify | 此参数的效果和指定"-q"参数相同 | |
--version | 显示版本信息 | |
--whatprovides<功能特性> | 查询该套件对指定的功能特性所提供的兼容度 | |
--whatrequires<功能特性> | 查询该套件对指定的功能特性所需要的兼容度 |
1、查询
q:query 的简写
(1)查询已安装的软件信息
- rpm -q 准确软件名称:查询某一个已安装软件
可以看到:<软件名称> 这里只要填写到 rpm 包的报名即可,版本啥的可以不用精确到。
- rpm -q --requires PACKAGE_NAME:查询某包所依赖的capabilities
- rpm -q --provides PACKAGE_NAME :查询某包提供的capabilities
- rpm -qa:显示已安装的所有软件列表
- rpm -qi 准确软件名称:查询指定安装软件的详细信息
- rpm -ql 准确软件名称:查看指定的软件包在系统中对应的目录和文件列表
- rpm -qf 目录或文件夹:查看当前指定的文件或目录对应的软件包
- rpm -qc PACKAGE_NAME:查询某包安装后生成的配置文件路径
- 不确定具体名称时可以使用管道和筛选功能:rpm -qa|grep vim
- 统计已安装的软件包总数:rpm -qa|wc -l
(2)查询未安装的软件信息该操作主要是在软件包安装之前进行详细信息的查询,所以传入的参数是一个存在的软件包的路径。
- rpm -qpi 软件包完整路径:查询待安装软件的详细信息
- rpm -qpl 软件包完整路径:查询待安装软件的安装路径
2、验证
V:verify 的简写
(1) 常用命令
- rpm -V 准确软件名称:只有校验失败时才会出现信息
- rpm -Va:扫描验证所有软件包(推荐使用root用户,不会出现权限问题),列出产生变更的项目、欠佳的依赖关系、缺失的关键配置文件等
3、安装
- i: install 的简写
在进行软件安装时,可能系统当中缺少某个依赖,导致无法正常安装,可以使用--force选项进行强制安装,但无法保证安装后能够正常使用。常规的解决办法是先安装需要的依赖软件包,再安装该软件,或者使用yum工具。
- rpm -i [--force] 软件包完整路径:安装一个软件,强制安装为可选项
- rpm -ivh 软件包完整路径:常用命令,安装一个软件,显示详细信息和进度(用#表示)
- v:可视化
- h:显示安装进度
#安装 #rpm ivh /root/test.rpm
这里以 expect-5.45-14.el7_1.x86_64.rpm 为例子
(1) 从网上下载 这个 rpm包
(2) 上传到 linux 服务器 /opt/wf 路径下
(3) 打开连接到 linux服务器的远程 shell上
(4) cd /opt/wf
(5) rpm -ivh expect-5.45-14.el7_1.x86_64.rpm
expect 包依赖 tcl 包,在tcl包没有安装的情况下安装expect 会直接提示检测失败,并告知缺失的依赖包,此时需要先安装依赖的 tcl包。
上图显示安装成功。
通过命令可以看到 expect 的确是安装成功了。
- 安装的副选项
- rpm -ivh --force 软件包完整路径:强制安装
- rpm -ivh --replacepkgs 软件包完整路径:覆盖安装(重新安装并覆盖原有的文件)
- rpm -ivh --replacefiles 软件包完整路径:替换文件安装。如果安装软件包,可是包中部分文件已经存在,那么正常安装时候,会报错“某个文件已经存在”从而导致软件无法安装,使用这个选项可以忽视这个报错,而覆盖安装。
- rpm -ivh --nodeps 软件包完整路径:忽略依赖关系,副作用:安装成功,但未必能够成功运行
- rpm -ivh --test 软件包完整路径:不执行真正的安装过程,而仅报告依赖关系及冲突
- rpm -ivh --prefix 软件包完整路径:为安装软件指定安装路径,而不使用默认安装路径(默认安装路径是软件作者决定的,他觉得安装在什么位置好,才设定的位置)。注意:如果指定了安装路径,软件没有安装到系统默认路径中的话,系统会找不到这些安装的软件,需要进行手工配置才能被系统识别。所以rpm包我们一般都采用默认路径安装。
不指定安装位置的好处:
1)默认安装位置是系统的习惯位置。
2)RPM包管理系统是有卸载命令的。(通过rpm数据库记录软件的安装位置),一条命令卸载,非常方便,并且卸载的很干净。如果你指定了安装目录,则rpm的删除命令就不好用了。
注:源码包安装的时候一定要指定软件的安装位置。
4、升级
-U : 升级
由于在升级时,旧版本的软件可能已经安装,也可能从未安装,针对这种情况,提供了两个参数。
- U表示:如果对应的软件包原来未安装,则直接安装,和i的效果相同
- F表示:如果对应的软件包原来未安装,则放弃安装
- rpm -U/F 软件包完整路径:升级一个软件
- rpm -U|Fvh 软件包完整路径:可视化并展现升级进度
副命令:
- --test
- --nodeps
- --force
- --oldpackage:降级到旧版本;
5、卸载
软件包的卸载需要使用root用户来执行,必须完整提供卸载软件包的名称,可以先通过筛选查询获取。
- e:erase的简写(擦除)
在进行卸载操作时,可能有其他软件依赖于此软件,卸载后可能会导致其他软件不可用,如果存在依赖关系,则会显示依赖信息,如果执意要删除,可以使用忽略依赖的选项:--nodeps。
- rpm -e [--nodeps] 准确软件名称:卸载一个已安装软件,忽略依赖为可选项
- rpm -evh 软件包名称:可视化并展示卸载进度
副命令:
--nodeps:忽略依赖关系;
--test: 测试卸载;dry-run模式;
--allmatches: 如果一个程序包同时安装多个版本,则此选项一次全部卸载之;
注意:如果程序包的配置文件安装后曾被修改,卸载时,此文件通常不会被删除,而是被重命名(加后缀.rpmsave)后留存;
6、维护
(1)RPM数据库维护如果本机的RPM数据库损坏,可能会导致无法正确的读取依赖关系,致使无法正常执行rpm相关功能,此时可以使用--initdb选项。
rpm --initdb
参考:
https://www.cnblogs.com/yhoralce/p/8325110.html
http://www.manongjc.com/detail/16-ncbycuuleqczfnm.html
https://www.oh100.com/kaoshi/caozuoxitong/554541.html
https://blog.51cto.com/xinzong/1714729
https://www.runoob.com/linux/linux-comm-rpm.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~