行业新闻

Linux基础笔记16 | 软件包 RPM 详解

2024-02-11 阅读次数:

RPM 软件包管理

软件包的分类

  • 二进制包(binary code):无须编译,可以直接安装使用
  • 源码包(source code):没有经过编译的包,需要借助 gcc、c++ 编译器编译后才能运行

软件包的区分

  • 二进制包:软件包存在 bin 可执行文件
  • 源码包:软件包的文件包含有.h、.c、.cpp等结尾的源码文件

RPM

CentOS 操作系统中一款默认软件管理的工具,红帽包管理工具(Red Hat PackageManager)

  • 对软件包实现快速安装、管理及维护
  • 适合的发行版:CentOS、RHEL、Fedora、SUSE
  • 通常用来管理以“.rpm”后缀结尾的软件包

RPM 包的格式

大多数而言:

  • name-version.rpm
  • name-version-noarch.rpm
  • name-version-arch.src.rpm

软件包格式说明:

  • name:软件名称
  • version:版本号,通用格式:“主.次.修正”“-n”表示发布版本号,第 n 次编译生成的
  • arch:使用的硬件平台(i386、i586、i686、x86_64、sparc、alpha 等)
  • .rpm:编译好的二进制包,直接使用rpm安装
  • .src.rpm:源代码包,源码编译生成
  • el*:软件包发行版本,el6表示适合6.x版本的发行版
  • devel:开发包
  • noarch:软件包可以在任何平台上安装

RPM 命令解析

命令/参数/选项 说明
rpm -qa 标准输出所有安装的软件包
rpm -q zip 检查软件包是否安装,如果安装返回版本信息
rpm -qi zip 标准输出软件包安装的版本信息
rpm -e zip 卸载软件包
rpm -e --nodeps zip 强制卸载
rpm -ivh ******.rpm 安装软件
rpm -Uvh ******.rpm 升级软件
rpm -ivh --nodeps ******.rpm 不验证依赖包安装软件
rpm -qa --last 按照安装时间显示所有安装的软件包(最新的在最上面)
rpm --help 帮助信息(查询更多使用方法)

源码包管理

标准的以“.zip、.tar”结尾的源代码包不能使用 RPM 工具去操作

安装步骤

  1. ./configure:预编译阶段,检测系统基础编译环境是否满足,生成 makefile 文件(通常一些软件的源码编译时候,还需要带一些参数选项进行一个编译过程,具软件的使用情况而定)
  2. make:编译,基于第一步生成的 makefile 文件,进行源代码的编译
  3. make install:安装,编译完毕之后将相关的可运行文件安装到系统中
  4. 一些特殊源码可以只是其中一个或者两个步骤

示例

编译安装 nginx

从 nginx 官网下载最新的源码包

http://nginx.org/en/download.html

下载地址:http://nginx.org/download/nginx-1.22.0.tar.gz

解压源代码包

tar -xf nginx-1.22.0.tar.gz

进入解压后的文件夹,进行预编译阶段

处理报错信息

缺少 pcre-devel 编译环境,可以使用yum 安装即可(一般在进行源代码编译时候,会存在很多编译环境的问题,这个要按照实际情况来解决)

继续预编译

完成预编译阶段后,会返回一些软件预编译的一些结果

编译及编译安装

部分软件在编译安装时候,执行过程稍长

make && make install

安装成功

编译安装总结

  1. 预编译阶段可以对软件的安装目录、功能选择等参数进行配置,内容可以参考源代码根目录下的 README 或 INSTALL 等相关文件
  2. 编译步骤是将源代码编译成为可以被执行的文件,文件放置在当前的目录下,这个时候还没有被安装到预安装的目录下
  3. 编译安装步骤是进行最后的安装步骤,把之前所编译完成的数据安装到默认的目录下

YUM 软件包管理

YUM 简述

前端软件包管理器 YUM(Yellow dog Updater, Modified)

  • 适用于 CentOS、Fedora、RedHat、SUSE 等发行版
  • 用于管理 rpm 包
  • 从指定的服务器自动下载 RPM 包并且安装,自动处理并安装依赖性关系
  • rpm 包管理遇到有依赖的时候,需要逐个手动下载安装,yum 工具最大好处就是自动处理依赖,提升效率

YUM 工作原理

组成

  • YUM 服务端:通过 HTTP 或者 FTP 服务发布
  • YUM 客户端:客户端安装的所有 RPM 包都来自 YUM 服务端,使用yum安装软件或者搜索文件时,会查找/etc/yum.repos.d 下以.repo 结尾文件,CentOS 默认的文件是:CentOS-Base.repo,该文件配置了 YUM 服务端的镜像地址,每次安装、升级 RPM 包,YUM 客户端都会查找这些文件
  • YUM 客户端如果没有外网,可以构建光盘或者内部的 YUM 源,客户端安装软件,默认会把 YUM 源地址、头部信息、软件包、数据库信息、缓存文件存储在/var/cache/yum中,每次使用 YUM 时候,优先通过 cache 查找相关软件包,cache 中不存在的时候,才会访问外网 YUM 源
[root@iZrgngz5lz7qzsZ ~]# ll /var/cache/yum/
total 4
drwxr-xr-x 3 root root 4096 Sep  5 19:32 x86_64
[root@iZrgngz5lz7qzsZ ~]#

yum 命令指南

企业常用命令

  • -y:表示安装与卸载出现 yes 时,自动确认 yes
  • -q:表示不显示安装过程
命令/参数/选项 说明
yum install zip 交互式安装软件
yum install zip -y 自动确定安装软件
yum search zip 搜索软件包
yum list zip 显示指定软件包的安装情况
yum list 显示所有已经安装及可被安装的软件
yum remove zip -y 删除程序包
yum update 内核升级(企业环境慎用)
yum update zip 更新软件
yum check-update 检查可更新的软件
yum info zip 显示安装包信息
yum provides “*/sz” 列出该命令由什么包提供的
yum deplist zip 查看该程序的依赖情况
yum clean packages 清除缓存目录下的安装包
yum clean headers 清除缓存目录下的头部信息
yum clean all 清除缓存目录下的软件包以及旧的头部信息
yum install --downloadonly --downloaddir=/tmp zip 只下载该软件的 rpm 包,并保存在指定目录下

YUM 源构建

基于 iso 镜像构建本地源

  • 该方式只限于本机可以使用,部分软件也无法安装,因为里面的安装包并不完整

基于 iso 镜像构建本地源就是利用光盘里面的软件包实现 YUM 安装软件

CentOS-7-x86_64-Everything-2009:针对这个版本的镜像包,集成了很多软件,可以当作本地源

将镜像文件放在服务器

将镜像文件挂载到/mnt目录下

mount /home/CentOS-7-x86_64-Everything-2009.iso /mnt

临时改名/etc/yum.repos.d 下面的配置文件

这步目的是为了验证本地 YUM 源的使用

新建一个 .repo 文件

内容如下:

[yum]												
name = CentOS7
baseurl = file:///mnt
enabled=1
gpgcheck=1
gpgkey=file://mnt/RPM-GRG-KEY-CentOS-7
  • name:源名称
  • baseurl:iso 镜像挂载目录
  • gpgcheck:是否检查 GPG-KEY
  • enabled:是否启用
  • gpgkey:指定加载目录下的 GPG-KEY文件验证

测试结果(完毕)

yum clean all

yum makecache

yum install tcpdump -y

基于 HTTP 构建 YUM 源

构建基于内网的 HTTP 方式的 YUM 源,企业中更常见

  • 服务端:192.168.204.110
  • 客户端:192.168.204.109

先挂载镜像文件

安装一个 nginx,并可以实现访问

在 nginx 默认的 /目录下增加一个文件夹

mkdir centos

复制/mnt 下的相关文件到 centos 目录下

(复制时间稍微有点长)

cp -R /mnt/Packages/* /usr/share/nginx/html/centos/

进入目录下,使用 createrepo 生成本地源

cd /usr/share/nginx/html/

createrepo centos/

利用 HTTP 发布 YUM 源

配置一下,让可以访问到 centos 目录即可

在客户端(内网的另一个环境)配置一个测试的 .repo 文件

内容如下:http.repo

[base]												
name = "CentOS7 HTTP YUM"
baseurl = http://192.168.204.110/centos/
enabled = 1
gpgcheck = 0
[updates]												
name = "CentOS7 HTTP YUM"
baseurl = http://192.168.204.110/centos/
enabled = 1
gpgcheck = 0

客户端测试

yum clean all

yum makecache

yum install tcpdump -y

从服务端的 nginx 日志可以看出客户端访问的记录

如何扩展服务端的包呢?

尝试安装一下 ntfs-3g 软件包,但是发现没有这个包

我们需要从外网下载这个软件包,并放在服务端的 centos 目录下

cd /usr/share/nginx/html/centos/
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/n/ntfs-3g-libs-2022.5.17-1.el7.x86_64.rpm
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/n/ntfs-3g-devel-2022.5.17-1.el7.x86_64.rpm

更新软件包

cd /usr/share/nginx/html/
createrepo --update centos/

客户端验证一下:OK的

yum clean all
yum makecache
yum install -y ntfs-3g-devel.x86_64 ntfs-3g-libs.x86_64

同步外网的 YUM 源

针对上面的【基于 HTTP 的企业内部 YUM 源】,可以使用外网的 YUM 源,来同步到本地的,更加完善企业内部的 YUM 源的软件包

  • 获取外网 YUM 源软件的方式推荐使用:reposync,可以同步几乎所有的 YUM 源

比如我在客户端想升级一下 NetworkManager

提示没有更新的包,就需要同步下外网的 YUM 软件了

在服务端操作:下载阿里云的 CentOS7 的 YUM 源文件

wget https://mirrors.aliyun.com/repo/Centos-7.repo

服务端配置一下

yum clean all
yum makecache

安装 reposync 命令

yum provides "*/reposync"
yum install -y yum-utils-1.1.31-54.el7_8.noarch

获取外网所有的 YUM 软件包

## -r 指定 repolist id;不加 -r 表示获取外网所有的包
## -p 指定下载软件的路径
## 这玩意有点多,1W多个软件包,需要一定的空间和时间
reposync -r base -p /usr/share/nginx/html/centos/
reposync -r updates -p /usr/share/nginx/html/centos/

更新服务端软件包

cd /usr/share/nginx/html/
createrepo --update centos/

客户端再次验证一下升级 NetworkManager :OK的

这个地方有点问题,折腾了很久,下面记录一下这个过程

通过上述升级服务端的软件包以后:发现搜索出来的包还是旧版本

服务端访问一下软件包目录:发现多了2个文件夹:考虑是不是因为升级的时候将升级的包放在了其他位置

然后对 updates 目录下重新做了操作:createrepo Packages/

改了一下客户端的 repo 文件

然后重新生效了一下源:

最后成功升级:OK