开发者学堂课程【Linux 软件包安装和 yum 仓库实战:RPM 包管理 - 2】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/590/detail/8336
RPM 包管理 - 2
内容介绍:
一、包升级
二、升级注意事项
三、包查询
四、包校验
一、包升级
升级:
1.rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
2.rpm {-Fl--freshen} [install-options] PACKAGE_FILE...
3.upgrade: 安装有旧版程序包,则“升级”
如果不存在旧版程序包,则“安装”
4.freshen:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则不执行升级操作
5.rpm- Uvh PACKAGE FILE ...
rpm- Fvh PACKAGE FILE ...
6.--oldpackage: 降级
7.--force: 强制安装
二、升级注意事项
注意:
(1)不要对内核做升级操作;Linux 支持多内核版本并存,因此,对直接安装新版本内核。
比如说安装了较老版本 centos 6.9 版本,内核包为 2.6.32,现在有一个 centos 6.10 版本,内核包同样为 2.6.32 ,两个版本编译次数不同,现在要把 centos 6.10版本也安装进来,先挂上光盘,将安装光盘由 6.9 改为 6.10。
查看当前安装的内核版本可以用 # rpm
–
q kernel
命令,一开始的版本为 696,挂上光盘后为 754,使用 # rpm –
ivh
命令安装可以做到多版本共存,前提是可以并存。
安装内核包会显示要先安装固件包 firmware ,安装固件包之后,又会出现矛盾问题,是因为两个包的个别文件会出现一样的名字导致冲突,把冲突的文件删除之后就会解决。这时再使用 # rpm –q kernel
命令,会发现两个版本并存,boot 一下会发现所有文件都出现两个形式。
版本并存之后,当启动时就可以选择用那个版本的内核包即操作系统操作。
重新启动后,可以使用 # uname
–
r
命令查看当前使用的操作系统。如果新内核不好用,则可以重启应用再回到旧内核。卸载内核的命令为 # rpm
–
e kernel+
版本号。
再使用 # rpm –q kernel
命令,会发现新版本已卸载。
运维追求稳定,开发人员追求新颖。
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名 (FILENAME.rpmnew) 后保留。
二进制文件覆盖,配置文件不覆盖,因为配置文件相当于数据类。
三、包查询
1.rpm {-ql--query} [select-options] [query-options]
可以用来查询,后面跟上某个你要检查的包,比如说 rpm –q+包名可以查询系统中是否安装了某个包,包名必须完整,不可缺漏。如果包名忘记,可以加上 a 选项,即 rpm –qa 命令可以列出所有的包,这样就可以查询包。
rpm –qa “tre*” 为 tre 开头的包,rpm –qa “*tre*” 为包含 tre 的包。
Rpm –ql tree 为列出某个包里包含的文件列表,为一堆文件的集合,是在数据库里查询。
当然许多包里不仅有文件,还有许多脚本,使用 rpm –q –scripts+包名 就可以列出包里包含的脚本。
2.[
select-options]
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成
-p rpmfile: 针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY:查询指定的 CAPABILITY 由哪个包所提供
--whatrequires CAPABILITY:查询指定的 CAPABILITY 被哪个包所依赖
每装一个包都会在硬盘上产生磁盘文件,现在想要查询一个磁盘文件来自于哪个包,使用 # rpm
–
qf /usr/bin/tree
就可以查询某个文件来自于哪个包,就算包没了仍然可以查询到文件来自哪个包,是由于有数据库作为基础。
如果包里的文件丢失,可以使用解包来查找文件。先 copy 包,再解包。解包后还要再验证文件,因为有可能造成包的属性改变。
如果一个包还未装,现在想安装,安装之前就想查询这个包里包含哪些文件,就可以使用 # rpm –qpl+文件名 查询。
Whatprovides 翻译为提供,CAPABILITY 为能力,使用 whatprovides 就可以查询到是哪个包提供了这个功能。
Whatrequires 翻译为依赖,使用 whatrequires 就可以查询这个能力是被哪个包所依赖的。
3.rpm2cpio 包文件 |cpio-itv 预览包内文件
4.rpm2cpio 包文件 |cpio-id "*.conf" 释放包内文件
5.[query-options]
--changelog: 查询 rpm 包的 changelog
-C: 查询程序的配置文件
-d: 查询程序的文档
-i: information
-l: 查看指定的程序包安装后生成的所有文件
--scripts: 程序包自带的脚本
--provides: 列出指定程序包所提供的 CAPABILITY
-R: 查询指定的程序包所依赖的 CAPABILITY
Rpm –qc bash 就可以查询 bash 这个包里所包含的配置文件。
rpm –qd bash 为挑选 bash 包里特定的文件列表来显示,
rpm –qi bash 为查询这个包里的描述信息,I 为 information 为信息,比如作者,书名,安装时间等等。
6.常用查询用法:
-qi PACKAGE,-qf FILE,-qc PACKAGE,-ql PACKAGE,-qd PACKAGE
-qpi PACKAGE_FILE,-qpl PACKAGE_FILE,...
-qa
使用 –qi 查询的前提是包已经装上了,而且后面跟的是文件名,不是包名。
当包还没安装,想要查询文件信息就是用 -qpi 指令查询,去查询包的名称,属性,作者等。
7.包卸载:
rpm{-el--erase}[--allmatches][--nodeps][--noscripts][--notriggers][--test] PACKAGE_NAME...
如果 p1 依赖于 p2,安装顺序为先 p2 后 p1,卸载顺序为先 p1 后 p2。
--nodeps 为忽略依赖,强行卸载,强制去除依赖性。卸载后使用 boot 查询内核中的文件,发现没有了,但是还可以正常使用,但是重启 reboot 后就不能用了,内核出现故障。
四、包校验
1、rpm {-Vl--verify} [select-options] [verify-options]
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
包安装之后的每个属性都会详细的存储在数据库里面,使用 # ll /var/lib/rpm/
查询包里的属性,其中包括 S file Size differs 包里每个文件的大小,M Mode differs 权限,5 digest 摘要,D Device major 设备编号,L readLink 连接处,各方面的能力等等。使用 rpm –v 这个命令就可以查询。
2、包来源合法性验正及完整性验证
完整性验证:SHA256
来源合法性验证:RSA
验证拿到的 rpm 包是否适合厂商发布的内容一致,查询内容是否被人修改。
3、公钥加密
对称加密:加密、解密使用同一密钥
非对称加密:密钥是成对儿的
public key: 公钥,公开所有人
secret key: 私钥,不能公开
4、导入所需要公钥
rpm-K丨checksig rpmfile
检查包的完整性和签名
rpm--import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7 发行版光盘提供:RPM-GPG-KEY-CentOS-7
rpm-qa "gpg-pubkey*"
如果在互联网拿到一个包,想知道这个包是否被黑客修改过,就可以使用 K 来检查包的完整性。