软件的运行和编译

一、软件相关概念

1.1 ABI

ABI(Application Binary Interface): 应用程序二进制接口。每个操作系统都会为运行在该系统下的应用程序提供应用程序二进制接口。ABI包含了应用程序在这个系统下运行时必须遵守的编程约定。

Windows与Linux之间不兼容:

  • ELF(Executable and Linkable Format)Linux
  • PE(Portable Executable)Windows

1.2 API

应用程序接口(Application Programming Interface,API),又称为应用编程接口,就是软件系统不同组成部分衔接的约定。API可以在各种不同的操作系统上实现给应用程序提供完全相同的接口,而它们本身在这些系统上的实现却可能不同。以主流的操作系统Windows和Linux为例,API分为 Windows API 和 Linux API。在Windows上开发出来的软件无法在Linux上运行,在Linux上开发出的软件也无法在Windows上运行。为了解决不同操作系统之间软件移植的困难,POSIX标准开始诞生。

可移植操作系统接口(Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。

1.3 C语言程序实现过程

C源程序 –> 预处理(Preprocessing) –> 编译(Compilation) –> 汇编(Assemble) –> 链接(Linking) –> 生成可执行文件

image-20221025172412863

示例:GCC编译过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@Rocky8-mini mnt]#cat test.c 
#include <stdio.h>
int main(){
printf("Hello,world!\n");
return 0;
}

# 对test.c文件进行预处理,生成test.i文件
[root@Rocky8-mini mnt]#gcc -E test.c -o test.i
# 对预处理文件进行编译,生成了汇编文件
[root@Rocky8-mini mnt]#gcc -S test.i -o test.s
# 对汇编文件进行编译,生成了目标文件
[root@Rocky8-mini mnt]#gcc -c test.s -o test.o
# 对目标文件进行链接,生成可执行文件
[root@Rocky8-mini mnt]#gcc test.o -o test
[root@Rocky8-mini mnt]#ls
hgfs test test.c test.i test.o test.s

[root@Rocky8-mini mnt]#./test
Hello,world!

# 一步编译链接生成可执行文件
gcc test.c -o test

1.4 软件模块的静态和动态链接

链接的作用是将各个模块之间的相互引用的部分处理好,使得各个模块之间能够正确的衔接,分为静态链接和动态链接。

静态链接

  • 将程序所对应的依赖包复制一份到包中
  • 占用空间多,但程序迁移容易
  • 程序升级困难,需要重新进行链接

动态链接

  • 程序所依赖的库做动态的链接指向
  • 占用空间少,升级方便

模块(库)文件

查看二进制程序所依赖的库文件

1
2
3
4
5
6
ldd /PATH/TO/BINARY_FILE

[root@Rocky8-mini mnt]#ldd /usr/bin/cat
linux-vdso.so.1 (0x00007ffe593e4000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd84f383000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd84f951000)

管理查看本机装载的库文件

1
2
3
4
5
# 加载配置文件中指定的库文件
ldconfig

# 显示本机已经缓存的所有可用库文件名及文件路径映射关系
/sbin/ldconfig –p

配置文件

1
2
/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf

缓存文件

1
/etc/ld.so.cache

软件包和包管理器

一、软件包基础知识

1.1 软件包介绍

最初开源软件只提供打包压缩后的源码文件,用户必须自己编译在Linux上运行的软件。当Debian诞生时,出现了dpkg的包管理工具,用来管理deb后缀的软件包文件。之后红帽开发出自己的rpm包管理工具。

示例:使用光盘自动挂载

1
2
3
4
5
6
# Rocky Linux
[root@Rocky8-mini ~]#rpm -q autofs || yum -y install autofs
[root@Rocky8-mini ~]#systemctl enable --now autofs.service
[root@Rocky8-mini ~]#cd /misc/cd
[root@Rocky8-mini cd]#ls
AppStream BaseOS EFI images isolinux LICENSE media.repo TRANS.TBL

1.2 软件包中的文件分类

​ 二进制文件、库文件、配置文件、帮助文件

示例:利用cpio工具查看包文件列表

1
rpm2cpio 包文件 | cpio –itv    预览包内文件

1.3 软件包管理器

软件包管理器的功能:

​ 将编译好的应用程序的组成文件打包成一个或多多个程序包文件,利用包管理器可以方便地实现程序包的安装、卸载、查询、升级和校验等管理操作。

主流的包管理器

  • Redhat:rpm文件,rpm包管理器
  • Debian:deb文件,dpkg包管理器

1.4 包命名

源代码打包文件命名:

1
2
name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release

rpm包命名方式:

1
2
3
4
5
6
7
8
9
name-VERSION-release.arch.rpm
VERSION: major.minor.release
release: release.OS

常见的arch
x86: i386,i486,i586,i686
x86_64: x64,x86_64,amd64
powerpc: ppc
与平台无关: noarch

1.5 分类和拆包

软件包为了管理和使用的便利,会将一个大的软件分类,放在不同的子包中。

包的分类

  • Application-VERSION-ARCH.rpm 主包
  • Application-devel-VERSION-ARCH.rpm 开发子包
  • Application-utils-VERSION-ARCH.rpm 其他子包
  • Application-libs-VERSION-ARCH.rpm 其他子包

1.6 包的依赖

​ 软件包之间可能存在依赖关系,甚至循环依赖,即:A包依赖B包,B包依赖C包,C包依赖A包。安装软件包时,会因为缺少依赖的包,而导致安装包失败。

解决包之间依赖的管理工具:

  • yum:rpm包管理器的前端工具
  • dnf:Fedora 18+ 及 Centos 8
  • apt:deb包管理器的前端工具
  • zypper:suse上的rpm前端管理工具

1.7 程序包管理器相关文件

1、包文件组成(每个包独有)

  • 包内的文件
  • 元数据,如:包的名称,版本,依赖性,描述等
  • 可能会有包安装或卸载时运行时的脚本

2、数据库(公共):/var/lib/rpm

  • 程序包名称及版本
  • 依赖关系
  • 功能说明
  • 包安装后生成的各文件路径及校验码信息

1.8 获取程序包的路径

  • 系统发版的光盘或官方网站
  • 第三方组织提供
  • 软件项目官方站点
  • 搜索引擎
  • 自己制作

rpm 包管理器

RockyLinux 上使用rpm命令管理程序包

功能:

​ 安装、卸载、升级、查询、校验、数据库维护

一、安装

格式:

1
rpm {-i|--install} [install-options] PACKAGE_FILE...

选项:

1
2
-v: verbose
-h: 以#来显示程序包管理执行进度

rpm包安装[install-options]

1
2
3
4
5
6
7
8
9
10
--test: 测试安装,不真正执行安装
--nodeps: 忽略依赖关系
--replacepkgs
--nosignature: 不检查来源合法性
--nodigest: 不检查包完整性
--noscripts: 不执行程序包脚本
%pre: 安装前脚本 --nopre
%post: 安装后脚本 --nopost
%preun: 卸载前脚本 --nopreun
%postun: 卸载后脚本 --nopostun

二、升级和降级

rpm包的升级和降级

1
2
3
4
5
6
7
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”
freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作

--oldpackage:降级
--force:强制安装

注意:

(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

三、包查询

格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rpm {-q|--query} [select-options] [query-options]

[select-options]
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成
-p rpmfile: 针对尚未安装的程序包文件做查询操作

[query-options]
--changelog: 查询rpm包的changelog
-c: 查询程序的配置文件
-d: 查询程序的文档
-i: information
-l: 查看指定的程序包安装后生成的所有文件
--scripts: 程序包自带的脚本

# 和CAPABILITY相关
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
--provides:列出指定程序包所提供的CAPABILITY
-R:查询指定的程序包所依赖的CAPABILITY

四、包卸载

格式

1
rpm {-e|--erase} [--allmatchers] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME

注:当包卸载时,对应的配置文件不会删除,以FILENAME.rpmsave形式保留

五、包校验

在安装包时,系统会检查包的来源是否是合法的

检查包的完整性和签名

1
rpm -K|--checksig RPMFILE

在检查包的来源和完整性前,必须导入所需要公钥

1
2
3
4
[root@centos7 ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@Rocky8-mini ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

rpm -qa "gpg-pubkey*"

示例

1
2
3
4
5
6
# 公钥已导入
[root@Rocky8-mini ~]#rpm -K /misc/cd/AppStream/Packages/h/httpd-2.4.37-41.module+el8.5.0+695+1fa8055e.x86_64.rpm
/misc/cd/AppStream/Packages/h/httpd-2.4.37-41.module+el8.5.0+695+1fa8055e.x86_64.rpm: digests signatures OK
[root@Rocky8-mini ~]#rpm -qa "gpg-pubkey*"
gpg-pubkey-2f86d6a1-5cf7cefb
gpg-pubkey-6d745a60-60287f36

软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录至rpm相关的数据库中,可以用来检查包中的文件是否和当初安装时有所变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
rpm {-V|--verify} [select-options] [verify-options]

[root@Rocky8-mini ~]#rpm -V rocky-release
.......T. c /etc/issue

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
. (点) 表示当前位置代表的字符含义一致
c 所在的位置表示文件类型
c 配置文件
d 文件数据文件
g 该文件不属于某个文件(少数情况)
l 许可证文件(license file)
r 自述文件(READ ME)

六、数据库维护

rpm包安装时生成的信息,都放在rpm数据库中

1
2
3
4
5
/var/lib/rpm

rpm {--initdb|--rebuilddb}
initdb: 初始化,如果事先不存在数据库,则新建之,否则,不执行任何操作
rebuilddb: 重建已安装的包头的数据库索引目录

yum 和 dnf

RockyLinux 使用 yum, dnf 解决rpm包依赖关系

YUM,rpm的前端程序,解决软件包相关依赖性,Rocky8使用dnf代替了yum,不过保留了和yum的兼容性,配置通用

一、yum/dnf 工作原理

yum/dnf 是基于C/S模式

  • yum 服务器存放rpm包和包相关的元数据库
  • yum 客户端访问yum服务器进行安装或查询等

二、yum客户端配置

yum 客户端配置文件

1
2
/etc/yum.conf            #为所有仓库提供公共配置
/etc/yum.repos.d/*.repo #为每个仓库的提供配置文件

repo 仓库主要配置文件解析

1
2
3
4
5
6
[repositoryID]
name= # 仓库名
baseurl=URL # 仓库服务器地址
enabled={1|0} # 是否启用
gpgcheck={1|0} # 是否进行包校验
gpgkey=URL # 进行包校验的地址

yum 服务器的baseurl形式

1
2
3
4
5
6
file://          本地路径
http://
https://
ftp://

# yum 仓库指向的路径一定必须是repodata目录所在的目录

相关变量

1
2
3
4
# yum的repo配置文件中可用的变量
$releasever: 当前OS的发行版的主版本号,如:8,7,6
$arch: CPU架构,如:aarch64, i586, i686,x86_64等
$basearch:系统基础平台;i386, x86_64

示例:RockyLinux8 配置国内源文件

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
[root@Rocky8-mini ~]#cat /etc/yum.repos.d/yum.repo 
[BaseOS]
name=BaseOS
baseurl=https://mirrors.ustc.edu.cn/rocky/$releasever/BaseOS/$basearch/os/
https://mirrors.163.com/rocky/$releasever/BaseOS/$basearch/os/
https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/
gpgcheck=0
enabled=1

[AppStream]
name=AppStream
baseurl=https://mirrors.ustc.edu.cn/rocky/$releasever/AppStream/$basearch/os/
https://mirrors.163.com/rocky/$releasever/AppStream/$basearch/os/
https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/$basearch/os/
gpgcheck=0
enabled=1

[epel]
name=epel
baseurl=https://mirrors.ustc.edu.cn/epel/$releasever/Everything/$basearch/
https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch/
https://mirrors.cloud.tencent.com/epel/$releasever/Everything/$basearch/
gpgcheck=1
gpgkey=https://mirrors.ustc.edu.cn/epel/RPM-GPG-KEY-EPEL-8
https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
https://mirrors.cloud.tencent.com/epel/RPM-GPG-KEY-EPEL-8
enabled=1

[extras]
name=extras
baseurl=https://mirrors.ustc.edu.cn/rocky/$releasever/extras/$basearch/os/
gpgcheck=0
enabled=1

示例:CentOS7 配置国内源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@centos7 ~]#cat /etc/yum.repos.d/yum.repo
[Base]
name=Base
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/
https://mirrors.aliyun.com/centos/7/os/x86_64/
gpgcheck=0
enabled=1

[epel]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
https://mirrors.aliyun.com/epel/7/x86_64/
gpgcheck=0
enabled=1

[extra]
name=extra
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
gpgcheck=0
enabled=1

示例:使用本地光盘源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 光盘已自动挂载
[root@Rocky8-mini ~]#cat /etc/yum.repos.d/Rocky8.repo
[Rocky8_Baseos]
name=Baseos
baseurl=file:///misc/cd/BaseOS
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
enabled=1

[Rocky8_Appstream]
name=Appstream
baseurl=file:///misc/cd/AppStream
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
enabled=1

关于仓库的管理命令

1
2
3
4
5
6
7
8
9
10
11
yum-config-manager    可以生成yum仓库的配置文件及启用或禁用仓库,来自于yum-utils包

# 格式
## 增加仓库
yum-config-manager -add-repo URL或file

## 禁用仓库
yum-config-manager --disable "仓库名"

##启用仓库
yum-config-manager --enable "仓库名"

示例

1
2
3
4
5
6
7
8
9
# 创建仓库配置
[root@Rocky8-mini ~]#rpm -qf `which yum-config-manager`
yum-utils-4.0.21-3.el8.noarch

[root@Rocky8-mini ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Repository epel is listed more than once in the configuration
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@Rocky8-mini ~]#ls /etc/yum.repos.d/ | grep docker
docker-ce.repo

三、yum 命令

yum命令的用法:

1
yum [options] [command] [package ...]

yum的命令行选项:

1
2
3
4
5
-y                            # 自动回答‘yes’
-q # 静默模式
--nogpgcheck # 不进行gpgcheck检查
--enablerepo=repoid_glob # 临时启用此处指定的repo,支持使用通配符,如:"*"
--disablerepo=repoid_glob # 临时禁用此处指定的repo

3.1 显示仓库列表

1
yum repolist [all|enabled|disabled]

Example:

1
2
3
[root@Rocky8-mini ~]#yum repolist -v             # 显示仓库更完整的信息
[root@Rocky8-mini ~]#yum repolist all
[root@Rocky8-mini ~]#yum repolist enabled

3.2 显示程序包

1
2
3
yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]

Example1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 默认情况下,使用yum list或yum install时,yum会默认选择最新的版本
# 当需要安装某个软件包的指定版本时,可以使用--showduplicates参数列出所有版本
[root@Rocky8-mini ~]#yum list docker-ce
Repository epel is listed more than once in the configuration
Last metadata expiration check: 0:38:33 ago on Sat 29 Oct 2022 09:32:14 PM EDT.
Available Packages
docker-ce.x86_64 3:20.10.21-3.el8 docker-ce-stable
[root@Rocky8-mini ~]#yum list docker-ce --showduplicates
Repository epel is listed more than once in the configuration
Last metadata expiration check: 0:39:32 ago on Sat 29 Oct 2022 09:32:14 PM EDT.
Available Packages
docker-ce.x86_64 3:19.03.13-3.el8 docker-ce-stable
docker-ce.x86_64 3:19.03.14-3.el8 docker-ce-stable
docker-ce.x86_64 3:19.03.15-3.el8 docker-ce-stable
docker-ce.x86_64 3:20.10.0-3.el8 docker-ce-stable
···

[root@Rocky8-mini ~]#yum list docker-ce --disablerepo="docker*"
Repository epel is listed more than once in the configuration
Last metadata expiration check: 0:47:10 ago on Sat 29 Oct 2022 09:28:13 PM EDT.
Error: No matching Packages to list

Example2:

1
2
3
4
# 只查看已经安装的包
[root@Rocky8-mini ~]#yum list installed | wc -l
Repository epel is listed more than once in the configuration
499

Example3:

1
2
3
4
# 查看可安装的包
[root@Rocky8-mini ~]#yum list available | wc -l
Repository epel is listed more than once in the configuration
15908

Example4:

1
2
3
4
# 查看可以升级的包
[root@Rocky8-mini ~]#yum list updates | wc -l
Repository epel is listed more than once in the configuration
26

3.3 安装程序包

1
2
3
4
5
yum install package1 ...
yum reinstall package1 ...

--downloadonly # 只下载相关包默认至/var/cache/yum/x86_64/7/目录下(7版本) /var/cache/dnf(8版本)
--downloadaddir=<path>,--destdir=<path> # 用来指定下载的目录,如果不存在自动创建

3.3.1 安装epel源包

1
2
3
# 安装软件之前需配置好epel源
[root@Rocky8-mini ~]#yum -y install sl
[root@Rocky8-mini ~]#sl -a

image-20221030103900751

1
2
[root@Rocky8-mini ~]#dnf -y install cowsay
[root@Rocky8-mini ~]#animalsay nihao

image-20221030104109290

3.3.2 升级内核

实例:利用elrepo源在Centos7安装新版本内核

注:选择内核版本时,选择”kernel-lt”,长期技术支持版,安全稳定;“kernal-ml”为主线版,即测试版,不推荐使用。

1、进入elrepo源官网,找到对应版本的安装提示

image-20221030105852223

2、按照提示安装该rpm包,之后会生成仓库配置

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
[root@centos7 ~]#yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
[root@centos7 ~]#ls /etc/yum.repos.d/
backup elrepo.repo yum.repo

# 默认内核仓库并没有开启
[root@centos7 yum.repos.d]#cat elrepo.repo
### Name: ELRepo.org Community Enterprise Linux Repository for el7
### URL: https://elrepo.org/

[elrepo]
name=ELRepo.org Community Enterprise Linux Repository - el7
baseurl=http://elrepo.org/linux/elrepo/el7/$basearch/
http://mirrors.coreix.net/elrepo/elrepo/el7/$basearch/
http://mirror.rackspace.com/elrepo/elrepo/el7/$basearch/
http://linux-mirrors.fnal.gov/linux/elrepo/elrepo/el7/$basearch/
mirrorlist=http://mirrors.elrepo.org/mirrors-elrepo.el7
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
protect=0

[elrepo-testing]
name=ELRepo.org Community Enterprise Linux Testing Repository - el7
baseurl=http://elrepo.org/linux/testing/el7/$basearch/
http://mirrors.coreix.net/elrepo/testing/el7/$basearch/
http://mirror.rackspace.com/elrepo/testing/el7/$basearch/
http://linux-mirrors.fnal.gov/linux/elrepo/testing/el7/$basearch/
mirrorlist=http://mirrors.elrepo.org/mirrors-elrepo-testing.el7
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
protect=0

[elrepo-kernel]
name=ELRepo.org Community Enterprise Linux Kernel Repository - el7
baseurl=http://elrepo.org/linux/kernel/el7/$basearch/
http://mirrors.coreix.net/elrepo/kernel/el7/$basearch/
http://mirror.rackspace.com/elrepo/kernel/el7/$basearch/
http://linux-mirrors.fnal.gov/linux/elrepo/kernel/el7/$basearch/
mirrorlist=http://mirrors.elrepo.org/mirrors-elrepo-kernel.el7
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
protect=0

[elrepo-extras]
name=ELRepo.org Community Enterprise Linux Extras Repository - el7
baseurl=http://elrepo.org/linux/extras/el7/$basearch/
http://mirrors.coreix.net/elrepo/extras/el7/$basearch/
http://mirror.rackspace.com/elrepo/extras/el7/$basearch/
http://linux-mirrors.fnal.gov/linux/elrepo/extras/el7/$basearch/
mirrorlist=http://mirrors.elrepo.org/mirrors-elrepo-extras.el7
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
protect=0

[root@centos7 yum.repos.d]#yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* elrepo-kernel: mirrors.tuna.tsinghua.edu.cn
Available Packages
kernel-lt.x86_64 5.4.221-1.el7.elrepo elrepo-kernel
kernel-lt-devel.x86_64 5.4.221-1.el7.elrepo elrepo-kernel
kernel-lt-doc.noarch 5.4.221-1.el7.elrepo elrepo-kernel
kernel-lt-headers.x86_64 5.4.221-1.el7.elrepo elrepo-kernel
kernel-lt-tools.x86_64 5.4.221-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs.x86_64 5.4.221-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs-devel.x86_64 5.4.221-1.el7.elrepo elrepo-kernel
kernel-ml.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-devel.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-doc.noarch 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-headers.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-tools.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs-devel.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
perf.x86_64 5.4.221-1.el7.elrepo elrepo-kernel
python-perf.x86_64

3、安装新版本内核

1
2
3
4
5
6
7
[root@centos7 yum.repos.d]#yum -y install kernel-lt.x86_64 --enablerepo="elrepo-kernel"
# 当前版本内核
[root@centos7 yum.repos.d]#uname -r
3.10.0-1160.el7.x86_64
# 当前已安装的内核版本
[root@centos7 ~]#ls /lib/modules
3.10.0-1160.el7.x86_64 5.4.221-1.el7.elrepo.x86_64

4、重启系统,选择新版本内核启动

1
2
3
# 选择新版本内核后启动机器,验证
[root@centos7 ~]#uname -r
5.4.221-1.el7.elrepo.x86_64

image-20221030112530383

3.3.3 只下载相关的依赖包,而不安装

1
2
3
4
5
6
7
# 当一台机器不能上网需要依赖网络安装某个包,可让另一台可以上网的机器将该包及其依赖关系下载下来,但不安装,之后传到需要的机器上去即可
# --downloaddir 下载到指定目录,没有会自动创建
[root@Rocky8-mini ~]#yum -y install --downloadonly --downloaddir=/data/httpd httpd
[root@Rocky8-mini ~]#ls /data/httpd/
centos-logos-httpd-85.8-2.el8.noarch.rpm httpd-tools-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64.rpm
httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64.rpm mailcap-2.1.48-3.el8.noarch.rpm
httpd-filesystem-2.4.37-43.module_el8.5.0+1022+b541f3b1.noarch.rpm mod_http2-1.15.7-3.module_el8.4.0+778+c970deab.x86_64.rpm

3.4 卸载程序包

1
yum remove package1 ...

3.5 升级和降级

检查可用升级

1
yum check-update

升级和降级

1
2
3
yum upgrade|update [package1] [...]
yum upgrade-minimal # 最小化升级
yum downgrade package1 [package2] [...]

3.6 查询

查询程序包information

1
yum info [...]

查看指定的特性(可以是某文件)是由那个程序包提供的:

1
2
3
yum provides | whatprovides feature1 [feature2] [...]

注:文件要写全路径,不能只是文件名,否则有可能查询不到

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@Rocky8-mini ~]#ll /etc/vsftpd/vsftpd.conf
ls: cannot access '/etc/vsftpd/vsftpd.conf': No such file or directory
[root@Rocky8-mini ~]#yum provides /etc/vsftpd/vsftpd.conf
Repository epel is listed more than once in the configuration
Last metadata expiration check: 1:02:37 ago on Sun 30 Oct 2022 01:02:07 AM EDT.
vsftpd-3.0.3-34.el8.x86_64 : Very Secure Ftp Daemon
Repo : AppStream
Matched from:
Filename : /etc/vsftpd/vsftpd.conf

[root@Rocky8-mini ~]#yum provides vsftpd.conf
Repository epel is listed more than once in the configuration
Last metadata expiration check: 1:02:43 ago on Sun 30 Oct 2022 01:02:07 AM EDT.
Error: No Matches found

# 使用通配符
[root@Rocky8-mini ~]#yum provides */vsftpd.conf

以指定的关键字搜索程序包名及summary信息

1
yum search string1 [string2] [...]

查看指定包所依赖的CAPABILITIES

1
yum deplist package1 [package2] [...]

3.7 仓库缓存

清除目录/var/cache/dnf | yum/ 中的缓存

1
yum clean [packages | metadata | expire-cache | rpmdb | plugins | all]

构建缓存

1
yum makecache

3.8 查看yum事务历史

yum 执行安装卸载命令会记录到相关日志中

1
2
3
4
5
6
7版本
/var/log/yum.log

8版本
/var/log/dnf.rpm.log
/var/log/dnf.log

日志命令

1
yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

Example:

1
2
3
4
5
6
7
8
9
10
11
12
[root@Rocky8-mini dnf]#dnf history 
Repository epel is listed more than once in the configuration
ID | Command line | Date and time | Action(s) | Altered
-----------------------------------------------------------------------------------------------
33 | -y install yum-utils | 2022-10-29 21:28 | Install | 1
32 | -y install cowsay | 2022-10-29 07:00 | Install | 42
31 | -y install autofs | 2022-10-29 03:36 | Install | 1
......

[root@Rocky8-mini dnf]#dnf history info 33 # 查看第33次安装的详细信息
[root@Rocky8-mini dnf]#dnf history undo 33 -y # 撤销第33次操作
[root@Rocky8-mini dnf]#dnf history redo 3 -y # 重新执行第33次操作

3.9 安装及升级本地程序包

1
2
yum localinstall|install rpmfile1 [rpmfile2] [...]
yum localupdate|update rpmfile1 [rpmfile2] [...]

3.10 查看包的安全警报

1
yum updateinfo --summary|--list|--info

3.11 包组管理的相关命令

1
2
3
4
5
yum grouplist [hidden] [groupwildcard] [...]
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]

3.12 DNF 介绍

DNF 是新一代的rpm软件包管理器。他首先出现在 Fedora 18 这个发行版中。DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。

配置文件:

1
/etc/dnf/dnf.conf

仓库文件:

1
/etc/yum.repos.d/*.repo

日志:

1
2
/var/log/dnf.rpm.log
/var/log/dnf.log

dnf 用法和yum一致

1
2
3
4
5
6
7
8
9
10
11
12
dnf [options] <command> [<arguments>...]
dnf --version
dnf repolist
dnf reposync
dnf install httpd
dnf remove httpd
dnf clean all
dnf makecache
dnf list installed
dnf list available
dnf search nano
dnf history undo 1

3.13 实现私有yum仓库

实验目的:

​ 配置Server端使用光盘中的镜像挂载到指定位置,网络epel源使用中科大镜像源下载到本地。使Server端成为本地YUM服务器,配置Client端的仓库地址为Server端。

image-20221030153044890

1、配置epel源,之后下载到本地;BaseOS和AppStream源使用本地光盘进行挂载

1
2
3
4
5
6
7
[root@Rocky8-server ~]# cat /etc/yum.repos.d/yum.repo 
[epel]
name=epel
baseurl=https://mirrors.ustc.edu.cn/epel/8/Everything/x86_64/
gpgcheck=1
gpgkey=https://mirrors.ustc.edu.cn/epel/RPM-GPG-KEY-EPEL-8
enabled=1

2、server 端安装httpd服务,使其作为一台服务器,为客户端提供服务

1
2
3
4
5
[root@Rocky8-server ~]# dnf -y install httpd
[root@Rocky8-server ~]# systemctl enable --now httpd

# 创建8版本的包存放位置
[root@Rocky8-server ~]# mkdir /var/www/html/Rocky/8/cdrom -p

3、配置本地光盘挂载到指定的位置

1
2
3
4
[root@Rocky8-server 8]# mount /dev/sr0 /var/www/html/Rocky/8/
# 配置永久挂载
[root@Rocky8-server 8]# cat /etc/fstab
/dev/sr0 /var/www/html/Rocky/8/cdrom iso9660 defaults 0 0

4、下载配置完成的epel源到本地

1
2
3
4
5
6
7
8
9
## --download-metadata 下载元数据
## -p 指定保存的位置
[root@Rocky8-server 8]# dnf reposync --repoid=epel --download-metadata -p /var/www/html/Rocky/8/

# 下载epel源包的校验文件
[root@Rocky8-server epel]# wget -P /var/www/html/Rocky/8/epel/ https://mirrors.ustc.edu.cn/epel/RPM-GPG-KEY-EPEL-8

# 当下载仓库包没有下载对应的元数据时,可以手动生成,需要使用createrepo命令,没有需要安装
[root@Rocky8-server ~]# createrepo /var/www/html/Rocky/8/epel/

5、配置客户端的仓库源,指向本地服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@Rocky8-client ~]#cat /etc/yum.repos.d/yum.repo 
[BaseOS]
name=BaseOS
baseurl=http://192.168.119.138/Rocky/8/cdrom/BaseOS/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
enabled=1

[AppStream]
name=AppStream
baseurl=http://192.168.119.138/Rocky/8/cdrom/AppStream/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
enabled=1

[epel]
name=epel
baseurl=http://192.168.119.138/Rocky/8/epel/
gpgcheck=1
gpgkey=http://192.168.119.138/Rocky/8/epel/RPM-GPG-KEY-EPEL-8
enabled=1

6、验证

1
2
3
4
5
6
[root@Rocky8-client yum.repos.d]#yum repolist all
repo id repo name status
AppStream AppStream enabled
BaseOS BaseOS enabled
epel epel enabled
[root@Rocky8-client yum.repos.d]#dnf -y install sl

程序包编译

一、C语言源代码编译安装过程

编译过程一般需要三步骤:

  • ./configure
    • 通过选项传递参数,可以指定安装路径、启用特性等;执行时会参考用户指定的某些特性,以及Makefile.in文件生成Makefile
    • 检查依赖到的外部环境,如依赖到的软件包
  • make 根据Makefile文件,会检测到依赖的环境,进行构建应用程序
  • make install 复制文件到相应路径

注:安装前可通过查看README,INSTALL获取帮助

1.1 编译安装准备

安装相关依赖包

  • 开发工具:make,gcc
  • 开发环境:开发库(glibc 标准库),头文件,可安装开发包组 Development Tools
  • 软件相关依赖包

基于最小化安装的系统建议安装下面相关包

1
2
# 源码编译安装程序包时,但某些包必须要在安装之前就安装好,遇到不明显的错误提示时,可重新解压缩源码包进行安装(上次安装生成的文件应删除)
yum -y install gcc make autoconf gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages

1.2 编译安装

第一步:运行configure脚本,生成Makefile文件

其选项主要功能:

  • 指定安装位置
  • 指定启用的特性

获取支持使用的选项./configure --help

选项分类:

  • 安装路径设定
    • –prefix=/PATH 指定默认安装位置,默认为/usr/local/
    • sysconfdir=/PATH 配置文件安装位置
  • 软件特性和相关指定
    • Optional Features:可选特性
      • –disable-FEATURE
      • –enable-FEATURE
    • Optional Packages:可选包
      • –with-PACKAGE 依赖包
      • –without-PACKAGE 禁用依赖关系

注:通常被编译操作依赖的程序包,需要安装此程序包的“开发”组件,其包名一般类似于name-devel-VERSION

第二步:make

第三步:make install

1.3 安装后配置

1、二进制程序导入至PATH环境变量中,长久保存写入到 /etc/profile.d/NAME.sh 文件中

1
export PATH=/PATH/TO/BIN:$PATH 

2、创建相关用户及文件

​ 一些开源软件编译完成后,需要创建相关的用户及文件

3、导入帮助守则

​ 编辑 /etc/man.conf | man_db.conf 文件,添加一个 MANPATH

1.4 编译安装实例

1.4.1 编译安装最新版的 tree

实例:Rocky8 编译安装tree2.0.4

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
# 安装相关依赖包
[root@Rocky8-mini ~]# yum -y install gcc make

# 下载源码包并解压
## 网址 http://mama.indstate.edu/users/ice/tree/
[root@Rocky8-mini ~]# ls tree-2.0.4.tgz
tree-2.0.4.tgz
[root@Rocky8-mini ~]# tar -xvf tree-2.0.4.tgz

# 进入解压缩目录,查看README和INSTALL
[root@Rocky8-mini ~]# cd tree-2.0.4/
[root@Rocky8-mini tree-2.0.4]# cat INSTALL
[root@Rocky8-mini tree-2.0.4]# cat README

# 此软件包过小,不需要执行configure命令,有默认的Makefile文件。修改Makefile文件,指定安装的位置
[root@Rocky8-mini tree-2.0.4]# vim Makefile
PREFIX=/apps/tree

# 编译
## -j 指定CPU核数,根据自己机器实际配置
[root@Rocky8-mini tree-2.0.4]# make -j 2

# 安装
[root@Rocky8-mini tree-2.0.4]# make install

# 安装完成后无法直接运行,可通过修改环境变量或软链接的方式实现
## 修改环境变量
[root@Rocky8-mini ~]# echo 'PATH=/apps/tree/bin:$PATH' > /etc/profile.d/tree.sh
## 软链接
[root@Rocky8-mini ~]# ln -s /apps/tree/bin/tree /usr/bin/tree

# 验证结果
[root@Rocky8-mini ~]# tree --version
tree v2.0.4 (c) 1996 - 2022 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro

# 添加man帮助
[root@Rocky8-mini ~]# vim /etc/man_db.conf
MANDATORY_MANPATH /apps/tree/man

Ubuntu 软件管理

Debian 软件包通常为预编译的二进制格式的扩展名为“.deb”,类似rpm文件,不需要编译。包文件包括特定功能或软件所需的文件、元数据和指令

  • dpkg:类似于rpm,是基于Debian系统的包管理器
  • apt:类似于yum,软件管理工具

一、APT 工作原理

在服务器上先复制所有DEB包,然后用APT的分析工具 genbasedir 根据每个DEB 包的包头(Header)信息对所有的DEB包进行分析,并将该分析结果记录在文件夹base内的一个DEB 索引清单文件中,一旦APT 服务器内的DEB有所变动,要使用 genbasedir 产生新的DEB索引清单。客户端在进行安装或升级时先要查询DEB索引清单,从而获知所有具有依赖关系的软件包,并一同下载到客户端以便安装。当客户端需要安装、升级或删除某个软件包时,客户端计算机取得DEB索引清单压缩文件后,会将其解压置放于 /var/cache/apt/,而客户端使用 apt-get install 或 apt-get upgrade 命令的时候,就会将这个文件夹内的数据和客户端计算机内的DEB数据库比对,知道哪些DEB已安装、未安装或是可以升级的。

二、dpkg 包管理器

dpkg 常见用法

1
2
3
4
5
6
7
8
9
10
dpkg -i package.deb          安装包
-r package 删除包,不会自动卸载依赖于它的包,不建议
-P package 删除包,包括配置文件
-l 列出当前已经安装的包
-l package 显示该包的简要说明
-s package 列出该包的状态,包括详细信息
-L package 列出包中所包含的文件
-S <pattern> 搜索包含pattern的包
-c package.deb 列出deb包的内容
--unpack package.deb 解开deb包的内容

三、apt

apt命令 被取代的命令 功能
apt install apt-get install 安装软件包
apt remove apt-get remove 移除软件包
apt purge apt-get purge 移除软件包及配置文件
apt update apt-get update 刷新存储库索引
apt upgrade apt-get upgrade 升级所有可升级的软件包
apt autoremove apt-get autoremove 自动删除不需要的包
apt full-upgrade apt-get dist-upgrade 在升级软件包时自动处理依赖关系
apt search apt-cache search 搜索应用程序
apt show apt-cache show 显示安装包的详细信息
apt list 列出包含条件的包(已安装的,可升级的等)
apt edit-sources 编辑镜像源列表

APT包索引配置文件

1
2
/etc/apt/sources.list
/etc/apt/sources.list.d/

apt 命令操作的日志文件

1
/var/log/dpkg.log

示例:

1
2
3
4
5
6
7
# 安装软件包时指定具体安装的版本
apt install nginx=1.14.0-0ubuntu1.6

# 查看文件属于哪个包,apt-file 命令需要安装
apt-file search 'string'
apt-file search -x '正则表达式'
apt-file search -F /path/file

四、软件管理案例

4.1 查看文件来自于哪个包

示例:查找存在的文件来自于哪个包

1
2
3
4
# dpkg -S filename 支持使用通配符
root@ubuntu18-server:~# dpkg -S */ls
coreutils: /bin/ls
klibc-utils: /usr/lib/klibc/bin/ls

示例:查找不存在的文件属于哪个包

1
2
3
4
root@ubuntu18-server:~# apt install apt-file
root@ubuntu18-server:~# apt update
root@ubuntu18-server:~# apt-file search -x '/sl$'
root@ubuntu18-server:~# apt-file search -F /usr/games/sl

4.2 查看包相关信息

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
# 显示系统安装包的统计信息,包括安装包的数量,大小,占用空间等
# apt-cache stats
root@ubuntu18-server:~# apt-cache stats
Total package names: 96367 (1,927 k)
Total package structures: 96607 (4,251 k)
Normal packages: 78791
Pure virtual packages: 1556
Single virtual packages: 5306
Mixed virtual packages: 458
Missing: 10496
Total distinct versions: 91272 (7,302 k)
Total distinct descriptions: 171178 (4,108 k)
Total dependencies: 562504/129460 (13.3 M)
Total ver/file relations: 50846 (1,220 k)
Total Desc/File relations: 40106 (963 k)
Total Provides mappings: 42265 (1,014 k)
Total globbed strings: 213289 (5,204 k)
Total slack space: 31.1 k
Total space accounted for: 39.7 M
Total buckets in PkgHashTable: 50503
Unused: 7546
Used: 42957
Utilization: 85.0583%
Average entries: 2.24892
Longest: 59
Shortest: 1
Total buckets in GrpHashTable: 50503
Unused: 7546
Used: 42957
Utilization: 85.0583%
Average entries: 2.24334
Longest: 12
Shortest: 1

# 显示指定包的信息,包括包的源、版本等信息
## apt-cache show package 更详细
## apt show package

root@ubuntu18-server:~# apt show sl
root@ubuntu18-server:~# apt-cache show sl

4.3 查看仓库中的指定软件的所有版本

1
2
3
4
5
# apt-cache madison PACKAGE
root@ubuntu18-server:~# apt-cache madison nginx
nginx | 1.14.0-0ubuntu1.10 | https://mirrors.aliyun.com/ubuntu bionic-updates/main amd64 Packages
nginx | 1.14.0-0ubuntu1.10 | https://mirrors.aliyun.com/ubuntu bionic-security/main amd64 Packages
nginx | 1.14.0-0ubuntu1 | https://mirrors.aliyun.com/ubuntu bionic/main amd64 Packages

4.4 查看文件的依赖

1
2
3
4
5
6
7
# 查询软件依赖那些包
apt depends PACKAGE
apt-cache depends PACKAGE

# 查询软件被哪些包依赖
apt rdepends PACKAGE
apt-cache rdepends PACKAGE