DC's blog DC's blog
首页
  • 计算机基础
  • linux基础
  • mysql
  • git
  • 数据结构与算法
  • axure
  • english
  • docker
  • opp
  • oop
  • 网络并发编程
  • 不基础的py基础
  • 设计模式
  • html
  • css
  • javascript
  • jquery
  • UI
  • 第一次学vue
  • 第二次学vue
  • Django
  • drf
  • drf_re
  • 温故知新
  • flask
  • 前后端不分离

    • BBS
    • 订单系统
    • CRM
  • 前后端部分分离

    • pear-admin-flask
    • pear-admin-django
  • 前后端分离

    • 供应链系统
  • 理论基础
  • py数据分析包
  • 机器学习
  • 深度学习
  • 华中科大的网课
  • cursor
  • deepseek
  • 杂文
  • 罗老师语录
  • 关于我

    • me
  • 分类
  • 归档
GitHub (opens new window)

DC

愿我一生欢喜,不为世俗所及.
首页
  • 计算机基础
  • linux基础
  • mysql
  • git
  • 数据结构与算法
  • axure
  • english
  • docker
  • opp
  • oop
  • 网络并发编程
  • 不基础的py基础
  • 设计模式
  • html
  • css
  • javascript
  • jquery
  • UI
  • 第一次学vue
  • 第二次学vue
  • Django
  • drf
  • drf_re
  • 温故知新
  • flask
  • 前后端不分离

    • BBS
    • 订单系统
    • CRM
  • 前后端部分分离

    • pear-admin-flask
    • pear-admin-django
  • 前后端分离

    • 供应链系统
  • 理论基础
  • py数据分析包
  • 机器学习
  • 深度学习
  • 华中科大的网课
  • cursor
  • deepseek
  • 杂文
  • 罗老师语录
  • 关于我

    • me
  • 分类
  • 归档
GitHub (opens new window)
  • 计算机基础

  • linux基础

    • 准备工作
    • 初识shell与基础常用命令
    • 文件管理之基础命令
    • 文件管理之四大模式
    • 文件管理之命令补充
    • 文件管理之文件系统
    • 权限管理之用户与组
    • 权限管理之文件权限
    • 权限管理之ACL
    • 权限管理之su与sudo
    • 软件包管理之rpm
      • 编程语言
        • 分类
        • 解释器翻译文件
        • 跨平台性
      • 软件包分类
      • 挂载镜像
        • 镜像文件
        • 卸载/解除关联
        • 查看镜像中的rpm包
      • rpm包
        • rpm包格式
        • rpm包获取
      • rpm命令
        • 选项
        • 实验验证
    • 软件包管理之yum
    • 查看进程
    • 管理进程
    • 存储管理之传统磁盘管理
    • 存储管理之LVM
    • 网络管理
    • shell基础
    • crond计划任务
    • 系统优化
  • mysql

  • git

  • 数据结构与算法

  • axure

  • english

  • docker

  • IT_Need
  • linux基础
DC
2022-10-08
目录

软件包管理之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解释器相当于将系统接口进一步进行了封装!
1
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只是一个文件后缀标识,文件命名不加后缀也不影响整个运行结果..
1
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解释器.
1
2
3
4
5
6
7
8
9

# 软件包分类

源码包 --- 定制安装细节                            --- 安装                 rpm已经制作好安装程序        --- 安装 二进制包,下载完毕即可使用,无需安装

源码包的安装很繁琐,因为要解决依赖性的问题..并且在每台机器上都得编译下.
(运维拿到源码包,要将开发人员开发所处的那一套环境重新布置下,即下载各种各样的依赖包,软件才能正常编译成功运行)

解决依赖的本质就是在网上下载软件运行所需要的对应版本的库..
随着软件的迭代完善,所需要的依赖相对是固定的,就可以将源码包进行预编译(即将源码包连同所需的依赖库做成rpm..)
1
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
1
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) 可以
         找到有关使用该设备的进程的有用信息)
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
... ... ...
1
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
1
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
1

格外选项: --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%]
1
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

权限管理之su与sudo
软件包管理之yum

← 权限管理之su与sudo 软件包管理之yum→

最近更新
01
deepseek本地部署+知识库
02-17
02
实操-微信小程序
02-14
03
教学-cursor深度探讨
02-13
更多文章>
Theme by Vdoing | Copyright © 2023-2025 DC | One Piece
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式