Linux基础14 RPM包管理, 安装, 查询, 升级, 卸载, 软件运行和编译

阿里云rpm包下载地址
https://developer.aliyun.com/mirror/

 

RPM包管理:
RPM全称RPM Package Manager缩写,由红帽开发用于软件包的安装,升级卸载与查询
yum安装的全是RPM包
mysql-5.6.40.tar.gz 源码包,也可通过mysql-5.6.40.rpm安装

RPM包:                                                   i686/noarch
    tree-        1.6.0-        10.        el7            .x86_64                    .rpm
    包名          版本         发布次数     centos7        包的架构(64位)(x86_32为i686) 后缀
                                                  noarch 32位 64位都兼容 跟平台无关
    # centos7可以装centos6的包。centos6不一定能装centos7的包    (需要依赖的,比如依赖内核的不能装)

#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

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

 

源代码打包文件命名

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

 


Linux中软件包分类

分类      安装               版本
rpm包     预先编译打包,安装简单     软件版本偏低
tree-1.6.0-10.el7.x86_64.rpm

源码包     手动编译打包,安装繁琐     软件版本随意
mysql-5.6.42.tar.gz

二进制包    解压即可使用, 安装简单     不能修改源码
mysql-5.6.42-linux-glibc2.12-x86_64.tar.gz

 

用vm创建centos的话,在虚拟机选项,设置选项中,可以看到硬件挂载centos镜像。镜像里rpm包。
mount /dev/cdrom /mnt
在/mnt/Packages中可以看到镜像中的rpm包

 

RPM包管理命令:安装

    -i:         #安装
    -v:         #详细信息
    -h:         #安装进度 
    --test:     #测试是否能够安装成功
    --force:    #强制重新安装(有时候有用,如果缺依赖还是不能装)
    --nodeps:   #忽略依赖关系(装上也没意义,没依赖无法用)
    
rpm -ivh tree-1.6.0-10.el7.x86_64.rpm    # 如果只用i参数, 不知道装没装完

#仅测试,是否能安装成功。不进行安装
[root@oldboyedu Packages]# rpm -ivh tree-1.6.0-10.el7.x86_64.rpm  --test
Preparing...                          ################################# [100%]
#强制安装,忽略依赖
[root@oldboyedu Packages]# rpm -ivh --nodeps  --force samba-client-4.8.3-4.el7.x86_64.rpm

注: rpm包里,如果没有放依赖的话,需要提前安装依赖包


RPM包管理命令:查询

    rpm -q      #查看指定软件包是否安装
    rpm -qa     #查看系统中已安装的所有RPM软件包列表
    rpm -qi     #查看指定软件的详细信息
    rpm -ql     #查询指定软件包所安装的目录、文件列表 (查找软件启动程序位置)
    rpm -qc     #查询指定软件包的配置文件
    rpm -qd     #查询指定软件包的帮助文档
    rpm -qf     #查询文件或目录属于哪个RPM软件
    rpm -q --scripts    #查询rpm包安装前和安装后执行的脚本
    # 不常用的命令
    rpm -qip    # 查询未安装的rpm包详细信息
    rpm-qlp    # 查询未安装的软件包会产生哪些文件
    
    [root@oldboyedu Packages]# rpm -q nginx    # 查看是否安装了nginx
    [root@oldboyedu Packages]# rpm -qa|grep vim    # 查看vim相关的包是否安装
    [root@oldboyedu Packages]# rpm -qi tree    # 查看tree的详细信息
    [root@oldboyedu Packages]# rpm -qf `which useradd`    # 查看命令属于哪个RPM软软件包
    [root@localhost ~]# rpm -ql shadow-utils-4.1.5.1-18.el7.x86_64    # 查看软件包所安装的目录、文件列表
    [root@localhost ~]# rpm -qc shadow-utils-4.1.5.1-18.el7.x86_64    # 查看软件包配置文件

 

RPM包管理命令:升级

    -U 如果老版本不存在,就全新安装,如果存在有新版即升级
    -f 老版本必须存在(可用于没有老版本就不升级)
    
    如果有新版则升级, 软件升级不要跨操作系统主版本号
    
    [root@zls ~]# rpm -Uvh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm


RPM包管理命令:卸载

    卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。
    rpm -e    # 卸载,后面跟包名    

    //先查询, 然后卸载 
    [root@zls ~]# rpm -qa |grep sh
    [root@zls ~]# rpm -e zsh

 

练习:
1.根据mysql命令 查找 mysql的配置文件在哪?

rpm -qc $(rpm -qf `which mysql`)

2.根据/etc/hostname找出修改主机名的命令?

[root@localhost ~]# rpm -ql $(rpm -qf /etc/hostname)|grep 'bin/hostname'
/usr/bin/hostnamectl

3.找到nginx的rpm包,安装上,并列出nginx的相关命令路径,以及配置文件,还有站点目录

下载地址:
https://mirrors.aliyun.com/epel/7/x86_64/Packages/n/nginx-1.20.1-10.el7.x86_64.rpm
安装
rpm -ivh nginx-1.20.1-10.el7.x86_64.rpm  
# 如果报错,缺少依赖,根据缺少的内容,在https://mirrors.aliyun.com/epel/7/x86_64/Packages/n上下载后,rpm -ivh依次安装后,在装nginx
查配置文件
rpm -qc nginx
查站点目录
rpm -ql nginx|grep html
查命令
rpm -ql nginx|grep bin

4.找到zabbix-agent的rpm安装包,3.x 4.2版本,下载,升级

下载
wegt https://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.0-1.el7.x86_64.rpm
wegt https://mirrors.aliyun.com/zabbix/zabbix/4.2/rhel/7/x86_64/zabbix-agent-4.2.1-1.el7.x86_64.rpm
安装
rpm -ivh
zabbix-agent-3.0.0-1.el7.x86_64.rpm  # 此处缺少依赖,用下方yum方法,localinstall参数可以从源里直接下载安装依赖源
yum localinstall -y
zabbix-agent-3.0.0-1.el7.x86_64.rpm
升级
rpm -Uvh zabbix-agent-4.2.1-1.el7.x86_64.rpm

5.尝试使用rpm命令,远程安装,不下载到本地

rpm -ivh rpm包下载地址

 

软件运行和编译

ABI: 应用程序二进制接口

windows 与 linux 中的 ABI 格式是不兼容的
  windows 中的是 PE (Portable Executable ) 格式
  Linux 中的是 ELF ( Executable and Linkable Format ) 格式

 

API: 

API可以在各种不同的操作系统上实现给应用程序提供完 全相同的接口,而它们本身在这些系统上的实现却可能迥异,主流的操作系统有两种,一种是Windows 系统,另一种是Linux系统。
由于操作系统的不同,API又分为Windows API和Linux API。在Windows 平台开发出来的软件在Linux上无法运行,在Linux上开发的软件在Windows上又无法运行,这就导致了 软件移植困难,
POSIX 标准的出现就是为了解决这个问题。
POSIX:Portable Operating System Interface 可移植操作系统接口,定义了操作系统应该为应用程序 提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称。 linux和windows都要实现基本的posix标准,程序就在源代码级别可移植了。

 

C语言程序的实现过程

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

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

预处理(Pre-Processing)
    1 将所有的#define删除,并且展开所有的宏定义
    2 处理所有的条件预编译指令,比如 #if,#ifdef,#elif,#else,#endif 等
    3 处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置
    4 删除所有的注释,//,/**/
    5 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号
    6 保留所有的#pragma编译指令,因为编译需要使用它们
编译 (Compiling)
    编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后,最后生成的汇编代码
汇编 (Assembling)
    汇编是将汇编代码转变成机器码可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对 照表一一翻译即可
链接 (Linking)
    通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件

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

 

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

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

 静态链接

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

动态链接

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

 

程序包编译

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

编译源码的项目工具

C、C++的源码编译:使用 make 项目管理器
configure脚本 --> Makefifile.in --> Makefile
相关开发工具:
    oconf: 生成confifigure脚本
    automake:生成Makefifile.in

java的源码编译: 使用 maven

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

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

1. ./configure 
    (1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefifile.in文件生成Makefile
    (2) 检查依赖到的外部环境,如依赖的软件包

2. make 根据Makefifile文件,构建应用程序
make -j N #并行编译,N为cpu 核数

3. make install 复制文件到相应路径

总结
./configure
make && make install
#make install完了,把安装好的文件删了,再次make install,还是一样能安装出文件

编译安装准备

准备:安装相关的依赖包

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

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

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

文件 其选项主要功能:

  • 可以指定安装位置
  • 指定启用或禁用某些特性

获取其支持使用的选项

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

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

2. 相关用户及文件

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

posted @ 2023-01-16 18:06  战斗小人  阅读(406)  评论(0编辑  收藏  举报