马哥 Linux SRE + AIOps智能运维文档
第 09 章 / 42

软件管理

← 上一章:磁盘存储和文件系统 | 返回总目录 | 下一章:网络协议和管理 →


Interface) 应用程序二进制接口

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

  • windows 中的是 PE (Portable Executable ) 格式

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

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

[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 是通用的

#将在 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

1.1.2 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标准,程序就在源代码级别可移植了。

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

1.1.3 开发语言

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

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

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

1.2 C语言程序的实现过程

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

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

预处理(Pre-Processing)

  • 1 将所有的#define删除,并且展开所有的宏定义

  • 2 处理所有的条件预编译指令,比如 #if,#ifdef,#elif,#else,#endif 等

  • 3 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置

  • 4 删除所有的注释,//,/**/

  • 5 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号

  • 6 保留所有的#pragma编译指令,因为编译需要使用它们

编译 (Compiling)

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

汇编 (Assembling)

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

链接 (Linking)

通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件

#include <stdio.h>
#include<unistd.h>
intmain() {
while (true){
printf("hello world\n");
sleep(1);
    }
return0;
}
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            #一步到位

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

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

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

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

1.3.1 静态链接

  • 把程序对应的依赖库复制一份到包

  • 生成模块文件libxxx.a

  • 嵌入程序包

  • 升级难,需重新编译

  • 占用较多空间,迁移容易

1.3.2 动态链接

  • 只把依赖加做一个动态链接

  • 生成模块文件libxxx.so

  • 连接指向

  • 占用较少空间,升级方便

1.3.3 模块(库)文件

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

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)

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

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

配置文件

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

缓存文件

/etc/ld.so.cache

2 软件包和包管理器

2.1 软件包介绍

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

2.2 软件包中的文件分类

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

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

rpm2cpio 包文件|cpio –itv                  #预览包内文件
rpm2cpio 包文件|cpio –id “*.conf”          #释放包内文件
[root@rocky8 h]# rpm2cpio httpd-devel-2.4.37-
41.module+el8.5.0+695+1fa8055e.x86_64.rpm |cpio -itv
-rwxr-xr-x1 root     root        23720 Nov 102021 ./usr/bin/apxs
drwxr-xr-x   1 root     root            0 Nov 102021 ./usr/include/httpd
-rw-r--r--1 root     root           14 Nov 102021 ./usr/include/httpd/.mmn
-rw-r--r--1 root     root         1075 Nov 102021
./usr/include/httpd/ap_compat.h
..............

2.3 程序包管理器

软件包管理器功能:

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

主流的程序包管理器:

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

2.4 包命名

源代码打包文件命名

name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
#nginx-1.22.0.tar.gz
#major     主版本号
#minor     次版本号
#release   修正版本号

rpm包命名方式

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

[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包

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

2.5 分类和拆包

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

包的分类

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

2.6 包的依赖

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

解决依赖包管理工具:

  • yum:rpm包管理器的前端工具

  • dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum

  • apt:deb包管理器前端工具

  • zypper:suse上的rpm前端管理工具

2.7 程序包管理器相关文件

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

    • 包内的文件

    • 元数据,如:包的名称,版本,依赖性,描述等

    • 可能会有包安装或卸载时运行的脚本

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

    • 程序包名称及版本

    • 依赖关系

    • 功能说明

    • 包安装后生成的各文件路径及校验码信息

2.8 获取程序包的途径

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

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

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

2.8.2 第三方组织提供

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

2.8.3 软件项目官方站点

http://yum.mariadb.org/10.4/centos8-amd64/rpms/ http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/

2.8.4 搜索引擎

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

http://pkgs.org http://rpmfifind.net http://rpm.pbone.net https://sourceforge.net/

2.8.5 自己制作

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

3 包管理器rpm

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

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

3.1 安装

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 ...
[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

3.2 升级和降级

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)后保留

3.3 包查询

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
rpm -q passwd                   #是否安装
rpm -qi passwd                  #己安将的情况下查看详细信息
rpm -qf /usr/bin/passwd         #查询来自哪个包
rpm -qf /etc/passwd             #同上
rpm -q vsftpd                               #是否安装
rpm -qi vsftpd-3.0.3-35.el8.x86_64.rpm      #没安装直接根据包文件查看
rpm -qpi vsftpd-3.0.3-35.el8.x86_64.rpm     #同上
rpm -q vsftpd || rpm -ivh vsftpd-3.0.3-35.el8.x86_64.rpm

3.4 包卸载

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

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

3.5 包校验

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

检查包的完整性和签名

rpm -K|checksig rpmfile
rpm -K vsftpd-3.0.3-35.el8.x86_64.rpm

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

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*”

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

rpm {-V|--verify} [select-options] [verify-options]
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P caPabilities differ

3.6 数据库

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

[root@loaclhost ~]$ll-d /var/lib/rpm
drwxr-xr-x. 2 root root 40965月923:15 /var/lib/rpm

可以重建数据库

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

4 yum和dnf

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

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

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

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

4.1 yum/dnf 工作原理

yum/dnf 是基于C/S 模式

  • yum 服务器存放rpm包和相关包的元数据库

  • yum 客户端访问yum服务器进行安装或查询等

yum 实现过程

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

创建新源

当使用yum install xxx 或 yum update xxx 时

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

然后再去 repodata 里面果询,是否有 xxx 包,如果有,则去源的服务器下载 xxx.rpm(包括依赖包) 然后开始安装,完成后删除包信息

yum服务器的仓库可以多种形式存在:

file:///本地路径

http:// https:// ftp://

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

4.2 yum客户端配置

yum客户端配置文件

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

帮助参考: man 5 yum.conf

[root@loaclhost ~]$ll /etc/yum.conf
lrwxrwxrwx. 1 root root 12 Mar 2417:08 /etc/yum.conf -> dnf/dnf.conf
[root@loaclhost ~]$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仓库配置文件指向的定义

[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0}
gpgcheck={1|0}
gpgkey={URL|file://FILENAME}
enablegroups={1|0}
failovermethod={roundrobin|priority}    #roundrobin:意为随机挑选,默认值 priority:按
顺序访问
cost=默认为1000

baseurl指向的路径

阿里云提供了写好的CentOS和ubuntu的仓库文件下载链接

http://mirrors.aliyun.com/repo/

CentOS系统的yum源

#阿里云
https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
#清华大学
https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/

EPEL的yum源

#阿里云
https://mirrors.aliyun.com/epel/$releasever/x86_64

阿里巴巴开源软件

https://opsx.alibaba.com/

为CentOS7用系统安装光盘作的本地yum仓库:

#挂载光盘
[root@loaclhost ~]$mount /dev/cdrom /mnt/cdrom
#创建配置文件
[root@loaclhost ~]$vim /etc/yum.repos.d/centos7.repo
[CentOS7]
name=CentOS 7
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1

为CentOS 8 配置 yum 的系统和EPEL源仓库

[root@loaclhost ~]$cat /etc/yum.repos.d/base.repo
[BaseOS]
name=BaseOS
baseurl=file:///misc/cd/BaseOS
        https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/
gpgcheck=0
[AppStream]
name=AppStream
baseurl=file:///misc/cd/AppStream
                https://mirrors.aliyun.com/centos/8/AppStream/x86_64/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[epel]
name=EPEL
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
gpgcheck=0
enabled=1
[extras]
name=extras
baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os
gpgcheck=0

注意:与之前的版本不同,CentOS 8 系统有两个yum 源:BaseOS和AppStream ,需要分别设置两个仓库

yum-config-manager命令

可以生成yum仓库的配置文件

[root@loaclhost ~]$rpm-qf`which yum-config-manager `
dnf-utils-4.0.2.2-3.el8.noarch
#生成172.16.0.1_cobbler_ks_mirror_8_.repo
[root@loaclhost ~]$yum-config-manager--add-
repo=http://172.16.0.1/cobbler/ks_mirror/8/
Adding repo from: http://172.16.0.1/cobbler/ks_mirror/8/
[root@loaclhost ~]$cat /etc/yum.repos.d/172.16.0.1_cobbler_ks_mirror_8_.repo
[172.16.0.1_cobbler_ks_mirror_8_]
name=created by dnf config-manager from http://172.16.0.1/cobbler/ks_mirror/8/
baseurl=http://172.16.0.1/cobbler/ks_mirror/8/
enabled=1
yum-config-manager --disable “仓库名" 禁用仓库
yum-config-manager --enable “仓库名” 启用仓库

4.3 yum命令

yum命令的用法

yum [options] [command] [package ...]
#常用选项
-y#自动回答为“yes”
-q#静默模式
--nogpgcheck#禁止进行gpg check
--enablerepo=repoidglob                 #临时启用此处指定的repo,支持通配符,如:”*“
--disablerepo=repoidglob                #临时禁用此处指定的repo
--noplugins#禁用所有插件

4.3.1 显示仓库列表

yum repolist [all|enabled|disabled]
[root@loaclhost ~]$yum repolist -v
...
...
[root@loaclhost ~]$yum repolist all
...
...
[root@loaclhost ~]$yum repolist enabled
repo id                                  repo name
appstream                                CentOS Stream 8- AppStream
baseos                                   CentOS Stream 8- BaseOS
extras                                   CentOS Stream 8- Extras
extras-common                            CentOS Stream 8- Extras common
packages

4.3.2 显示程序包

yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]
[root@loaclhost ~]$dnf list mariadb-server
Last metadata expiration check: 3:46:56 ago on Wed 11 May 202212:08:13 PM CST.
Available Packages
mariadb-server.x86_64                   3:10.3.28-1.module_el8.3.0+757+d382997d
                   appstream
[root@loaclhost ~]$dnf list mariadb-server --showduplicates
Last metadata expiration check: 3:47:43 ago on Wed 11 May 202212:08:13 PM CST.
Available Packages
mariadb-server.x86_64                   3:10.3.28-1.module_el8.3.0+757+d382997d
                   appstream
[root@loaclhost ~]$dnf list mariadb-server --disablerepo=AppStream
No repository match: AppStream
Last metadata expiration check: 3:49:52 ago on Wed 11 May 202212:08:13 PM CST.
Available Packages
mariadb-server.x86_64                   3:10.3.28-1.module_el8.3.0+757+d382997d
                   appstream
[root@loaclhost ~]$dnf list mariadb-server --showduplicates--
disablerepo=AppStream
Last metadata expiration check: 3:50:24 ago on Wed 11 May 202212:08:13 PM CST.
Available Packages
mariadb-server.x86_64                   3:10.3.28-1.module_el8.3.0+757+d382997d
                   appstream
[root@loaclhost ~]$yum list epel*
[root@loaclhost ~]$yum--disablerepo="A*"--disablerepo="B*"--disablerepo="e*"
list available
[root@loaclhost ~]$ yum list installed
[root@loaclhost ~]$ yum list installed x*

4.3.3 安装程序包

yum install package1 [package2] [...]
yum reinstall package1 [package2] [...]     #重新安装
--downloadonly#只下载,不安装
[--downloaddir|--destdir]=path                      #指定下载目录,如果下载目录不存在,
则自动创建
#只下载不安装
yum -y install --downloadonly--downloaddir=/mysql mysql

4.3.4 卸载程序包

yum remove | erase package1 [package2] [...]
yum remove redis
yum remove nginx

4.3.5 升级和降级

yum update [package1] [package2] [...]          #升级
yum downgrade package1 [package2] [...]         #降级
yum check-update                                #检查可用升级
yum downgrade redis
yum update redis

4.3.6 查询

查看程序包information

yum info [...]
yum info redis | rpm -qi redis

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

[root@centos8 ~]# ll /etc/vsftpd/vsftpd.conf
ls: cannot access '/etc/vsftpd/vsftpd.conf': No such file or directory
[root@centos8 ~]# yum provides /etc/vsftpd/vsftpd.conf
Last metadata expiration check: 0:33:13 ago on Fri 27 Dec 201903:47:34 PM CST.
vsftpd-3.0.3-28.el8.x86_64 : Very Secure Ftp Daemon
Repo : AppStream
Matched from:
Filename : /etc/vsftpd/vsftpd.conf

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

yum search string1 [string2] [...]
yum search redis            #包名搜索
yum search key-value        #summary关键字搜索

查看指定包所依赖的capabilities

yum deplist package1 [package2] [...]
[root@loaclhost ~]$yum info bash
Last metadata expiration check: 4:20:41 ago on Wed 11 May 202212:08:13 PM CST.
Installed Packages
Name         : bash
Version      : 4.4.20
Release      : 3.el8
Architecture : x86_64
Size         : 6.5 M
Source       : bash-4.4.20-3.el8.src.rpm
Repository   : @System
From repo    : anaconda
Summary      : The GNU Bourne Again shell
URL          : https://www.gnu.org/software/bash
License      : GPLv3+
Description  : The GNU Bourne Again shell (Bash) is a shell or command language
             : interpreter that is compatible with the Bourne shell (sh). Bash
             : incorporates useful features from the Korn shell (ksh) and the C
shell
             : (csh). Most sh scripts can be run by bash without modification.
Available Packages
Name         : bash
Version      : 4.4.20
Release      : 4.el8
Architecture : x86_64
Size         : 1.5 M
Source       : bash-4.4.20-4.el8.src.rpm
Repository   : baseos
Summary      : The GNU Bourne Again shell
URL          : https://www.gnu.org/software/bash
License      : GPLv3+
Description  : The GNU Bourne Again shell (Bash) is a shell or command language
             : interpreter that is compatible with the Bourne shell (sh). Bash
             : incorporates useful features from the Korn shell (ksh) and the C
shell
             : (csh). Most sh scripts can be run by bash without modification.
root@loaclhost ~]$dnf list bash*
Last metadata expiration check: 4:21:21 ago on Wed 11 May 202212:08:13 PM CST.
Installed Packages
bash.x86_64                                           4.4.20-3.el8
                  @anaconda
bash-completion.noarch                                1:2.7-5.el8
                   @anaconda
Available Packages
bash.x86_64                                           4.4.20-4.el8
                  baseos
bash-doc.x86_64                                       4.4.20-4.el8
                  baseos
[root@centos8 ~]#dnf provides /bin/ls
Last metadata expiration check: 0:26:44 ago on Sun 22 Dec 201901:56:36 PM CST.
coreutils-8.30-6.el8.x86_64 : A set of basic GNU tools commonly used in shell
scripts
Repo : @System Matched from:
Provide : /bin/ls

4.3.7 仓库缓存

清除目录/var/cache/yum/(/var/cache/dnf/) 缓存

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

构建缓存:

yum makecache

4.3.8 查看yum事务历史

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

日志文件:/var/log/yum.log

yum history [info|list|packages-list|packages-info|summary|addon-
info|redo|undo|rollback|new|sync|stats]
[root@loaclhost ~]$dnf history
`ID
`
---------------------------
`12
`15:26
`11
`09:59
`10
`09:59
`9
`08:56
`8
`17:22
`7
`16:28
`6
`08:51
`5
`17:06
`4
`15:48
`3
`20:01
`2
`18:20
`1
`22:23
[root@loaclhost ~]$dnf history info 10
Transaction ID : 10
Begin time     : Thu 05 May 202209:59:11 AM CST
Begin rpmdb    : 1386:963b073c5f552a8656a6b53b1d0c287ae8c8b8d1
End time       : Thu 05 May 202209:59:13 AM CST (2 seconds)
End rpmdb      : 1385:8e4a153a12269c89653ffe4921307ba3bad6707b
User           : root <root>
Return-Code    : Success
Releasever     : 8
Command Line   : remove redis
Comment        :
Packages Altered:
    Removed redis-5.0.3-5.module_el8.4.0+955+7126e393.x86_64 @@System

4.3.9 安装及升级本地程序包

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

4.3.10 包组管理的相关命令

yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]
[root@loaclhost ~]$yum group list
......
......
[root@loaclhost ~]$yum group info "Server with GUI"
......
......
[root@bogon yum.repos.d]$yum group info "Core"
[root@bogon yum.repos.d]$yum group install "Server with GUI"

4.3.11 实现私用 yum仓库

架构图

IP 角色 10.0.0.150 yum server 10.0.0.151 client

步骤

  1. 在 yum server 机上搭建 yum 仓服务

  2. 在 yum server 机上搭建 web 服务,保证其它机器能能过web服务访问本机

  3. 在 client 机上将yum 的 repos 源指向 yum server 机

  4. 测试

yum install -y httpd
systemctl enable --now httpd.service
systemctl stop firewalld
yum reposync --repoid=aliyun-extras --download-metadata-p
/var/www/html/extras/x86_64/
/var/www/html/extras/x86_64
mv /var/www/html/extras/x86_64 os
#关防火墙
systemctl disable --now firewalld

下载所有yum仓库的相关包和meta 数据

#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仓库

createrepo [options] <directory>

系统安装光盘作为本地yum仓库

#挂载光盘至某目录,例如/mnt/cdrom
mount /dev/cdrom /mnt/cdrom
#创建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=

下载阿里云的EPEL源,制作私有yum源

[root@centos8 ~]#cat /etc/yum.repos.d/base.repo
[epel]
name=EPEL
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
gpgcheck=0
[root@centos8 ~]#dnf repolist
Last metadata expiration check: 0:07:40 ago on Sun 22 Dec 201903:14:16 PM CST.
repo id                     repo name           status
AppStream                   AppStream           4,681
BaseOS                      BaseOS              1,655
epel                        EPEL                3,707
[root@centos8 ~]#dnf reposync --repoid=epel --download-metadata -p /var/www/html
#--download-metadata 加此选项可以下载元数据
#dnf -y install createrepo httpd
#createrepo /var/www/html/epel/
[root@centos8 ~]#ls /var/www/html/epel/
Packages repodata
[root@centos8 ~]#systemctl start httpd
[root@centos8 ~]#vim /etc/yum.repos.d/base.repo
[epel]
name=EPEL
baseurl=http://10.0.0.100/epel/
gpgcheck=0

4.3.12 DNF 介绍

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

#配置文件
/etc/dnf/dnf.conf
#仓库文件
/etc/yum.repos.d/ *.repo
#日志
/var/log/dnf.rpm.log
/var/log/dnf.log
#使用帮助
man dnf

dnf 用法与yum一致

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 ,下载并安装下面包

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

4.3.13 yum Troubleshooting

故障排错:

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

5 Ubuntu 软件管理

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

  • dpkg:package manager for Debian,类似于rpm, dpkg是基于Debian的系统的包管理器。可以安装,删除和构建软件包,但无法自动下载和安装软件包或其依赖项

  • apt:Advanced Packaging Tool,功能强大的软件管理工具,甚至可升级整个Ubuntu的系统,基于客户/服务器架构(c/s)

5.1 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已安装、未安装或是可以升级的。

5.2 dpkg 包管理器

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             #显示指定软件包的详细状态。
-p|--print-avail packageName        #显示可供安装的软件版本。
-L|--listfiles  packageName         #列出属于指定软件包的文件。
-l|--list [pattern]                 #列出当前己安装的包。
-S|--search pattern                 #搜索含有指定文件的软件包。
-C|--audit [pattern]                #检查是否有软件包残损。
--yet-to-unpack#列出标记为待解压的软件包。
--predep-package#列出待解压的预依赖。
--compare-vesions v1 - b            #比较版本号。
--force-help#显示本强制选项的帮助信息。
-Dh|--debug=help                    #显示有关出错调试的帮助信息。
--info packageFile                  #列出包相关信息
dpkg -l#列出当前己安装的包,类似于 rpm -qa
dpkg -V user-step                               #检查包的完整性
dpkg --get-selections apache*                   #根据条件显示所有己安装的包
dpkg -l zip                                     #显示zip包的简要说明,类似rpm –qi
dpkg -L zip                                     #列出zip包的中的文件,类似rpm –ql
dpkg -S *zip2                                   #搜索包含pattern的包,类似rpm –qf
dpkg -s zip                                     #列出该包的状态,包括详细信息,类似rpm
–qi
pkg --info user-setup_1.63ubuntu5_all.deb       #列出包相关信息
dpkg -p bzip2                                   #显示所有可安装的包详细信息
dpkg -c bcmwl-kernel-source_6.30.223.271+bdcom-0ubuntu5~18.04.1_amd64.deb #列出包
的内容,类似rpm –qpl

查询包是否安装

root@ubuntu20:/cdrom/pool/main# dpkg -l wget
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  wget1.20.3-1ubuntu2 amd64        retrieves files from the web
root@ubuntu20:/cdrom/pool/main# dpkg -l nginx
dpkg-query: no packages found matching nginx

5.3 apt

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

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

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 显示安装细节
apt [options] command
apt [-h] [-o=config_string] [-c=config_file] [-t=target_release] [-
a=architecture] {list | search | show | update | install pkg
[{=pkg_version_number | /target_release}]...  | remove pkg...  | upgrade | full-
upgrade | edit-sources | {-v | --version} | {-h | --help}}
#options
-h|--help       #显示帮助
-v|--version    #显示版本
-y|--yes        #自动回答yes
-q|--quiet      #安静模式
#command
list            #根据名称列出软件包
search          #搜索软件包描述
show            #显示软件包细节
install         #安装软件包
remove          #移除软件包
autoremove      #卸载所有自动安装且不再使用的软件包
update          #更新可用软件包列表,只更新索引文件,不具体更新软件
upgrade         #通过安装/升级软件来更新系统
full-upgrade    #通过卸载/安装/升级来更新系统
edit-sources    #编辑软件源信息文件
apt list                                #列出所有包
apt list --all-versions#列出所有包的所有版本
apt list --installed#列出所有己安装的包
apt list --upgradeable#列出所有可升级的包
apt list http*                          #列出以http开头的包
apt search apache                       #对包描述中的所有文本进行全文搜索,而不仅仅是名称
apt search  '^sl'#使用正则匹配搜索条件
apt search --names-only apache          #仅在包名中搜索
apt show apache2                        #查看包的详细信息
apt install -y nginx                    #安装包
apt install nginx redis                 #同时安装多个包
apt install nginx=1.14.0-0ubuntu1       #安装指定版本的包,默认安装最新版
apt install nginx --no-upgrade#安装nginx 包,如果己存在,则不升级
apt install nginx --only-upgrade#只升级不安装
apt remove -y nginx                     #仅卸载nginx包
apt autoremove nginx                    #卸载所有依赖包
apt update                              #列出可更新的包
apt upgrade                             #更新所有可更新的包,如果需要删除某些依赖包才能升
级,则该包会被跳过
apt upgrade  nginx                      #如果nginx 没有被安装,将被安装,其它的包升级
apt full-upgrade                        #更新所有可更新的包,如果需要删除某些依赖包才能升
级,则执行删除
apt full-upgrade nginx                  #如果nginx没有被安装,将被安装,其它的包升级
apt edit-sources                        #编辑源列表,直接打开 /etc/apt/sources.list
apt-cache stats                         #显示当前系统安装包的统计信息,包括己安装的数量,
大小,占用空间等
apt-cache madison nginx                 #查看源中指定软件的所有版本
apt-cache depends nginx                 #查看nginx有哪些依赖
apt-cache rdepends nginx                #查看nginx被哪些包依赖
apt --fix-broken install

查看仓库中所有版本的nginx

root@ubuntu20:~# apt-cache madison nginx
     nginx | 1.18.0-0ubuntu1.3 | https://mirrors.aliyun.com/ubuntu focal-
updates/main amd64 Packages
     nginx | 1.18.0-0ubuntu1.3 | https://mirrors.aliyun.com/ubuntu focal-
security/main amd64 Packages
     nginx | 1.17.10-0ubuntu1 | https://mirrors.aliyun.com/ubuntu focal/main
amd64 Packages

默认安装最新版

root@ubuntu20:~# apt install nginx
root@ubuntu20:~# dpkg -l nginx
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  nginx          1.18.0-0ubuntu1.3 all          small, powerful, scalable
web/proxy server

安装指定版

root@ubuntu20:~# apt install nginx=1.17.10-0ubuntu1

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

APT包索引配置文件

/etc/apt/sources.list
/etc/apt/sources.list.d

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

/var/log/dpkg.log

ubuntu 开启root用户远程登录

#如果没有设置过root用户密码,先设root密码
sudo passwd root
#切换到 root 用户
su-
#修改配置文件
vim /etc/ssh/sshd_config
#将   #PermitRootLogin yes  改为 PermitRootLogin yes,大约是在 35行,保存退出
#重启sshd服务
service sshd restart

黑客帝国

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

好莱坞

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

查看系统信息

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

6 程序包编译

6.1 源码编译介绍

程序包编译安装:

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

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

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

6.2 开源程序源代码的获取

官方自建站点:

  • apache.org (ASF:Apache Software Foundation)

  • mariadb.org

  • nginx.org

代码托管:

  • github.com

  • gitee.com

  • SourceForge.net

  • code.google.com

6.3 编译源码的项目工具

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

  • configure脚本 --> Makefifile.in --> Makefile

  • 相关开发工具:

autoconf: 生成confifigure脚本

automake:生成Makefifile.in

java的源码编译: 使用 maven

./configure --prefix=/lnmp/nginx --with-http_ssl_module

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

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

  1. ./configure

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

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

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

make-j N       #并行编译,N为cpu 核数
  1. make install 复制文件到相应路径

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

6.4.1 编译安装准备

准备:安装相关的依赖包

  • 开发工具: gcc (c/c++编译器GNU C Complier),make

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

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

yum install gccmake 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

6.4.2 编译安装

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

其选项主要功能:

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

获取其支持使用的选项

./configure --help
#常用选项
--with-threads#默认不开启,要加上才手动开启
--without-stream_upstream_least_conn_module#默认开启,要加上表示手动不开启
./configure --prefix=/lnmp/nginx --with-http_ssl_module
#安装路径设定
--prefix=/PATH          #指定默认安装位置,默认为/usr/local/
--sysconfdir=/PATH      #配置文件安装位置
#软件特性和相关指定
#Optional Features: 可选特性
--disable-FEATURE
--enable-FEATURE[=ARG]
#Optional Packages: 可选包
--with-PACKAGE[=ARG]    #依赖包
--without-PACKAGE#禁用依赖关系

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

第二步:make

第三步:make install

6.4.3 安装后的配置

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

编辑文件/etc/profifile.d/NAME.sh

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

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

  1. 导入帮助手册

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

6.4.4 编译安装 nginx

#下载源码
[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 gcc8.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/
#!/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