软件运行和编译

软件相关概念

ABI

ABI:(Application Binary Interface) 应用程序二进制接口

windows 与 linux 中的 ABI 格式是不兼容的

  • windows 中的是 PE (Portable Executable ) 格式
  • linux 中的是 ELF ( Executable and Linkable Format ) 格式

范例:查看可执行文件格式

1
2
3
4
5
6
[root@rocky8 ~]# file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=618c637a7d4bcfd24f3b7017c3198b38b10362e9, stripped


[root@rocky8 ~]# file win.exe
win.exe: PE32+ executable (console) x86-64, for MS Windows

linux 中不同版本的 ABI 是通用的

1
2
3
4
5
6
7
8
9
#将在 rocky 编译的程序SCP 到 ubuntu 中,同样可以执行
[root@rocky8 ~]# scp a.out jose@10.0.0.152:/home/jose/
jose@10.0.0.152's password:
a.out

#在 ubuntu 中同样可以执行
jose@ubuntu20:~$ ./a.out
hello world
hello world

API

API即Application Programming Interface,API可以在各种不同的操作系统上实现给应用程序提供完全相同的接口,而它们本身在这些系统上的实现却可能迥异,主流的操作系统有两种,一种是Windows系统,另一种是Linux系统。由于操作系统的不同,API又分为Windows API 和 Linux API。在Windows平台开发出来的软件在Linux上无法运行,在Linux上开发的软件在Windows上又无法运行,这就导致了软件移植困难,POSIX 标准的出现就是为了解决这个问题。

POSIX:Portable Operating System Interface 可移植操作系统接口,定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。

linux和windows都要实现基本的posix标准,程序就在源代码级别可移植了。

1
2
3
4
5
6
7
8
9
10
//这段代码在win和 linux 下都可以编译通过,是因为 win 和 linux 中都有相同的头文件,都能找到 printf和 sleep 函数,且参数一样
#include <stdio.h>
#include<unistd.h>
int main() {
while (true){
printf("hello world\n");
sleep(1);
}
return 0;
}

开发语言

系统级开发:汇编语言、C、C++

应用级开发:java、Python、go、php、perl、delphi、ruby

1
开发里面有句话:C生万物

C语言程序的实现过程

C 程序源代码 –> 预处理 –> 编译 –> 汇编 –> 链接

C语言的程序编译主要经过四个过程:

1

  • 预处理(Pre-Processing)

    1. 将所有的#define删除,并且展开所有的宏定义
    2. 处理所有的条件预编译指令,比如 #if,#ifdef,#elif,#else,#endif 等
    3. 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置
    4. 删除所有的注释,//,/**/
    5. 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号
    6. 保留所有的#pragma编译指令,因为编译需要使用它们
  • 编译 (Compiling)

    1. 编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后,最后生成的汇编代码
  • 汇编 (Assembling)

    1. 汇编是将汇编代码转变成机器码可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可
  • 链接 (Linking)

    1. 通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include<unistd.h>
int main() {
while (true){
printf("hello world\n");
sleep(1);
}
return 0;
}
1
2
3
4
5
6
gcc -E hello.c -o hello.i        #预处理,输出 .i 文件
gcc -S hello.i -o hello.s #编译,输出 .s 汇编文件
gcc -c hello.s -o hello.o #汇编,输出 .o 目标文件
gcc hello.o -o hello #链接,输出可执行文件

gcc hello.c -o hello #一步到位

这种手动编译的方式,对单个文件来讲没有问题;

但实际工作中的商业项目,会有成百上千的源码文件,包括头文件,库文件(库里面又有自定义库,第三方库,标准库),各种依赖关系,编译的先后顺序等,所以在实际的开发工作中,几乎不会用这种手动编译的方式去编译项目;

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

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

2

静态链接

  • 把程序对应的依赖库复制一份到包
  • 生成模块文件libxxx.a
  • 嵌入程序包
  • 升级难,需重新编译
  • 占用较多空间,迁移容易

动态链接

  • 只把依赖加做一个动态链接
  • 生成模块文件libxxx.so
  • 连接指向
  • 占用较少空间,升级方便

模块(库)文件

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

1
2
3
4
5
6
7
8
9
10
11
12
ldd /PATH/TO/BINARY_FILE


[root@rocky8 ~]# ldd /usr/bin/ls
linux-vdso.so.1 (0x00007ffd8f4fb000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f7bdc9f9000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f7bdc7f3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f7bdc42e000)
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f7bdc1aa000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f7bdbfa6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7bdce46000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7bdbd86000)

把/lib64/libc.so.6 移动到 /opt下系统就会崩溃,需要重启系统进入救援模式从光盘启动,把文件移回去

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

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

#显示本机已经缓存的所有可用库文件名及文件路径映射关系
root@rocky8 ~]# ldconfig -p

配置文件

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

缓存文件

1
/etc/ld.so.cache

软件包和包管理器

软件包介绍

开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软件。用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一个管理工具dpkg也就应运而生,可用来管理deb后缀的”包”文件。从而著名的 “package” 概念第一次出现在GNU/Linux系统中,稍后Red Hat才开发自己的rpm包管理系统

软件包中的文件分类

  • 二进制文件
  • 库文件
  • 配置文件
  • 帮助文件

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

1
2
rpm2cpio 包文件|cpio –itv            #预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” #释放包内文件
1
2
3
4
5
[root@rocky8 h]# rpm2cpio httpd-devel-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64.rpm | cpio -itv
-rwxr-xr-x 1 root root 23720 Nov 10 2021 ./usr/bin/apxs
drwxr-xr-x 1 root root 0 Nov 10 2021 ./usr/include/httpd
-rw-r--r-- 1 root root 14 Nov 10 2021 ./usr/include/httpd/.mmn
-rw-r--r-- 1 root root 1075 Nov 10 2021 ./usr/include/httpd/ap_compat.h

程序包管理器

软件包管理器功能:

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

主流的程序包管理器:

  • redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager
  • debian:deb文件, dpkg 包管理器

包命名

源代码打包文件命名

1
2
3
4
5
6
7
8
name-VERSION.tar.gz|bz2|xz 
VERSION: major.minor.release

#nginx-1.22.0.tar.gz

#major 主版本号
#minor 次版本号
#release 修正版本号

rpm包命名方式

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

#http-parser-2.8.0-9.el8.x86_64.rpm
#httpd-2.4.37-41.module+el8.5.0+695+1fa8055e.x86_64.rpm
#nginx-1.14.1-9.module+el8.4.0+542+81547229.x86_64.rpm

#major 主版本号
#minor 次版本号
#release 修正版本号

#el8 EL是Red Hat Enterprise Linux(EL)的缩写, EL8是Red Hat 8.x,CentOS 8.x,el8.4.0+ 是指 适配redhat8.4.0以上及centos8.4.0以上的系统

常见的arch:

  • x86: i386, i486, i586, i686
  • x86_64: x64, x86_64, amd64
  • powerpc: ppc
  • 跟平台无关:noarch

范例:rpm

1
2
3
4
5
6
7
8
9
10
11
[root@rocky8 ~]# ls /cdrom/AppStream/Packages/h
haproxy-1.8.27-2.el8.x86_64.rpm
harfbuzz-1.7.5-3.el8.i686.rpm
harfbuzz-1.7.5-3.el8.x86_64.rpm
harfbuzz-devel-1.7.5-3.el8.i686.rpm
harfbuzz-devel-1.7.5-3.el8.x86_64.rpm
harfbuzz-icu-1.7.5-3.el8.i686.rpm
harfbuzz-icu-1.7.5-3.el8.x86_64.rpm
hawtjni-runtime-1.16-1.module+el8.3.0+241+f23502a8.noarch.rpm
hawtjni-runtime-1.16-2.module+el8.3.0+133+b8b54b58.noarch.rpm
HdrHistogram-2.1.11-3.module+el8.4.0+405+66dfe7da.noarch.rpm

范例:deb包

1
2
3
4
5
6
7
8
root@ubuntu20:~# ls /cdrom/pool/main/z/zfs-linux/
libnvpair1linux_0.8.3-1ubuntu12.13_amd64.deb
libuutil1linux_0.8.3-1ubuntu12.13_amd64.deb
libzfs2linux_0.8.3-1ubuntu12.13_amd64.deb
libzpool2linux_0.8.3-1ubuntu12.13_amd64.deb
zfs-initramfs_0.8.3-1ubuntu12.13_amd64.deb
zfsutils-linux_0.8.3-1ubuntu12.13_amd64.deb
zfs-zed_0.8.3-1ubuntu12.13_amd64.deb

分类和拆包

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

包的分类

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

包的依赖

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

解决依赖包管理工具:

  • yum:rpm包管理器的前端工具
  • dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum
  • apt:deb包管理器前端工具
  • zypper:suse上的rpm前端管理工具

程序包管理器相关文件

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

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

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

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

获取程序包的途径

软件包需要事先将源码进行编译后打包形成,获取包的途径如下:

系统发版的光盘或官方网站

CentOS镜像:

https://www.centos.org/download/

http://mirrors.aliyun.com

http://mirrors.sohu.com

http://mirrors.163.com

Ubuntu 镜像:

http://cdimage.ubuntu.com/releases/

http://releases.ubuntu.com

第三方组织提供

Fedora-EPEL:Extra Packages for Enterprise Linux

https://fedoraproject.org/wiki/EPEL

https://mirrors.aliyun.com/epel/?spm=a2c6h.13651104.0.0.3bc47dfaZpesAr

Rpmforge:RHEL推荐,包很全,即将关闭

http://repoforge.org/

Community Enterprise Linux Repository:支持最新的内核和硬件相关包

http://www.elrepo.org

软件项目官方站点

http://yum.mariadb.org/10.4/centos8-amd64/rpms/

http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/

搜索引擎

注意:第三方包建议要检查其合法性,来源合法性,程序包的完整性

http://pkgs.org http://rpmfifind.net

http://rpm.pbone.net https://sourceforge.net/

自己制作

将源码文件,利用工具,如:rpmbuild,fpm等工具制作成rpm包文件

包管理器rpm

CentOS系统上使用rpm命令管理程序包

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

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
rpm {-i|--install} [install-options] PACKAGE_FILE…


-v|verbose #显示详细信息
-vv #更详细
-h #显示安装进度条
--test #测试安装,但不真正执行安装,即dry run模式
--nodeps #忽略依赖关系
--replacefiles #忽略软件包之间的冲突的文件
--replacepkgs #如果软件包已经有了,重新安装软件包
--nosignature #不检查来源合法性
--nodigest #不检查包完整性
--noscripts #不执行程序包脚本,相当于 --nopre --nopost --nopreun --nopostun --nopretrans --noposttrans
--nopre #不执行程序包中安装前脚本
--nopost #不执行程序包中安装前脚本
--nopreun #不执行程序包中卸载前脚本
--nopostun #不执行程序包中卸载后脚本
--nopretrans #安装前不执行与程序同名脚本
--noposttrans #安装后不执行与程序同名脚本

#常用组合
rpm -ivh PACKAGE_FILE ...

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#不需要依赖
[root@loaclhost Packages]$rpm -ivh vsftpd-3.0.3-35.el8.x86_64.rpm
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:vsftpd-3.0.3-35.el8 ################################# [100%]


#需要依赖
[root@loaclhost Packages]$rpm -ivh httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64.rpm
error: Failed dependencies:
httpd-filesystem = 2.4.37-43.module_el8.5.0+1022+b541f3b1 is needed by httpd-2.4.37-
43.module_el8.5.0+1022+b541f3b1.x86_64
httpd-tools = 2.4.37-43.module_el8.5.0+1022+b541f3b1 is needed by httpd-2.4.37-
43.module_el8.5.0+1022+b541f3b1.x86_64

升级和降级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
rpm {-U|--upgrade} [install-options] PACKAGE_FILE... 
rpm {-F|--freshen} [install-options] PACKAGE_FILE...


upgrade #安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装”
freshen #安装有旧版程序包,则“升级”, 如果不存在旧版程序包,则不执行升级操作

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


#常用组合
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...

升级注意项:

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

包查询

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
rpm {-q|--query} [select-options] [query-options]
[select-options]


-a #所有包
-f #查看指定的文件由哪个程序包安装生成
-p rpmfile #针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY #查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY #查询指定的CAPABILITY被哪个包所依赖


[query-options]
--changelog #查询rpm包的changelog
-c #查询程序的配置文件
-d #查询程序的文档
-i #information
-l #查看指定的程序包安装后生成的所有文件
--scripts #程序包自带的脚本
--provides #列出指定程序包所提供的CAPABILITY
-R #查询指定的程序包所依赖的CAPABILITY


#常用查询组合
-qi PACKAGE
-qf FILE
-qc PACKAGE
-ql PACKAGE
-qd PACKAGE
-qpi PACKAGE_FILE
-qpl PACKAGE_FILE
-qa

范例:列出所有己安装的包

1
2
3
4
5
[root@rocky86 h]# rpm -qa
......

[root@rocky86 h]# rpm -qa | grep passwd
passwd-0.80-4.el8.x86_64

范例:是否安装

1
2
3
4
5
6
7
8
9
10
11
#己安装
[root@rocky86 h]# rpm -q nginx
nginx-1.14.1-9.module+el8.4.0+542+81547229.x86_64
[root@rocky86 h]# echo $?
0

#没有安装,找不到包
[root@rocky86 h]# rpm -q php
package php is not installed
[root@rocky86 h]# echo $?
1

范例:查询包详细信息

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
[root@rocky86 h]# rpm -qi nginx
Name : nginx
Epoch : 1
Version : 1.14.1
Release : 9.module+el8.4.0+542+81547229
Architecture: x86_64
Install Date: Thu 14 Jul 2022 10:11:12 AM CST
Group : System Environment/Daemons
Size : 1669719
License : BSD
Signature : RSA/SHA256, Thu 10 Jun 2021 05:22:38 PM CST, Key ID 15af5dac6d745a60
Source RPM : nginx-1.14.1-9.module+el8.4.0+542+81547229.src.rpm
Build Date : Thu 10 Jun 2021 05:10:40 PM CST
Build Host : ord1-prod-x86build005.svc.aws.rockylinux.org
Relocations : (not relocatable)
Packager : infrastructure@rockylinux.org
Vendor : Rocky
URL : http://nginx.org/
Summary : A high performance web server and reverse proxy server
Description :
Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
IMAP protocols, with a strong focus on high concurrency, performance and low
memory usage.


#没有安装,可以指定程序包
[root@rocky86 h]# rpm -qi httpd
package httpd is not installed


#-p指定rpm 包文件,新版可以省略此选项
[root@rocky86 h]# rpm -qip httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64.rpm
Name : httpd
Version : 2.4.37
Release : 47.module+el8.6.0+823+f143cee1.1
Architecture: x86_64
Install Date: (not installed)
Group : System Environment/Daemons
Size : 4499434
License : ASL 2.0
Signature : RSA/SHA256, Wed 11 May 2022 02:40:26 AM CST, Key ID 15af5dac6d745a60
Source RPM : httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.src.rpm
Build Date : Wed 11 May 2022 02:06:03 AM CST
Build Host : ord1-prod-x86build003.svc.aws.rockylinux.org
Relocations : (not relocatable)
Packager : infrastructure@rockylinux.org
Vendor : Rocky
URL : https://httpd.apache.org/
Summary : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.

范例:根据文件查询包信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@rocky86 h]# rpm -qf /usr/sbin/nginx 
nginx-1.14.1-9.module+el8.4.0+542+81547229.x86_64

[root@rocky86 h]# rpm -qf /usr/bin/passwd
passwd-0.80-4.el8.x86_64

[root@rocky86 h]# rpm -qf /etc/passwd
setup-2.12.2-6.el8.noarch

#还没安装的包,此处不能省略-p参数
[root@rocky86 h]# rpm -qpf httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64.rpm
httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64

#自己编译的,不属于任何包
[root@rocky86 0727]# rpm -qf test
file /root/0727/test is not owned by any package

范例:查询配置文件

1
2
3
4
5
6
7
8
9
10
[root@rocky86 0727]# rpm -qc nginx
/etc/logrotate.d/nginx
/etc/nginx/fastcgi.conf
......

#没安装的指定包文件,新版可省略-p参数
[root@rocky86 h]# rpm -qpc httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64.rpm
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
......

范例:列出包内所有文件

1
2
3
4
5
6
7
8
9
10
11
[root@rocky86 0727]# rpm -ql nginx
/etc/logrotate.d/nginx
/etc/nginx/fastcgi.conf
......

#没安装的指定包文件,新版可省略-p参数
[root@rocky86 h]# rpm -qpl httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64.rpm
/etc/httpd/conf
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
......

范例:查询文档文件

1
2
3
4
5
6
7
8
9
10
11
[root@rocky86 0727]# rpm -qd nginx
/usr/share/doc/nginx/CHANGES
/usr/share/doc/nginx/README
/usr/share/man/man3/nginx.3pm.gz
......

#指定包文件,新版可省略-p参数
[root@rocky86 h]# rpm -qpd httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64.rpm | head
/usr/share/doc/httpd/ABOUT_APACHE
/usr/share/doc/httpd/CHANGES
......

范例:查询安装脚本

1
2
3
4
5
6
[root@rocky86 h]# rpm -q --scripts postfix
preinstall scriptlet (using /bin/sh):
# Add user and groups if necessary
/usr/sbin/groupadd -g 90 -r postdrop 2>/dev/null
/usr/sbin/groupadd -g 89 -r postfix 2>/dev/null
......

范例:短路安装

1
2
3
4
5
6
7
#短路或,如果没有安装,就执行安装操作
[root@rocky86 v]# rpm -q vsftpd || rpm -ivh vsftpd-3.0.3-35.el8.x86_64.rpm
package vsftpd is not installed
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:vsftpd-3.0.3-35.el8 ################################# [100%]

包卸载

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

范例:

1
2
3
4
5
6
7
8
[root@rocky86 v]# rpm -evh vsftpd
Preparing... ################################# [100%]
Cleaning up / removing...
1:vsftpd-3.0.3-35.el8 ################################# [100%]


[root@rocky86 v]# rpm -q vsftpd
package vsftpd is not installed

范例:短路卸载

1
2
3
4
5
[root@rocky86 v]# rpm -q vsftpd && rpm -evh vsftpd
vsftpd-3.0.3-35.el8.x86_64
Preparing... ################################# [100%]
Cleaning up / removing...
1:vsftpd-3.0.3-35.el8 ################################# [100%]

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

包校验

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

检查包的完整性和签名

1
rpm -K|checksig rpmfile

范例:

1
2
[root@rocky86 v]# rpm -K vsftpd-3.0.3-35.el8.x86_64.rpm 
vsftpd-3.0.3-35.el8.x86_64.rpm: digests signatures OK

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

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#导入公钥
[root@rocky86 v]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

#查看己导入的公钥
[root@rocky86 v]# rpm -qa "gpg-pubkey"
gpg-pubkey-2f86d6a1-5cf7cefb
gpg-pubkey-6d745a60-60287f36

#查看
[root@rocky86 v]# rpm -qi gpg-pubkey-6d745a60-60287f36
Name : gpg-pubkey
Version : 6d745a60
Release : 60287f36
Architecture: (none)
......

软件在安装时,会将包里的每个文件的元数据,如:大小,权限,所有者,时间等记录下来,

可以用来检查包中的文件是否和当初安装时有所变化

格式:

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


#字段说明
S #文件大小不一样
M #文件权限不一样或文件类型不一样
5 #md5 校验值不一样
D #版本号值不一样
L #链接路径不一样
U #属主发生了改变
G #属组发生了改变
T #修改时间发生了改变
P #功能发生了改变
c|d|g|l|r #文件类型 c配置文件, d数据文件,g该文件不属于此处,l许可文件(licens file),r自述文件(READ ME)


#如果占位符是 . 则表示该处与安装时没有任何改变

范例:

1
2
3
4
5
6
7
8
9
10
11
#安装之后没有修改任何文件
[root@rocky86 v]# rpm -V vsftpd
[root@rocky86 v]# echo $?
0

#安装之后修改了配置文件
[root@rocky86 v]# rpm -V nginx
S.5....T. c /etc/nginx/nginx.conf

[root@rocky86 v]# echo $?
1

数据库

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

1
2
3
4
5
6
[root@rocky86 v]# ll /var/lib/rpm
total 144016
-rw-r--r--. 1 root root 5218304 Jul 27 16:11 Basenames
-rw-r--r--. 1 root root 16384 Jul 20 16:09 Conflictname
-rw-r--r-- 1 root root 286720 Jul 27 16:21 __db.001
......

可以重建数据库

1
2
3
4
rpm {--initdb|--rebuilddb} 

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

包更新日志

1
rpm -q --changelog packageName

范例:

1
2
3
4
5
6
[root@rocky86 v]# rpm -q --changelog nginx 
* Thu Jun 10 2021 Mustafa Gezen <mustafa@rockylinux.org> - 1.14.1-9
- Debrand default pages

* Fri Aug 30 2019 Lubos Uhliarik <luhliari@redhat.com> - 1:1.14.1-9
......

yum和dnf

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

YUM: Yellowdog Update Modififier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具

CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的

1
2
[root@loaclhost ~]$ll /usr/bin/yum 
lrwxrwxrwx. 1 root root 5 Mar 24 17:08 /usr/bin/yum -> dnf-3

yum/dnf 工作原理

yum/dnf 是基于C/S 模式

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

yum 实现过程

先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录 repodata下),当yum客户端利用yum/dnf工具进行安装时包时,会自动下载repodata中的元数据,查询元数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。

3

创建新源

当使用yum install xxx 或 yum update xxx 时

先去看源能不能连上,如果能连上,则下载源里面的 repodata(如果不是新源,则直接查询本地己存在的repodata)

然后再去 repodata 里面查询,是否有 xxx 包,如果有,则去源的服务器下载 xxx.rpm(包括依赖包)

然后开始安装,完成后删除包信息

yum客户端配置

yum客户端配置文件

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

获得帮助

1
[root@rocky86 ~]# man 5 yum.conf

公共配置

1
2
3
4
5
6
7
8
9
10
[root@rocky86 ~]# ll /etc/yum.conf 
lrwxrwxrwx. 1 root root 12 Mar 24 17:08 /etc/yum.conf -> dnf/dnf.conf

[root@rocky86 ~]# cat /etc/yum.conf
[main]
gpgcheck=1 #安装包前要做包的合法和完整性校验
installonly_limit=3 #同时可以安装3个包,最小值为2,如设为0或1,为不限制
clean_requirements_on_remove=True #删除包时,是否将不再使用的包删除
best=True #升级时,自动选择安装最新版,即使缺少包的依赖
skip_if_unavailable=False #跳过不可用的

repo仓库配置文件指向的定义

1
2
3
4
5
6
7
8
9
10
[repositoryID] 
name=Some name for this repository #仓库名称
baseurl=url://path/to/repository/ #仓库地址
mirrorlist=http://list/ #仓库地址列表,在这里写了多个 baseurl指向的地址
enabled={1|0} #是否启用,默认值为1,启用
gpgcheck={1|0} #是否对包进行校验,默认值为1
gpgkey={URL|file://FILENAME} #校验key的地址
enablegroups={1|0} #是否启用yum group,默认值为 1
failovermethod={roundrobin|priority} #有多个baseurl,此项决定访问规则,roundrobin 随机,priority:按顺序访问
cost=1000 #开销,或者是成本,YUM程序会根据此值来决定优先访问哪个源,默认为1000

baseurl 有多种写法,支持多种协议

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

1
2
3
4
baseurl=file:///cdrom/AppStream/
baseurl=https://mirrors.aliyun.com/rockylinux/8.6/AppStream/x86_64/os/
baseurl=http://mirrors.aliyun.com/rockylinux/8.6/AppStream/x86_64/os/
baseurl=ftp://10.0.0.159/

常见变量

1
2
3
4
5
6
7
8
9
$arch                 #CPU架构 aarch64|i586|i686|x86_64
$basearch #系统基本体系结构i386|x86_64
$releasever #系统版本

#带变量的写法
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-$releasever

#替换后的值
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=x86_64&repo=BaseOS-8

RockyLinux国内源

来源机构 地址
阿里云 https://mirrors.aliyun.com/rockylinux/
中国科学技术大学 http://mirrors.ustc.edu.cn/rocky/
南京大学 https://mirrors.nju.edu.cn/rocky/
上海交通大学 https://mirrors.sjtug.sjtu.edu.cn/rocky/
东软信息学院 http://mirrors.neusoft.edu.cn/rocky/

Rocky8.6上配置aliyun的repo源

1
2
3
4
5
[root@rocky86 yum.repos.d]# cat aliyun-baseos.repo 
[aliyun-baseos]
name=aliyun baseos
baseurl=https://mirrors.aliyun.com/rockylinux/8.6/BaseOS/x86_64/os/
gpgcheck=0

Rocky8.6上配置南京大学的repo源

1
2
3
4
5
[root@rocky86 yum.repos.d]# cat nju-extras.repo
[nju-extras]
name=nju extras
baseurl=https://mirrors.nju.edu.cn/rocky/8.6/extras/x86_64/os/
gpgcheck=0

Rocky8.6上配置 本地repo源

1
2
3
4
5
[root@rocky86 yum.repos.d]# cat cdrom-appstream.repo 
[cdrom-appstream]
name=cdrom appstream
baseurl=file:///cdrom/AppStream/
gpgcheck=0

yum-config-manager

安装

该命令来自 yum-utils 包

1
2
3
4
5
6
7
[root@rocky86 yum.repos.d]# rpm -qf `which yum-config-manager `
yum-utils-4.0.21-11.el8.noarch

#常用选项
--add-repo=URL #添加repo源
--disable repoid #禁用源
--enable repoid #启用源

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#添加repo源
[root@rocky86 ~]# yum-config-manager --add-repo=https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
Adding repo from: https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/

#查看
[root@rocky86 yum.repos.d]# cat mirrors.nju.edu.cn_epel_8_Everything_x86_64_.repo
[mirrors.nju.edu.cn_epel_8_Everything_x86_64_]
name=created by dnf config-manager from https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
baseurl=https://mirrors.nju.edu.cn/epel/8/Everything/x86_64/
enabled=1

#禁用源
[root@rocky86 yum.repos.d]# yum-config-manager --disable mirrors.nju.edu.cn_epel_8_Everything_x86_64_

#启用源
[root@rocky86 yum.repos.d]# yum-config-manager --enable mirrors.nju.edu.cn_epel_8_Everything_x86_64_

yum命令

yum 命令用法

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
yum [options] COMMAND

#常用选项
-c file|--config file #指定配置文件,默认使用 /etc/yum.conf
-v|--verbose #显示详细信息
-b|--best #尝试在可用包中寻找最匹配的版本
-y|--assumeyes #自动回答为 yes
--nogpgcheck #不进行包校验
--repo repoid|--repoid repoid #指定repo源
--enablerepo repoid #临时启用repo源,可用通配符
--disablerepo repoid #临时禁用repo源,可用通配符
--nodocs #不安装文档
--skip-broken #跳过有问题的包
--enable #启用源,配合 config-manager
--disable #禁用源,配合 config-manager
-x package|--exclude package|--excludepkgs package #排除指定包,可用通配符
--downloadonly #只下载,不安装


#常用子命令
autoremove #卸载包,同时卸载依赖
check-update #检查可用更新
clean #清除本地缓存
downgrade #包降级
group #包组相关
help #显示帮助信息
history #显示history
info #显示包相关信息
install #包安装
list #列出所有包
makecache #重建缓存
reinstall #重装
remove #卸载
repolist #显示或解析repo源
search #包搜索,包括包名和描述

显示仓库列表

格式

1
2
3
4
5
6
7
8
yum repolist [options]

#常用选项
-v|--verbose #显示详细信息
--repo repoid|--repoid repoid #指定repo源
--all #显示所有源
--enabled #所有enabled状态的源,默认项
--disabled #所有disabled 的源

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#默认显示所有 enable 的 repo
[root@rocky86 yum.repos.d]# yum repolist
repo id repo name
aliyun-baseos aliyun baseos
cdrom-appstream cdrom appstream
nju-extras nju extras


#同默认选项
[root@rocky86 yum.repos.d]# yum repolist --enabled
repo id repo name
aliyun-baseos aliyun baseos
cdrom-appstream cdrom appstream
nju-extras nju extras

#显示disabled 的源
[root@rocky86 yum.repos.d]# yum repolist --disabled

特别提示

1
2
3
4
5
6
yum repolist enabled 等价于 yum repolist --enabled

但是
yum repolist --enabled 可以写成 yum --enabled repolst

yum repolist enabled 不能写成 yum enabled repolist

范例:显示指定源具体信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@rocky86 yum.repos.d]# yum repolist --repoid=aliyun-baseos -v
Loaded plugins: builddep, changelog, config-manager, copr, debug, debuginfo-install, download,
generate_completion_cache, groups-manager, kpatch, needs-restarting, playground, repoclosure, repodiff,
repograph, repomanage, reposync
YUM version: 4.7.0
cachedir: /var/cache/dnf
Last metadata expiration check: 0:11:43 ago on Wed 27 Jul 2022 09:00:06 PM CST.
Repo-id : aliyun-baseos
Repo-name : aliyun baseos
Repo-revision : 8.6
Repo-distro-tags : [cpe:/o:rocky:rocky:8]: , , 8, L, R, c, i, k, n, o, u, x, y
Repo-updated : Fri 22 Jul 2022 12:15:13 PM CST
Repo-pkgs : 2,200
Repo-available-pkgs: 2,198
Repo-size : 2.6 G
Repo-baseurl : https://mirrors.aliyun.com/rockylinux/8.6/BaseOS/x86_64/os/
Repo-expire : 172,800 second(s) (last: Wed 27 Jul 2022 09:00:06 PM CST)
Repo-filename : /etc/yum.repos.d/aliyun-baseos.repo
Total packages: 2,200

显示程序包

格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
yum list [options] [PACKAGE [PACKAGE ...]

#常用选项
--all #显示所有包,包括己安装的和repo源中的可用包
--available #所有可用包
--installed #所有己安装的包
--extras #所有额外包
--updates #所有可更新的包


#上述选项可以替换成对应的 all,installed 这种子命令,但要注意位置

--showduplicates #相同的包,显示所有版本

选项可以放在参数后面,但子命令不行

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#参数写法,位置不一样,但结果相同
[root@rocky86 ~]# yum list sos --installed
Installed Packages
sos.noarch 4.2-15.el8 @anaconda

[root@rocky86 ~]# yum list --installed sos
Installed Packages
sos.noarch 4.2-15.el8 @anacond

#子命令写法,位置不一样,结果不同
[root@rocky86 ~]# yum list installed sos
Installed Packages
sos.noarch 4.2-15.el8 @anaconda

[root@rocky86 ~]# yum list sos installed
Last metadata expiration check: 1:01:48 ago on Thu 28 Jul 2022 09:55:02 AM CST.
Installed Packages
sos.noarch 4.2-15.el8 @anaconda
Available Packages
sos.noarch 4.2-19.el8_6 aliyun-baseo

不带包名时,结果一致

1
2
3
4
5
6
7
#子命令写法
[root@rocky86 ~]# yum list installed | wc -l
1421

#选项写法
[root@rocky86 ~]# yum list --installed | wc -l
1421

范例:

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
#显示所有包,包括己安装的和repo源中的可用包
[root@rocky86 yum.repos.d]# yum list


#默认同 all
[root@rocky86 yum.repos.d]# yum list | wc -l
7168

[root@rocky86 yum.repos.d]# yum list --all | wc -l
7168


#所有可用包
[root@rocky86 yum.repos.d]# yum list --available | wc -l
5747

#所有己安装的包
[root@rocky86 yum.repos.d]# yum list --installed

#所有可更新的包
[root@rocky86 yum.repos.d]# yum list --updates

#己安装的是 4.2-15
[root@rocky86 yum.repos.d]# yum list --installed | grep sos
sos.noarch 4.2-15.el8 @anaconda

#可更新到 4.2-19
[root@rocky86 yum.repos.d]# yum list --updates | grep sos
sos.noarch 4.2-19.el8_6 aliyun-baseos

#所有以 z 开头的包,包括己安装的和可安装的
[root@rocky86 yum.repos.d]# yum list --all z*

范例:显示所有可用包

1
2
3
4
5
6
7
8
9
10
11
12
13
#默认显示4.2-19
[root@rocky86 ~]# yum list --available sos
Last metadata expiration check: 1:13:48 ago on Thu 28 Jul 2022 09:55:02 AM CST.
Available Packages
sos.noarch 4.2-19.el8_6 aliyun-baseos


#其实有两个版本
[root@rocky86 ~]# yum list --available --showduplicates sos
Last metadata expiration check: 1:14:00 ago on Thu 28 Jul 2022 09:55:02 AM CST.
Available Packages
sos.noarch 4.2-15.el8 aliyun-baseos
sos.noarch 4.2-19.el8_6 aliyun-baseo

范例:指定repo源

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
#两个源都有php包
[root@rocky86 yum.repos.d]# yum list --available php
Last metadata expiration check: 0:00:50 ago on Thu 28 Jul 2022 11:15:47 AM CST.
Available Packages
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda aliyun-appstream
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda cdrom-appstream


#禁用某个源
[root@rocky86 yum.repos.d]# yum list --available --disablerepo=cdrom-appstream php
Last metadata expiration check: 0:03:10 ago on Thu 28 Jul 2022 11:15:47 AM CST.
Available Packages
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda aliyun-appstrea


#只能使用某个源
[root@rocky86 yum.repos.d]# yum list --available --repo=cdrom-appstream php
Last metadata expiration check: 14:19:19 ago on Wed 27 Jul 2022 09:00:08 PM CST.
Available Packages
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda cdrom-appstrea


#通配符写法
[root@rocky86 yum.repos.d]# yum list --available --repo=cd* php
Last metadata expiration check: 14:19:48 ago on Wed 27 Jul 2022 09:00:08 PM CST.
Available Packages
php.x86_64 7.2.24-1.module+el8.4.0+413+c9202dda cdrom-appstrea

范例:通配符写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@rocky86 yum.repos.d]# yum list --available --repoid=a* --repoid=cd* *sos*
Last metadata expiration check: 0:08:32 ago on Thu 28 Jul 2022 11:15:47 AM CST.
Available Packages
abrt-plugin-sosreport.x86_64 2.10.9-21.el8.rocky.0 aliyun-appstream
abrt-plugin-sosreport.x86_64 2.10.9-21.el8.rocky.0 cdrom-appstream
sos.noarch 4.2-19.el8_6 aliyun-baseos
sos-audit.noarch 4.2-19.el8_6 aliyun-baseos
sos-collector.noarch 1.8-2.el8 aliyun-appstream
sos-collector.noarch 1.8-2.el8 cdrom-appstream


[root@rocky86 yum.repos.d]# yum list --installed *sos*
Installed Packages
sos.noarch 4.2-15.el8 @anacond

安装程序包

1
2
3
4
5
6
7
8
yum install [options] PACKAGE [...]
yum reinstall [options] PACKAGE [...]


#常用选项
--installroot path #指定安装目录
--downloadonly #只下载,不安装
--downloaddir path|--destdir path #指定下载目录,如果下载目录不存在,则自动创建

范例:

1
2
3
4
5
6
7
8
[root@rocky86 yum.repos.d]# rpm -q httpd
package httpd is not installed

#安装
[root@rocky86 yum.repos.d]# yum install httpd

#只下载不安装
[root@rocky86 yum.repos.d]# yum install httpd --downloadonly --downloaddir=/tmp/httpd

卸载程序包

1
2
yum remove [options] PACKAGE [...]
yum erase [options] PACKAGE [...]

范例:

1
2
3
4
5
[root@rocky86 yum.repos.d]# yum remove httpd


#卸载多个包
[root@rocky86 yum.repos.d]# yum erase httpd ngnix

升级和降级

1
2
3
yum update [options] PACKAGE [...]            #升级
yum downgrade [options] PACKAGE [...] #降级
yum check-update #检查可用升级

范例:

1
2
3
4
5
6
7
8
9
10
#列出所有可更新的包
[root@rocky86 yum.repos.d]# yum check-update

#检查指定的包是否可更新
[root@rocky86 yum.repos.d]# yum check-update sos
Last metadata expiration check: 0:50:56 ago on Thu 28 Jul 2022 01:19:46 PM CST.
sos.noarch 4.2-19.el8_6 aliyun-baseo

#升级指定包
[root@rocky86 yum.repos.d]# yum update sos

查询

1
2
3
4
5
yum info [options] PACKAGE [...]      #查看程序包的 information 信息
yum provides [options] PROVIDE #查看文件是由哪个包提供
yum search [options] KEYWORD #根据关健字搜索,范围包括包名和描述信息
yum deplist [options] PACKAGE [...] #查询包的依赖

范例:

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
#所有包
[root@rocky86 yum.repos.d]# yum info sos
Last metadata expiration check: 1:10:03 ago on Thu 28 Jul 2022 01:19:46 PM CST.
Installed Packages
Name : sos
Version : 4.2
Release : 15.el8
Architecture : noarch
Size : 2.5 M
Source : sos-4.2-15.el8.src.rpm
Repository : @System
From repo : anaconda
Summary : A set of tools to gather troubleshooting information from a system
URL : https://github.com/sosreport/sos
License : GPLv2+
Description : Sos is a set of tools that gathers information about system
: hardware and configuration. The information can then be used for
: diagnostic purposes and debugging. Sos is commonly used to help
: support technicians and developers.
Available Packages
Name : sos
Version : 4.2
Release : 19.el8_6
Architecture : noarch
Size : 776 k
Source : sos-4.2-19.el8_6.src.rpm
Repository : aliyun-baseos
Summary : A set of tools to gather troubleshooting information from a system
URL : https://github.com/sosreport/sos
License : GPLv2+
Description : Sos is a set of tools that gathers information about system
: hardware and configuration. The information can then be used for
: diagnostic purposes and debugging. Sos is commonly used to help
: support technicians and developers.



#己安装的包
[root@rocky86 yum.repos.d]# yum info --installed sos
Installed Packages
Name : sos
Version : 4.2
Release : 15.el8
Architecture : noarch
Size : 2.5 M
Source : sos-4.2-15.el8.src.rpm
Repository : @System
From repo : anaconda
Summary : A set of tools to gather troubleshooting information from a system
URL : https://github.com/sosreport/sos
License : GPLv2+
Description : Sos is a set of tools that gathers information about system
: hardware and configuration. The information can then be used for
: diagnostic purposes and debugging. Sos is commonly used to help
: support technicians and developers.

范例:rpm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@rocky86 yum.repos.d]# rpm -qi sos
Name : sos
Version : 4.2
Release : 15.el8
Architecture: noarch
Install Date: Sun 03 Jul 2022 08:50:37 PM CST
Group : Applications/System
Size : 2597877
License : GPLv2+
Signature : RSA/SHA256, Mon 02 May 2022 06:18:20 PM CST, Key ID 15af5dac6d745a60
Source RPM : sos-4.2-15.el8.src.rpm
Build Date : Tue 12 Apr 2022 03:03:04 PM CST
Build Host : ord1-prod-a64build004.svc.aws.rockylinux.org
Relocations : (not relocatable)
Packager : infrastructure@rockylinux.org
Vendor : Rocky
URL : https://github.com/sosreport/sos
Summary : A set of tools to gather troubleshooting information from a system
Description :
Sos is a set of tools that gathers information about system
hardware and configuration. The information can then be used for
diagnostic purposes and debugging. Sos is commonly used to help
support technicians and developers.

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

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
#默认所有
[root@rocky86 yum.repos.d]# yum provides /usr/sbin/sos
Last metadata expiration check: 1:19:01 ago on Thu 28 Jul 2022 01:19:46 PM CST.
sos-4.2-15.el8.noarch : A set of tools to gather troubleshooting information from a system
Repo : @System
Matched from:
Filename : /usr/sbin/sos
sos-4.2-15.el8.noarch : A set of tools to gather troubleshooting information from a system
Repo : aliyun-baseos
Matched from:
Filename : /usr/sbin/sos
sos-4.2-19.el8_6.noarch : A set of tools to gather troubleshooting information from a system
Repo : aliyun-baseos
Matched from:
Filename : /usr/sbin/sos


#指定repo源
[root@rocky86 yum.repos.d]# yum provides /usr/sbin/nginx --repoid=cdrom-appstream
Last metadata expiration check: 17:52:24 ago on Wed 27 Jul 2022 09:00:08 PM CST.
nginx-1:1.14.1-9.module+el8.4.0+542+81547229.x86_64 : A high performance web server and reverse proxy server
Repo : @System
Matched from:
Filename : /usr/sbin/nginx
nginx-1:1.14.1-9.module+el8.4.0+542+81547229.x86_64 : A high performance web server and reverse proxy server
Repo : cdrom-appstream
Matched from:
Filename : /usr/sbin/nginx

在包名和关键字中搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@rocky86 ~]# yum search redis
Last metadata expiration check: 1:46:18 ago on Thu 28 Jul 2022 01:19:46 PM CST.
====================== Name Exactly Matched: redis ======================
redis.x86_64 : A persistent key-value database
===================== Name & Summary Matched: redis ======================
pcp-pmda-redis.x86_64 : Performance Co-Pilot (PCP) metrics for Redis
redis-devel.x86_64 : Development header for Redis module development
redis-doc.noarch : Documentation for Redis including man pages

#多个关键字,且 关系
[root@rocky86 ~]# yum search redis key-value
Last metadata expiration check: 1:49:16 ago on Thu 28 Jul 2022 01:19:46 PM CST.
===================== Name & Summary Matched: key-value, redis ==============
redis.x86_64 : A persistent key-value database

查看指定包所依赖的库和程序

1
2
3
4
5
6
[root@rocky86 ~]# yum deplist nginx --installed
package: nginx-1:1.14.1-9.module+el8.4.0+542+81547229.x86_64
dependency: /bin/sh
dependency: config(nginx) = 1:1.14.1-9.module+el8.4.0+542+81547229
dependency: libc.so.6()(64bit)
......

仓库缓存

缓存目录为 /var/cache/dnf/ ( /var/cache/yum/ )

1
2
yum clean [options] {metadata,packages,dbcache,expire-cache,all}               #清空缓存
yum makecache #构建缓存

范例:

1
2
[root@rocky86 ~]# yum clean all
[root@rocky86 ~]# yum makecache

查看yum事务历史

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

日志文件 /var/log/dnf.log ( /var/log/yum.log )

1
2
3
4
5
6
7
8
9
yum history [options] [info|list|redo|undo]

yum history #默认查看所有
yum history list #同上
yum history package #查看与指定包有关的日志

info N #查看第N条记录的具体执行内容
undo N #回滚第N条记录
redo N #重新执行第N条记录

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@rocky86 yum.repos.d]# yum history
ID | Command line | Date and time | Action(s) | Altered
------------------------------------------------------------------------------------------------------------
12 | install -y autofs | 2022-05-09 15:26 | Install | 1
11 | -y install redis | 2022-05-05 09:59 | Install | 1
10 | remove redis | 2022-05-05 09:59 | Removed | 1
9 | install gcc-c++ | 2022-05-03 08:56 | I, U | 3
8 | install -y php | 2022-04-30 17:22 | Install | 14
7 | install -y gcc | 2022-04-30 16:28 | I, U | 9
6 | install -y redis | 2022-04-28 08:51 | Install | 1
5 | install -y patch | 2022-04-26 17:06 | Install | 1
4 | install postfix | 2022-04-20 15:48 | Install | 1
3 | | 2022-04-19 20:01 | Install | 1
2 | remove cockpit | 2022-04-09 18:20 | Removed | 1
1 | | 2022-04-05 22:23 | Install | 1378 EE

范例:查看详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@rocky86 yum.repos.d]# yum history info 10
Transaction ID : 10
Begin time : Thu 07 Jul 2022 05:45:58 PM CST
Begin rpmdb : 1369:90d27365a8703f09a08db06a491620ab881c4789
End time : Thu 07 Jul 2022 05:46:01 PM CST (3 seconds)
End rpmdb : 1373:d3940c76e2de15edf987259441fd48582757a5c0
User : root <root>
Return-Code : Success
Releasever : 8
Command Line : install pcre-devel
Comment :
Packages Altered:
Install pcre-cpp-8.42-6.el8.x86_64 @aliyun-base-os
Install pcre-devel-8.42-6.el8.x86_64 @aliyun-base-os
Install pcre-utf16-8.42-6.el8.x86_64 @aliyun-base-os
Install pcre-utf32-8.42-6.el8.x86_64 @aliyun-base-os

范例:包历史查询

1
2
3
4
5
6
[root@rocky86 yum.repos.d]# yum history redis
ID | Command line | Date and time | Action(s) | Altered
--------------------------------------------------------------------------------------------------
8 | install -y redis | 2022-07-05 16:56 | Install | 1
7 | remove -y redis | 2022-07-05 16:52 | Removed | 1
6 | install -y redis | 2022-07-05 16:50 | Install | 1

安装及升级本地程序包

1
2
3
yum localinstall|install [options] rpmfile1 [...] #安装本地RPM包

yum localupdate|update [options] rpmfile1 [...] #使用本地RPM包升级

包组管理的相关命令

1
2
3
4
5
yum grouplist [options]                     #列出所有包组
yum groupinstall [options] group1 [...] #包组安装
yum groupupdate [options] group1 [...] #包组升级
yum groupremove [options] group1 [...] #包组卸载
yum groupinfo [options] group1 [...] #包组查询

范例:

1
2
3
4
5
6
7
8
9
10
[root@rocky86 yum.repos.d]# yum grouplist
......
......

[root@rocky86 yum.repos.d]# yum groupinfo "Server with GUI"
......
......

[root@rocky86 yum.repos.d]# yum groupinfo "Core"
[root@rocky86 yum.repos.d]# yum groupinstall "Server with GUI"

实现私用 yum仓库

架构图

4

ip 角色
10.0.0.150 yum server
10.0.0.152 client

步骤

  1. 在 yum server 机上搭建 web 服务,保证其它机器能能过web服务访问本机
  2. 在 yum server 机上搭建 yum 仓服务
  3. 在 client 机上将yum 的 repos 源指向 yum server 机
  4. 测试

服务端配置

1
2
3
4
5
6
7
8
9
10
[root@rocky86 ~]# yum install -y httpd
[root@rocky86 ~]# systemctl enable --now httpd.service

#将阿里云的extras 源的相关数据下载到本地,给客户端使用
[root@rocky86 ~]# yum reposync --repoid=aliyun-extras --download-metadata -p /var/www/html/

#将本地光盘中的内容CP到web目录中,给客户端使用
[root@rocky86 ~]# mkdir /cdrom
[root@rocky86 ~]# mount /dev/sr0 /cdrom
[root@rocky86 ~]# cp -r /cdrom/BaseOS/* /var/www/html/BaseOS

客户端配置

1
2
3
4
5
6
7
8
9
10
11
[root@rocky86 ~]# cat /etc/yum.repos.d/private-extras.repo 
[private-extras]
name=private extras
baseurl=http://10.0.0.157/extras/
gpgcheck=0

[root@rocky86 ~]# cat /etc/yum.repos.d/private-baseos.repo
[private-baseos]
name=private baseos
baseurl=http://10.0.0.157/BaseOS/
gpgcheck=0

yum仓同步同工具

1
2
3
4
5
6
7
#CentOS 8 dnf 工具集成
dnf reposync --repoid=REPOID --download-metadata -p /path

dnf reposync --help #查看帮助

#CentOS 7 以前版本,reposync工具来自于yum-utils包
reposync --repoid=REPOID --download-metadata -p /path

创建YUM仓工具

可以根据目录中的 rpm 包生成 repodata 元数据

1
createrepo [OPTION] <directory_to_index>

DNF 介绍

DNF,即DaNdiFied,是新一代的RPM软件包管理器。DNF 发行日期是2015年5月11日,DNF 包管理器采用Python 编写,发行许可为GPL v2,首先出现在Fedora 18 发行版中。在 RHEL 8.0 版本正式取代了 YUM,DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等;

yum程序在安装的过程中,如果被终止,下次再执行将无法解决依赖,DNF可解决此问题;

1
2
3
4
5
6
7
8
9
10
11
12
#配置文件
/etc/dnf/dnf.conf

#仓库文件
/etc/yum.repos.d/ *.repo

#日志
/var/log/dnf.rpm.log
/var/log/dnf.log

#使用帮助
man dnf

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

CentOS 7 使用 dnf ,下载并安装下面包

1
2
3
4
5
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.4-2.sdl7.noarch.rpm 
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf-0.6.4-2.sdl7.noarch.rpm
wget https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/python2-libcomps-0.1.8-12.el7.x86_64.rpm
wget https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/libcomps-0.1.8-12.el7.x86_64.rpm

yum Troubleshooting

故障排错:

yum 和 dnf 失败最主要原因 解决方法
yum的配置文件格式或路径错误 检查/etc/yum.repos.d/*.repo文件格式
yum cache yum clean all
网络不通 网卡配置

Ubuntu 软件管理

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

  • dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项
  • apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构(c/s)

rhel 系列与 debian系列包管理对比

操作系统 包文件后缀 本地包管理器 网络包管理器 网络包管理工作模式 配置文件
rhel rpm rpm yum/dnf C/S /etc/yum.repos.d/*.repo
debian deb dpkg apt C/S /etc/apt/sources.list

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 包管理器

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
dpkg [<option> ...] <command>
#常用选项
-i|--install package.deb #安装包
--unpack package.deb #解包
-r|--remove packageName #删除包,不建议,不自动卸载依赖于它的包
-P|--purge packageName #删除包(包括配置文件)
-V|--verify packageName #检查包是否安装
--get-selections pattern #根据正则筛选包,并打出列表
--set-selections #从标准输入里读出要选择的软件。
--clear-selections #取消选中所有不必要的软件包。
--update-avail packageFile #替换现有可安装的软件包信息。
--merge-avail packageFile #把文件中的信息合并到系统中。
--clear-avail #清除现有的软件包信息。
--forget-old-unavail #忘却已被卸载的不可安装的软件包。
-s|--status packageName #显示指定软件包的详细状态,类似于 rpm -qi
-p|--print-avail packageName #显示当前机器上所有可安装的包
-L|--listfiles packageName #列出属于指定软件包的文件,类似于 rpm -ql
-l|--list [pattern] #列出当前己安装的包,类似于rpm -qa
-S|--search pattern #根据文件查询是来自于哪个包,类似于 rpm -qf
-C|--audit [pattern] #检查是否有软件包残损
--yet-to-unpack #列出标记为待解压的软件包
--predep-package #列出待解压的预依赖
--compare-vesions v1 - b #比较版本号
--force-help #显示本强制选项的帮助信息
-Dh|--debug=help #显示有关出错调试的帮助信息
--info packageFile #列出包相关信息
-c packageFile #列出包内文件,类似于 rpm -qpl

范例:查询包是否安装

1
2
3
4
5
6
7
8
root@ubuntu22:~# dpkg -V vim
root@ubuntu22:~# echo $?
0

root@ubuntu22:~# dpkg -V nginx
dpkg: package 'nginx' is not installed
root@ubuntu22:~# echo $?
1

范例:安装卸载

dpkg 的软件安装分为解包和配置两部份

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
#查询
root@ubuntu22:~# dpkg -V firmware-sof-signed
dpkg: package 'firmware-sof-signed' is not installed

#安装
root@ubuntu22:~# dpkg -i /cdrom/pool/restricted/f/firmware-sof/firmware-sof-signed_2.0-1ubuntu2_all.deb
Selecting previously unselected package firmware-sof-signed.
(Reading database ... 108476 files and directories currently installed.)
Preparing to unpack .../firmware-sof-signed_2.0-1ubuntu2_all.deb ...
Unpacking firmware-sof-signed (2.0-1ubuntu2) ...
Setting up firmware-sof-signed (2.0-1ubuntu2) ...

#查询
root@ubuntu22:~# dpkg -l firmware-sof-signed
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-===================-============-============-=================================
ii firmware-sof-signed 2.0-1ubuntu2 all Intel SOF firmware - signed

#卸载
root@ubuntu22:~# dpkg -r firmware-sof-signed
(Reading database ... 108702 files and directories currently installed.)
Removing firmware-sof-signed (2.0-1ubuntu2) ...

范例:根据条件列出己安装的包

1
2
3
4
5
root@ubuntu22:~# dpkg --get-selections v*
vim install
vim-common install
vim-runtime install
vim-tiny install

范例:显示所有可安装的包

1
2
3
4
5
6
7
8
9
10
11
12
root@ubuntu22:~# dpkg -p
......

#显示指定包
root@ubuntu22:~# dpkg -p mawk
Package: mawk
Priority: required
Section: utils
Installed-Size: 229
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
......

范例:显示己安装的列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mage@ubuntu22:~$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-====================-=====================-==========-=============================>
ii adduser 3.118ubuntu5 all add and remove users and groups
ii amd64-microcode 3.20191218.1ubuntu2 amd64 Processor microcode firmware for AMD CPUs
ii apparmor 3.0.4-2ubuntu2 amd64 user-space parser utility for AppArmor
ii apport-symptoms 0.24 all symptom scripts for apport
ii apt 2.4.5 amd64 commandline package manager
ii apt-utils 2.4.5 amd64 package management related utility programs
ii base-files 12ubuntu4 amd64 Debian base system miscellaneous files
ii base-passwd 3.5.52build1 amd64 Debian base system master password and group files
ii bash 5.1-6ubuntu1 amd64 GNU Bourne Again SHell
ii bash-completion 1:2.11-5ubuntu1 all programmable completion for the bash shell

范例:通配符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mage@ubuntu22:~$ dpkg -l "vi*"
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-====================-===================-=============-=============================
ii vim 2:8.2.3995-1ubuntu2 amd64 Vi IMproved - enhanced vi editor
un vim-athena <none> <none> (no description available)
ii vim-common 2:8.2.3995-1ubuntu2 all Vi IMproved - Common files
un vim-doc <none> <none> (no description available)
un vim-gtk3 <none> <none> (no description available)
un vim-nox <none> <none> (no description available)
ii vim-runtime 2:8.2.3995-1ubuntu2 all Vi IMproved - Runtime files
un vim-scripts <none> <none> (no description available)
ii vim-tiny 2:8.2.3995-1ubuntu2 amd64 Vi IMproved - enhanced vi editor - compact version
un virtualbox-guest-modules <none> <none> (no description available)

范例:具体包名

1
2
3
4
5
6
7
mage@ubuntu22:~$ dpkg -l vim
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-======================-===================-==============-=================================
ii vim 2:8.2.3995-1ubuntu2 amd64 Vi IMproved - enhanced vi editor

该列表从左到右共七列

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
#Desired Status Err Name Version Architecture Description

#Desired 期望状态
u Unknown 没有安装过
i Install 请求安装
r Remove 请求卸载
p Purge 请求卸载并清理
h Hold 保持

#Status 当前状态
n Not 软件没有安装
i Inst 安装完成并完成配置
c Conf-files 己卸载,但还有保留配置文件
u Unpacked 己解压缩,但没有配置
f halF-conf 配置时出错
h Half-inst 安装时出错
w trig-aWait 触发器等待
t Trig-pend 触发器是未决状态

#Err 错误状态
正常情况下为空
h 被锁定,有其它包对此依赖,无法升级
r Reinst-required, 被损坏,需要重装才能正常使用
x 被损坏且被锁定

#Name 包名
#Version 版本
#Architecture 平台架构
#Description 包的描述信息

#前三列常见组合
ii #安装成功
pn #安装后卸载
un #没有安装过
iu #安装了但是没有配置
rc #己卸载,但还有配置文件

范例:显示包详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mage@ubuntu22:~$ dpkg -s vim
Package: vim
Status: install ok installed
Priority: optional
Section: editors
Installed-Size: 3916
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Version: 2:8.2.3995-1ubuntu2
Provides: editor
Depends: vim-common (= 2:8.2.3995-1ubuntu2), vim-runtime (= 2:8.2.3995-1ubuntu2), libacl1 (>= 2.2.23), libc6
(>= 2.34), libgpm2 (>= 1.20.7), libpython3.10 (>= 3.10.0), libselinux1 (>= 3.1~), libsodium23 (>= 1.0.14),
libtinfo6 (>= 6)
Suggests: ctags, vim-doc, vim-scripts
Description: Vi IMproved - enhanced vi editor

范例:列出包内所有文件

1
2
3
4
5
6
7
8
9
root@ubuntu22:~# dpkg -L vim
/.
/usr
/usr/bin
/usr/bin/vim.basic
/usr/share
/usr/share/bug
/usr/share/bug/vim
......

范例:查看deb包文件信息

1
2
3
4
5
6
7
8
root@ubuntu22:~# dpkg --info /cdrom/pool/main/a/amd64-microcode/amd64-microcode_3.20191218.1ubuntu2_amd64.deb
new Debian package, version 2.0.
size 32474 bytes: control archive=1720 bytes.
76 bytes, 2 lines conffiles
699 bytes, 17 lines control
973 bytes, 12 lines md5sums
1259 bytes, 46 lines * postinst #!/bin/sh
.......

范例:列出deb包内的所有文件

1
2
3
4
5
6
7
8
9
10
root@ubuntu22:~# dpkg -c /cdrom/pool/main/a/amd64-microcode/amd64-microcode_3.20191218.1ubuntu2_amd64.deb
drwxr-xr-x root/root 0 2021-10-07 10:09 ./
drwxr-xr-x root/root 0 2021-10-07 10:09 ./etc/
drwxr-xr-x root/root 0 2021-10-07 10:09 ./etc/default/
-rw-r--r-- root/root 328 2019-12-21 04:12 ./etc/default/amd64-microcode
drwxr-xr-x root/root 0 2021-10-07 10:09 ./etc/modprobe.d/
-rw-r--r-- root/root 154 2021-10-07 10:09 ./etc/modprobe.d/amd64-microcode-blacklist.conf
drwxr-xr-x root/root 0 2021-10-07 10:09 ./lib/
drwxr-xr-x root/root 0 2021-10-07 10:09 ./lib/firmware/
......

范例:查询文件来自于哪个包

1
2
root@ubuntu22:~# dpkg -S "/etc/ssh/ssh_config"
openssh-client: /etc/ssh/ssh_config

apt

Debian 使用apt 工具集来管理包系统,apt-get 是其中一个常用的命令行工具,另外一款较为流行的命令行与 GUI 兼顾的工具是 aptitude ,之前最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令中。

在 2014 年apt 命令发布第一个稳定版,Ubuntu 16.04 引入新特性之一便是 apt 命令,apt 命令解决了命令过于分散的问题,它包括 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 apt-config,提供管理软件包所需的必要选项

apt 相当于 apt-get、apt-cache 和 apt-config 中最常用命令选项的集合

apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。此外,启用的几个特性也非常有帮助。例如:可以在使用 apt 命令安装或删除程序时看到进度条,apt 还会在更新存储库数据库时提示用户可升级的软件包个数

apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令,也即可用 apt 替换部分apt-get 系列命令,但不是全部

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 显示安装细节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apt [options] command

#options
-h|--help #显示帮助
-v|--version #显示版本
-y|--yes #自动回答yes
-q|--quiet #安静模式

#command
list #根据名称列出软件包
search #搜索软件包描述
show|info #显示软件包细节
install #安装软件包
remove #移除软件包
autoremove #卸载所有自动安装且不再使用的软件包
update #更新可用软件包列表,只更新索引文件,不具体更新软件
upgrade #通过 安装/升级 软件来更新系统
full-upgrade #通过 卸载/安装/升级 来更新系统
edit-sources #编辑软件源信息文件
1
apt --fix-broken install

范例:

1
2
3
4
5
6
7
8
#列出所有包
root@ubuntu22:~# apt list

#列出所有己安装的包
root@ubuntu22:~# apt list --installed

#列出所有可升级的包
root@ubuntu22:~# apt list --upgradeable

范例:指定包名或通配符

1
2
3
4
5
6
7
8
9
10
11
root@ubuntu22:~# apt list redis*
Listing... Done
redis-redisearch-doc/jammy 1:1.2.2-4 all
redis-redisearch/jammy 1:1.2.2-4 amd64
redis-sentinel/jammy 5:6.0.16-1ubuntu1 amd64
redis-server/jammy 5:6.0.16-1ubuntu1 amd64
redis-tools/jammy 5:6.0.16-1ubuntu1 amd64
redis/jammy 5:6.0.16-1ubuntu1 all

root@ubuntu22:~# apt list --installed redis*
Listing... Done

范例:搜索

1
2
3
4
5
6
7
8
#在包名和描述信息中搜索
root@ubuntu22:~# apt search nginx

#使用正则匹配搜索条件
root@ubuntu22:~# apt search "^ngin*"

#仅在包名中搜索
root@ubuntu22:~# apt search --names-only nginx

范例:查询包的具体信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@ubuntu22:~# apt info nginx
Package: nginx
Version: 1.18.0-6ubuntu14.1
Priority: optional
Section: web
Origin: Ubuntu
......

#显示所有版本
root@ubuntu22:~# apt show nginx -a
Package: nginx
Version: 1.18.0-6ubuntu14.1
Priority: optional
Section: web
Origin: Ubuntu
......

Package: nginx
Version: 1.18.0-6ubuntu14
Priority: optional
Section: web
Origin: Ubuntu
......

范例:安装

1
2
3
4
5
6
7
8
9
10
11
12
13
root@ubuntu22:~# apt install nginx

#同时安装多个包
root@ubuntu22:~# apt install nginx redis -y

#安装指定版本的包,默认安装最新版
root@ubuntu22:~# apt install nginx=1.14.0-0ubuntu1

#安装nginx 包,如果己存在,则不升级
root@ubuntu22:~# apt install nginx --no-upgrade

#只升级不安装
root@ubuntu22:~# apt install nginx --only-upgrade

范例:卸载

1
2
3
4
5
#仅卸载nginx包
root@ubuntu22:~# apt remove -y nginx

#卸载所有依赖包
root@ubuntu22:~# apt autoremove nginx

范例:更新和升级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#纺计源中可更新的信息,并不执行具体更新
root@ubuntu22:~# apt update
Hit:1 https://mirrors.aliyun.com/ubuntu jammy InRelease
Get:2 https://mirrors.aliyun.com/ubuntu jammy-updates InRelease [114 kB]
Get:3 https://mirrors.aliyun.com/ubuntu jammy-backports InRelease [99.8 kB]
......
......
Fetched 1,853 kB in 4s (425 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
32 packages can be upgraded. Run 'apt list --upgradable' to see them.

#更新所有己安装的包
root@ubuntu22:~# apt upgrade

#更新某个具体的包
root@ubuntu22:~# apt install --only-upgrade nginx

范例:编辑源

1
2
3
root@ubuntu22:~# apt edit-sources

root@ubuntu22:~# vim /etc/apt/sources.list

范例:缓存信息

1
2
3
4
5
6
7
8
9
10
11
12
#显示当前系统安装包的统计信息,包括己安装的数量,大小,占用空间等
root@ubuntu22:~# apt-cache stats
Total package names: 115071 (3,222 k)
Total package structures: 102921 (4,529 k)
Normal packages: 67637
......

#查看源中指定软件的所有版本
root@ubuntu22:~# apt-cache madison nginx
nginx | 1.18.0-6ubuntu14.1 | https://mirrors.aliyun.com/ubuntu jammy-updates/main amd64 Packages
nginx | 1.18.0-6ubuntu14.1 | https://mirrors.aliyun.com/ubuntu jammy-security/main amd64 Packages
nginx | 1.18.0-6ubuntu14 | https://mirrors.aliyun.com/ubuntu jammy/main amd64 Packages

范例:查询依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#查看nginx有哪些依赖
root@ubuntu22:~# apt-cache depends nginx
nginx
|Depends: nginx-core
|Depends: nginx-full
......
Breaks: <libnginx-mod-http-lua>

#查看nginx被哪些包依赖
root@ubuntu22:~# apt-cache rdepends nginx | head
nginx
Reverse Depends:
nginx-core
nginx-light
nginx-full
nginx-extras
libnginx-mod-stream-geoip
nginx-core
nginx-extras

APT包索引配置文件

更新配置文件之后,要执行 apt update

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

配置文件格式说明

1
2
3
4
5
6
7
8
9
10
11
12
13
deb URL section1 section2

#字段说明
deb #固定开头,表示是二进制包的仓库,如果deb-src开头,表示是源码库
URL #库所在的地址,可以是网络地址,也可以是本地镜像地址
section1 #Ubuntu版本的代号,可用 lsb_release -sc 命令查看,也可以用 cat /etc/os-release
section2 #软件分类,main完全自由软件 restricted不完全自由的软件,universe社区支持的软件,multiverse非自由软件

section1 #主仓
section1-backports #后备仓,该仓中的软件当前版本不一定支持
section1-security #修复仓,主要用来打补丁,有重大漏洞,需要在当前版本中修复时,会放此仓
section1-updates #非安全性更新仓,不影响系统安全的小版本迭代放此仓
section1-proposed #预更新仓,可理解为新版软件的测试放在此仓,测试一段时间后会移动到 updates仓或security仓,非专业人士勿用

示例

1
2
3
4
5
6
7
root@ubuntu22:~# cat /etc/apt/sources.list

deb https://mirrors.aliyun.com/ubuntu jammy main restricted #表示使用主仓中的 main和 restricted 源
# deb-src https://mirrors.aliyun.com/ubuntu jammy main restricted

deb https://mirrors.aliyun.com/ubuntu jammy-updates main restricted
# deb-src https://mirrors.aliyun.com/ubuntu jammy-updates main restricted

在ubuntu库中,有两个重要目录,分别是dists和 pool

dists 目录中存放的是该源仓库中的元数据,包括软件包的名称,适用的架构平台,版本号,依赖关系等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@ubuntu22:~# tree /cdrom/dists/
/cdrom/dists/
├── jammy
│ ├── main
│ │ ├── binary-amd64
│ │ │ ├── Packages.gz
│ │ │ └── Release
│ │ ├── binary-i386
│ │ │ ├── Packages.gz
│ │ │ └── Release
│ │ └── source
│ ├── Release
│ ├── Release.gpg
│ └── restricted
│ ├── binary-amd64
│ │ ├── Packages.gz
│ │ └── Release
│ ├── binary-i386
│ │ ├── Packages.gz
│ │ └── Release
│ └── source
├── stable -> jammy
└── unstable -> jammy

apt命令操作(如安装和删除软件包)日志文件

1
/var/log/dpkg.log

ubuntu 开启root用户远程登录

1
2
3
4
5
6
7
8
9
10
11
12
13
#如果没有设置过root用户密码,先设root密码
sudo passwd root

#切换到 root 用户
su -

#修改配置文件
vim /etc/ssh/sshd_config

#将 #PermitRootLogin yes 改为 PermitRootLogin yes,大约是在 35行,保存退出

#重启sshd服务
service sshd restart

黑客帝国

1
2
3
root@ubuntu20:~# apt install cmatrix
root@ubuntu20:~# cmatrix
root@ubuntu20:~# cmatrix -C blue

好莱坞

1
2
root@ubuntu20:~# apt install hollywood
root@ubuntu20:~# hollywood

查看系统信息

1
2
root@ubuntu20:~# apt install screenfetch
root@ubuntu20:~# screenfetch

程序包编译

源码编译介绍

程序包编译安装:

源代码–>预处理–>编译–>汇编–>链接–>执行

多文件:文件中的代码之间,很可能存在跨文件依赖关系

虽然有很多开源软件将软件打成包,供人们使用,但并不是所有源代码都打成包,如果想使用开源软件,可能需要自已下载源码,进行编译安装。另外即使提供了包,但是生产中需要用于软件的某些特性,仍然需要自行编译安装。但是利用源代码编译安装是比较繁琐的,庆幸的是有相关的项目管理工具可以大大减少编译过程的复杂度

开源程序源代码的获取

官方自建站点:

  • apache.org (ASF:Apache Software Foundation)
  • mariadb.org
  • nginx.org
  • ……

代码托管:

  • github.com
  • gitee.com
  • SourceForge.net
  • code.google.com
  • ……

编译源码的项目工具

C、C++的源码编译:使用 make 项目管理器

​ configure脚本 –> Makefifile.in –> Makefile

​ 相关开发工具:

​ autoconf: 生成confifigure脚本

​ automake:生成Makefifile.in

java的源码编译: 使用 maven

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

利用编译工具,通常只需要三个大的步骤

  1. ./configure

    ​ (1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefifile.in文件生成Makefile

    ​ (2) 检查依赖到的外部环境,如依赖的软件包

  2. make 根据Makefifile文件,构建应用程序

1
2
3
make -j N #并行编译,N为cpu 核数

make -j `grep -c processor /proc/cpuinfo`
  1. make install 复制文件到相应路径

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

编译安装准备

准备:安装相关的依赖包

  • 开发工具: gcc (c/c++编译器GNU C Complier),make
  • 开发环境:开发库(glibc:标准库),头文件,可安装开发包组 Development Tools
  • 特定软件相关依赖包

生产实践:基于最小化安装的系统建议安装下面相关包

1
2
yum install gcc make 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

编译安装

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

其选项主要功能:

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

获取其支持使用的选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/configure --help

#常用选项

#安装路径设定
--prefix=/PATH #指定默认安装位置,默认为/usr/local/
--sysconfdir=/PATH #配置文件安装位置


#软件特性和相关指定

#Optional Features: 可选特性
--disable-FEATURE | --without-poll_module #手动禁用,表示默认是开启的
--enable-FEATURE[=ARG] | --with-FEATURE #通过这种手动添加特性,表示默认没有此特性


#Optional Packages: 可选包
--with-PACKAGE[=ARG] #依赖包
--without-PACKAGE #禁用依赖关系

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

第二步:make

第三步:make install

安装后的配置

  1. 二进制程序目录导入至PATH环境变量中

    ​ 编辑文件 /etc/profile

1
export PATH=/PATH/TO/BIN:$PATH
  1. 相关用户及文件

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

  2. 导入帮助手册

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

编译安装 nginx

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#下载源码
[root@rocky86 src]# wget http://nginx.org/download/nginx-1.23.0.tar.gz

#解包
[root@rocky86 src]# tar xf nginx-1.23.0.tar.gz

#进入目录
[root@rocky86 src]# cd nginx-1.23.0/
[root@rocky86 nginx-1.23.0]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src

#查看编译选项
[root@rocky86 nginx-1.23.0]# ./configure --help

#指定安装目录,开启ssl模块,开始编译
[root@rocky86 nginx-1.23.0]# ./configure --prefix=/lnmp/nginx --with-http_ssl_module
checking for OS
+ Linux 4.18.0-372.9.1.el8.x86_64 x86_64
checking for C compiler ... not found

./configure: error: C compiler cc is not found

#根据提示,安装C编译器
[root@rocky86 nginx-1.23.0]# yum install -y gcc

#再次编译
[root@rocky86 nginx-1.23.0]# ./configure --prefix=/lnmp/nginx --with-http_ssl_module
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

#搜索pcre包
[root@rocky86 nginx-1.23.0]# yum search pcre

#安装pcre包
[root@rocky86 nginx-1.23.0]# yum install -y pcre-devel

#再次编译
[root@rocky86 nginx-1.23.0]# ./configure --prefix=/lnmp/nginx --with-http_ssl_module
./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

#搜索openssl包
[root@rocky86 nginx-1.23.0]# yum search openssl

#安装openssl包
[root@rocky86 nginx-1.23.0]# yum install -y openssl-devel

#再次编译
[root@rocky86 nginx-1.23.0]# ./configure --prefix=/lnmp/nginx --with-http_ssl_module

#生成了Makefile文件
[root@rocky86 nginx-1.23.0]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src

#执行make命令,先安装make
[root@rocky86 nginx-1.23.0]# make
bash: make: command not found...
Install package 'make' to provide command 'make'? [N/y]

#执行make
[root@rocky86 nginx-1.23.0]# make

#执行make install
[root@rocky86 nginx-1.23.0]# make install

#查看
[root@rocky86 nginx-1.23.0]# tree /lnmp/
/lnmp/
└── nginx
├── conf
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf
├── html
│ ├── 50x.html
│ └── index.html
├── logs
└── sbin
└── nginx
5 directories, 18 files

#启动nginx
[root@rocky86 nginx-1.23.0]# /lnmp/nginx/sbin/nginx

#查看版本信息
[root@rocky86 nginx-1.23.0]# /lnmp/nginx/sbin/nginx -V
nginx version: nginx/1.23.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)
built with OpenSSL 1.1.1k FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/lnmp/nginx --with-http_ssl_module

#关闭防火墙 永久关闭 systemctl disable firewalld
[root@rocky86 nginx-1.23.0]# systemctl stop firewalld

#通过浏览器访问 http://10.0.0.158/
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
VERSION=1.23.0
wget http://nginx.org/download/nginx-${VERSION}.tar.gz
tar xf nginx-${VERSION}.tar.gz
cd nginx-${VERSION}
./configure --prefix=/lnmp/nginx --with-http_ssl_module
make && make install
if [ $? -eq 0 ];then
/lnmp/nginx/sbin/nginx
echo "<h1 style='color:red'>magedu</h1>" > /lnmp/nginx/html/index.html
else
echo "nginx install fail"
fi