软件包管理之rpm
# 编程语言
编程语言: 人类与计算机沟通以此控制计算机的语言..
# 分类
控制电路(逻辑电路) - 机器语言(一堆二进制指令) - 汇编语言(将一串串二进制数对应成英文单词) - 高级语言
机器语言跟汇编语言相当于直接控制硬件;
汇编语言只不过解决了机器语言难记的问题,复杂度还是没变的.
高级语言需要翻译后才能让计算机理解,根据翻译的方式不同,分为两类:
1> 解释型(解释器作为翻译工具): shell、python
2> 编译型(编译器作为翻译工具): c、go
!!最核心的区别在于第二次的执行,第二次执行时,解释型语言是离不开解释器的,每次执行都需要解释器进行翻译;
而编译型语言经过一次翻译,将软件程序编译成一堆可直接被计算机识别的二进制指令..
再次执行时,拿着这堆可执行指令直接运行..不需要再次翻译.
So,狭隘的不成体系的单从语言层次分析,性能方面编译型>解释型..
Q: 用解释型语言(python)or编译型语言(c)写好的软件如何在linux上运行?
A: 下载软件包
1> 对于用python写的软件而言:
在linux主机上安装对应版本的python解释器以及软件相关依赖
<每次执行都需要python解释器执行>
2> 对于用c语言写好的软件而言:
在linux主机上安装对应版本的c编译器以及软件相关依赖
用编译器把源码包编译成可执行的命令
<第一次用编译器编译后,往后的多次执行就使用编译后的命令即可>
Ps: python语言主流的Cpython解释器是用c语言写的; bash解释器绝大部分也都是c语言写的.
c语言是直接调用系统接口的,用c写的Cpython解释器和bash解释器相当于将系统接口进一步进行了封装!
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 解释器翻译文件
Q: 在shell解释器交互性环境下(默认是bash),输入 echo "hello" 发生了什么?
A: 首先,会将此命令交给shell解释器,shell解释器再调用系统接口,系统接口在调用内核,OS内核进而操作对应的硬件.
""" -- a.sh --
echo "111"
echo "222"
echo "333"
"""
## 运行了两个程序 一个是bash;另一个是a.sh
[root@localhost opt]# bash a.sh
111
222
""" -- b.py --
print("Hello")
print("World")
"""
[root@localhost opt]# python b.py
Hello
world
## bash、python 都是解释器
## 注意: .sh .py只是一个文件后缀标识,文件命名不加后缀也不影响整个运行结果..
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 跨平台性
我们假设开发人员用c在windows(x86-32位的cpu)平台上开发了一个软件,开发完成后连同软件相关的依赖进行编译,将编译后的二进制包直接给了运维人员,但是运维人员部署的环境是x86-64位的linux系统..
因为在window系统的机器上把源代码进行编译后的生成的二进制指令只适用于window平台.. 所以跨平台部署失败.
因而用编译型语言开发的软件通常是给运维一个源码包,运维再根据自己所处的平台环境下载相关的软件依赖进行编译..
不同平台有对应版本的解释器,所以解释型的跨平台性强
c不支持跨平台编译
go语言,支持跨平台编译.. 交叉编译??指定平台编译?
python的跨平台性好,是因为官方在多个平台都开发了适应当前平台的多个版本的python解释器.
2
3
4
5
6
7
8
9
# 软件包分类
源码包 --- 定制安装细节 --- 安装 rpm已经制作好安装程序 --- 安装 二进制包,下载完毕即可使用,无需安装
源码包的安装很繁琐,因为要解决依赖性的问题..并且在每台机器上都得编译下.
(运维拿到源码包,要将开发人员开发所处的那一套环境重新布置下,即下载各种各样的依赖包,软件才能正常编译成功运行)
解决依赖的本质就是在网上下载软件运行所需要的对应版本的库..
随着软件的迭代完善,所需要的依赖相对是固定的,就可以将源码包进行预编译(即将源码包连同所需的依赖库做成rpm..)
2
3
4
5
分类 | 安装 | 特点 |
---|---|---|
rpm包 | 预先编译 打包,安装简单 | 通常软件的稳定版本会被官方做成rpm,所以软件版本偏低 |
源码包 | 在自己平台手动编译打包,安装繁琐 | 软件版本丰富,可选择性强 |
二进制包 | 解压即可使用,安装简单 | 不能修改源代码 |
# 挂载镜像
之所以要挂载镜像,是因为我们想要使用安装OS的镜像文件里面包含的一堆rpm包...
在前面安装时,我们将这镜像放到光驱光盘/dev/sr0
里的.
# 镜像文件
要想查看使用镜像光盘里的内容,需要先将光盘进行挂载处理,让它变成一个可用设备.
## CentOS-7-x86_64-DVD-2009.iso
"""
!!vm虚拟机光驱里关联一个镜像,相当于在真机的光驱里插入了一个光盘!!
若实验用的是vm,要看使用的是哪个光驱,因为vm可以添加多个CD/DVD.. sr0 sr1..
1> `mount /dev/sr0 /opt/`
2> `mount /dev/cdrom /opt/` 因为软链接
lrwxrwxrwx 1 root root 3 8月 9 19:56 /dev/cdrom -> sr0
3> 若没有光驱光盘或者U盘启动盘,就不能以光盘挂载的方式进行挂载..
解决方案:将镜像文件放到本地硬盘里后 `mount -o loop 镜像文件的路径 /opt`
Ps:让服务器本地硬盘里有一个镜像文件的两种方式 即如何得到镜像文件
1> 其它机器上有个现成的镜像文件,用u盘拷贝过来或者xshell上传过了皆可
2> 若有光驱,还可以使用dd命令,将光盘里iso镜像文件的内容输出到服务器本地某一个文件中..
`dd if=输入文件路径 of=输出文件路径` 相对于将输入文件内容读取到了输出文件中..
`dd if=/dev/sr0 of=/root/centos7.iso`
注意!一定要考虑输出文件路径所处的挂载点对应的挂载设备/硬盘剩余的空间是否充足.. `df -h`查看
比如,镜像文件4.3G、/root/centos7.iso的挂载点是/ 对应的文件系统只剩3.2G,则只会写入镜像3.2G内容
解决方案:加一块硬盘 详情请看 文件管理之文件系统中软链接解决磁盘满这一部分内容..
解决硬盘空间不够的问题后,dd命令成功后..执行命令..
`mount -o loop /root/centos7.iso /mnt`
/opt -- 光盘里的内容 挂载的是光盘
/mnt -- 镜像文件的内容 挂载的是镜像文件
因为光盘里放着的就是镜像文件,所以都一样..
"""
[root@localhost opt]# mount /dev/sr0 /opt/
mount: /dev/sr0 写保护,将以只读方式挂载
## 可用df命令可对挂载状态进行查看
[root@localhost ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
... ... ... ... ... ...
tmpfs 99564 0 99564 0% /run/user/1000
/dev/sr0 4600876 4600876 0 100% /opt
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 卸载/解除关联
"""
umount /dev/sr0 指定挂载源设备进行卸载
umount /opt 指定挂载点进行卸载
这里是因为正在使用,所以卸载解除不了.. 类似于windows下卸载打开的文件夹卸载不了..
解决方案: 切换到其它目录下; `umount -l /opt`强制卸载
"""
[root@localhost ~]# cd /opt/
[root@localhost opt]# umount /opt
umount: /opt:目标忙。
(有些情况下通过 lsof(8) 或 fuser(1) 可以
找到有关使用该设备的进程的有用信息)
[root@localhost opt]# umount /dev/sr0
umount: /opt:目标忙。
(有些情况下通过 lsof(8) 或 fuser(1) 可以
找到有关使用该设备的进程的有用信息)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看镜像中的rpm包
[root@localhost opt]# ls /opt/
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL
[root@localhost opt]# ls /opt/Packages/
389-ds-base-1.3.10.2-6.el7.x86_64.rpm
389-ds-base-libs-1.3.10.2-6.el7.x86_64.rpm
abattis-cantarell-fonts-0.0.25-1.el7.noarch.rpm
... ... ...
2
3
4
5
6
7
8
9
# rpm包
RPM 是Red-Hat Package Manager(RPM软件包管理器)的缩写
通常软件的稳定版会被官方做成rpm, 所以软件版本偏低在主流的linux系统上, 多数软件的安装、升级、移除以及维护工作都是使用RPM软件包管理程序来完成的.
rpm命令 和 yum命令 都可以管理rpm格式的软件包!!!
# rpm包格式
以 mysql-connector-odbc-5.2.5-8.el7.x86_64.rpm 为例:
软件包名: mysql-connector-odbc
版本号Version: 5(大版本号大改).2(小版本号往往加几个小功能).5(修订版本改bug)
发布次数: 8
适用的操作系统版本: .el7 这里是指企业级的linux的第7个版本,即对应centos7或redhot7
有的会明确写成el7.centos
硬件平台: .x86_64 这里是指适用于x86架构64位的cpu
也有可能遇到 noarch 代表适用于不同版本的cpu
后缀: .rpm
[root@localhost opt]# uname -m
x86_64
[root@localhost opt]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost opt]# uname -a
Linux localhost.localdomain 3.10.0-1160.66.1.el7.x86_64 #1 SMP Wed May 18 16:02:34 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost opt]# uname -r
3.10.0-1160.66.1.el7.x86_64
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# rpm包获取
1> 从网络上下载RPM包
2> ISO镜像光盘里有rpm包
# rpm命令
# 选项
安装: rpm -ivh <RPM包名>
卸载: rpm -e <RPM包名>
若该软件包被其它软件包所依赖,是不允许卸载的..
升级: rpm -Uvh <RPM包名>
本质就是卸了低版本的,安装高版本的..
查询: rpm -qa
-- 查询系统中所有已安装的RPM软件包 因为已经安装,所以没有.rpm后缀
rpm -qa | grep <RPM包名>
or rpm -q <RPM包名>
-- 查询系统中是否安装某一RPM软件包
rpm -qi <RPM包名>
-- 查询系统中某个已安装的rpm包的描述信息
rpm -ql <RPM包名>
-- 查询系统中某个已安装的rpm包产生的所有文件
rpm包相当于一种定制好的安装程序,安装在哪,安装什么都已经设置好啦,-ql看看安装了哪些东西
rpm -qc <RPM包名>
-- 查询系统中某个已安装的rpm包里所有配置文件
不是所有软件包都有配置文件的
rpm -qd <RPM包名>
-- 查询某个已安装的rpm包产生了哪些帮助文档
注意哦! 加上个选项p -qip
-qlp
-qcp
-qdp
可以查看未安装的rpm包对应的信息
rpm -qf 文件路径
-- 查询系统中某个文件归属于哪个软件包
rpm -qf `which yum` # -- 将反引号中命令的结果给 rpm -qf
格外选项: --nomd5
不检验软件包的签名
--nodeps
安装和卸载时可能会提示依赖问题..可在命令最后添加此选项忽略依赖,直接卸载安装,后果自负..
敲黑板!解决依赖后再安装或卸载!!!!! 但rpm命令的弊端在于很难分辨依赖,有时不会很明确的告诉你依赖哪个包,可能只会提示依赖哪个文件..只能靠猜!靠谷歌..rpm解决依赖问题很繁琐..
--force
若低版本的软件包的存在,安装高版本的软件包时会提示冲突.
在安装命令最后添加此选项.. 可忽略冲突,强制安装高版本软件包..
这样操作会导致高低版本的软件包共存.. 不推荐这样做!!!! 使用Uvh升级安装是正解.
Ps: 若安装过程中报错: curl: (60) Peer's Certificate has expired
. 将系统时间修改正确,然后再安装即可.
# 实验验证
▲ 安装
"""
-i 安装
-v 列出详细信息
-h 软件包安装的时候列出哈希标记
"""
[root@localhost ~]# rpm -ivh /opt/Packages/httpd-2.4.6-95.el7.centos.x86_64.rpm
错误:依赖检测失败:
/etc/mime.types 被 httpd-2.4.6-95.el7.centos.x86_64 需要
httpd-tools = 2.4.6-95.el7.centos 被 httpd-2.4.6-95.el7.centos.x86_64 需要 ## 只提示了所需文件
libapr-1.so.0()(64bit) 被 httpd-2.4.6-95.el7.centos.x86_64 需要
libaprutil-1.so.0()(64bit) 被 httpd-2.4.6-95.el7.centos.x86_64 需要
[root@localhost ~]# rpm -ivh /opt/Packages/dos2unix-6.0.3-7.el7.x86_64.rpm
准备中... ################################# [100%]
软件包 dos2unix-6.0.3-7.el7.x86_64 已经安装
▲ 查询
[root@localhost ~]# rpm -q dos2uni
未安装软件包 dos2uni
[root@localhost ~]# rpm -q dos2unix
dos2unix-6.0.3-7.el7.x86_64
[root@localhost ~]# rpm -qa | grep dos2unix
dos2unix-6.0.3-7.el7.x86_64
[root@localhost ~]# rpm -qi dos2unix
Name : dos2unix
Version : 6.0.3
Release : 7.el7
... ... ...
[root@localhost ~]# rpm -ql dos2unix
/usr/bin/dos2unix
/usr/bin/mac2unix
/usr/bin/unix2dos
... ... ...
[root@localhost ~]# rpm -qc yum
/etc/logrotate.d/yum
/etc/yum.conf
/etc/yum/version-groups.conf
[root@localhost ~]# which rpm
/usr/bin/rpm
[root@localhost ~]# rpm -qf /usr/bin/rpm
rpm-4.11.3-48.el7_9.x86_64
[root@localhost ~]# rpm -qd dos2unix
/usr/share/doc/dos2unix-6.0.3/COPYING.txt
/usr/share/doc/dos2unix-6.0.3/ChangeLog.txt
/usr/share/doc/dos2unix-6.0.3/NEWS.txt
/usr/share/doc/dos2unix-6.0.3/README.txt
... ... ...
▲ 升级
"""
使用wget命令下载一个低版本、一个高版本
`wget https://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.9-1.el7.x86_64.rpm`
`wget https://mirrors.aliyun.com/zabbix/zabbix/4.2/rhel/7/x86_64/zabbix-agent-4.2.0-1.el7.x86_64.rpm`
先安装低版本的,再安装高版本的
"""
[root@localhost ~]# ls | grep zabbix
zabbix-agent-3.0.9-1.el7.x86_64.rpm
zabbix-agent-4.2.0-1.el7.x86_64.rpm
[root@localhost ~]# rpm -ivh zabbix-agent-3.0.9-1.el7.x86_64.rpm
警告:zabbix-agent-3.0.9-1.el7.x86_64.rpm: 头V4 DSA/SHA1 Signature, 密钥 ID 79ea5ed4: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zabbix-agent-3.0.9-1.el7 ################################# [100%]
[root@localhost ~]# rpm -q zabbix
未安装软件包 zabbix
[root@localhost ~]# rpm -q zabbix-agent
zabbix-agent-3.0.9-1.el7.x86_64
## 因为低版本的存在 不让我们安装高版本的 冲突了.
[root@localhost ~]# rpm -ivh zabbix-agent-4.2.0-1.el7.x86_64.rpm
警告:zabbix-agent-4.2.0-1.el7.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID a14fe591: NOKEY
准备中... ################################# [100%]
... ... ...
file /usr/share/man/man8/zabbix_agentd.8.gz from install of zabbix-agent-4.2.0-1.el7.x86_64 conflicts with file from package zabbix-agent-3.0.9-1.el7.x86_64
"""
解决方案:
1> 卸载低版本的软件包后,再安装高版本的
2> 在安装高版本时,在命令最后添加选项--force 不推荐这样做.. 会导致高低版本共存.
3> 正解 -- 使用选项-Uvh 升级安装
"""
[root@localhost ~]# rpm -Uvh zabbix-agent-4.2.0-1.el7.x86_64.rpm
警告:zabbix-agent-4.2.0-1.el7.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID a14fe591: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:zabbix-agent-4.2.0-1.el7 ################################# [ 50%]
正在清理/删除...
2:zabbix-agent-3.0.9-1.el7 ################################# [100%]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89