Linux下的软件仓库

发布于:2025-04-20 ⋅ 阅读:(37) ⋅ 点赞:(0)

注:本文使用的是RHEL9,会以RHEL9为示例

一、Linux中一些软件包的类型和软件包的名称结构

1、软件包的类型

(1)DEB包

定义与适用场景

  • 格式.deb

  • 适用系统:Debian、Ubuntu、Linux Mint 等 Debian 系发行版。

  • 用途:预编译的二进制安装包,包含软件的可执行文件、配置和依赖信息。

  • 包管理工具

    • dpkg:基础安装工具(dpkg -i package.deb)。

    • apt / apt-get:高级工具(自动解决依赖)。

核心特点

  • 依赖管理:自动处理依赖关系(通过 apt 工具)。

  • 安装简便:一键安装,无需编译。

  • 版本控制:官方仓库提供稳定版本,适合生产环境。

(2)RPM包

定义与适用场景

  • 格式.rpm

  • 适用系统:RHEL、CentOS、Fedora、openSUSE 等 Red Hat 系发行版。

  • 用途:类似 DEB 包,提供预编译的二进制安装包。

  • 包管理工具

    • rpm:基础安装工具(rpm -ivh package.rpm)。

    • yum / dnf:高级工具(自动解决依赖)。

核心特点

  • 依赖管理:通过 yum 或 dnf 自动解决依赖。

  • 企业级支持:RHEL/CentOS 长期支持(LTS)版本,稳定性高。

  • 软件签名:支持 GPG 签名验证,增强安全性。

(3)源代码压缩包(.tar.bz2 / .tar.gz / .tar.xz)

定义与适用场景

  • 格式.tar.bz2(高压缩率)、.tar.gz(通用)、.tar.xz(极高压缩率)

  • 适用系统:所有 Linux 发行版。

  • 用途:包含软件源代码,需手动编译安装。

核心特点

  • 依赖管理:需要手动安装依赖库

  • 灵活性:可自定义编译选项(如安装路径、启用功能模块)。

  • 跨平台:适配不同架构和系统环境。

  • 手动管理:需自行解决依赖关系和更新维护。

其中,源代码压缩包分为两种类型:

1. 需要编译的源代码包

特点

  • 内容:包含软件的源代码文件(C/C++、Python 等)、构建脚本(如 Makefileconfigure)。

  • 目的:允许用户自行编译软件,适配不同系统环境或自定义功能。

  • 常见格式.tar.gz.tar.bz2.tar.xz

2. 绿色软件(预编译二进制包)

特点

  • 内容:包含已编译好的可执行文件或脚本,无需编译。

  • 目的:提供开箱即用的程序,简化安装步骤。

  • 常见格式.tar.gz.tar.bz2.tar.xz(名称可能含 precompiledbinary 等字样)。

2、软件包的名称结构

以RPM 包(RHEL/CentOS/Fedora 等)为例

命名结构:        <软件名>-<版本号>-<发行号>.<发行版标识>.<架构>.rpm
各部分解析
字段 说明 示例
软件名 软件名称(通常全小写,用连字符分隔) httpdpython3
版本号 软件的主版本号(可能含字母,如 beta 2.4.63.9.5
发行号 软件包的构建次数(由维护者递增) 901
发行版标识 标识适用的发行版(如 el7=RHEL7,fc33=Fedora 33) el7fc33
架构 支持的 CPU 架构(如 x86_64noarch 表示通用包) x86_64noarch
软件类型后缀 不同类型的软件包的软件类型后缀不相同 .deb、.rpm
实例解析:        httpd-2.4.6-90.el7.centos.x86_64.rpm
  • 软件名httpd(Apache HTTP 服务器)

  • 版本号2.4.6

  • 发行号90(第 90 次构建)

  • 发行版标识el7.centos(适用于 CentOS 7 或 RHEL 7)

  • 架构x86_64(64 位 x86 架构)

  • 软件类型后缀.rpm

二、rpm命令详解

核心参数说明

涉及到列出、指定或者操作文件等需要查询文件的功能都需要复合参数 -q 使用。

参数 作用 常用组合示例
-i 安装软件包(Install) rpm -ivh package.rpm
-v 显示详细输出(Verbose) 通常与 -i-U 等组合使用
-h 显示进度条(Hash marks) 同上
-a 所有/全部(All) rpm -qa    #查询所有已安装包
-f 指定文件(File) rpm -qf /usr/bin/python3
-p 操作未安装的 RPM 文件(Package file) rpm -qpl package.rpm
-q 查询(Query) rpm -qi package-name
-l 列出文件列表(List)

rpm -ql httpd 

#查询httpd这个包在系统中安装的时候生成了什么文件

-e 卸载(Erase) rpm -e package-name
-c 列出配置文件(Config files) rpm -qc nginx
-d 列出文档文件(Documentation) rpm -qd httpd
--info 显示包的元信息(等同于 -qi rpm --info package-name
--force 强制操作(覆盖文件、忽略冲突) rpm -ivh --force package.rpm
--nodeps 忽略依赖检查(可能导致系统不稳定) rpm -ivh --nodeps package.rpm
--scripts 显示包安装/卸载时执行的脚本

rpm -q --scripts package-name

示例:rpm -qp package-name --scripts

示例的解析:可以显示未安装的RPM文件在安装时执行的脚本,这样我们就可以检查脚本是否有问题,防止出错。

-Kv 验证包的签名和完整性(检查 GPG 和 MD5校验码)

rpm -Kv package.rpm

#看校验码是否OK,检查软件包是否被人篡改过,防止出问题。

-V 检查已安装包的文件是否被修改(Verify) rpm -V httpd

参数组合示例

1. 安装

        # 安装包(显示进度和详情)
        rpm -ivh WeChatLinux_x86_64.rpm

        # 强制安装(覆盖冲突文件)
        rpm -ivh --force WeChatLinux_x86_64.rpm

        # 忽略依赖安装(显示进度和详情)
        rpm -ivh WeChatLinux_x86_64.rpm --nodeps

2. 查询信息

        # 列出所有已安装的包
        rpm -qa

        # 查询某个包是否安装
        rpm -qa | grep httpd

        # 查看包的详细信息(已安装)
        rpm -qi httpd

        # 查看未安装包的元信息
        rpm -qpi ./mysql.rpm

        # 列出包安装的文件
        rpm -ql nginx

        # 查询文件所属包
        rpm -qf /usr/sbin/nginx

3. 卸载

        # 卸载包(保留配置文件)
        rpm -e httpd

        # 强制卸载(忽略依赖)
        rpm -e --nodeps conflicting-package

4. 验证与安全

        # 验证包的签名和完整性
        rpm -Kv package.rpm

        # 检查已安装包的文件是否被篡改
        rpm -V httpd

5. 高级操作

        # 查看包安装/卸载时执行的脚本
        rpm -q --scripts docker-ce

        # 列出包的配置文件
        rpm -qc nginx

        # 列出包的文档文件
        rpm -qd python3

下图为忽略依赖安装RPM包的示例:

三、构建本地的软件仓库

做完上面四张图片的步骤,本地的软件仓库就算搭建好了。

然后就可以从软件仓库中安装软件了。示例如下图:

四、网络软件仓库的构建

发布资源的主机:

下图的挂载是临时的,若是关机重启了,挂载就会消失,除非在开机自运行脚本中编写自动挂载的命令。而若发布资源的主机的挂载消失了,那么测试主机会获取不到资源。

下图为在开机自运行脚本中编写自动挂载的命令。

测试主机:

然后测试主机就可以安装软件仓库里的软件包了,软件包就是从发布资源的主机里面来的,只要与发布资源的主机保持网络连接,就可以从发布资源的主机中获取软件包。

五、dnf命令的使用

dnf常用命令速查表

sudo 表示以超级用户(root)的身份执行命令,若本身就是root用户的话可以不用sudo。

功能分类 命令语法 说明 示例
仓库管理
dnf repolist 列出所有已启用的仓库 显示仓库 ID、名称和软件包数量 dnf repolist
dnf repolist all 列出所有仓库(包括启用和禁用) 查看完整的仓库状态 dnf repolist all
dnf clean all 清除所有仓库缓存(路径:/var/cache/dnf 清理下载的软件包和元数据,释放磁盘空间 sudo dnf clean all
dnf makecache 主要功能是生成或更新软件包元数据缓存 执行 dnf makecache 命令需要网络连接,因为它需要从软件源服务器上下载元数据。如果网络不稳定或无法访问软件源服务器,可能会导致缓存更新失败。 sudo dnf makecache
软件包管理
dnf list all 列出所有软件包(已安装 + 未安装) 显示仓库中所有可用软件包 dnf list all
dnf list available 列出未安装的可用软件包 仅显示可安装但尚未安装的包 dnf list available
dnf list installed 列出已安装的软件包 查看系统中已安装的包 dnf list installed | grep nginx
dnf install 安装软件包 从仓库安装指定软件包 sudo dnf install httpd
dnf remove 卸载软件包 移除已安装的软件包(保留配置文件) sudo dnf remove mariadb
dnf reinstall 重新安装软件包 覆盖当前安装版本,修复损坏的文件 sudo dnf reinstall python3

dnf install <软件包> --downloadonly --dest=<保存的目标目录>

补充:dest也可写成destdir

仅执行下载操作,而不进行安装 主要用途是仅下载指定软件包及其依赖项,而不进行安装操作,并将下载的软件包保存到指定的目录中。 dnf install gcc --downloadonly --dest=/mnt
查询与搜索
dnf search 按关键字搜索软件包 匹配名称或描述的模糊搜索 dnf search "web server"
dnf whatprovides 搜索包含指定文件/命令的软件包 查找提供某个文件或命令的包 dnf whatprovides */nginx
事务历史管理
dnf history 查看 DNF 操作历史 列出所有安装、更新、卸载操作的事务记录 sudo dnf history
dnf history info 查看指定事务的详细信息 显示某次操作涉及的软件包和依赖 sudo dnf history info 5
软件组管理
dnf group list 列出所有软件组 显示所有可用软件组(默认包含已安装和未安装) dnf group list
dnf group list --installed 列出已安装的软件组 仅显示当前已安装的软件组 dnf group list --installed
dnf group list --available 列出未安装的可用软件组 显示可安装但未安装的软件组 dnf group list --available
dnf group list --hidden 列出隐藏的软件组 显示标记为隐藏的软件组(通常为特殊用途) dnf group list --hidden
dnf group install 安装软件组 批量安装一组相关软件包 sudo dnf group install "Development Tools"
dnf group info 查看软件组详细信息 显示软件组包含的必需包和可选包 dnf group info "Web Server"

六、epel源的构建

然后我们就可以使用epel源来下载我们需要的软件了。

下图含义:列出未安装的可用软件包 ansible,我们可以看到ansible.noarch这个软件包可以从epel源下载安装。

七、第三方软件仓库的搭建

发布资源的主机: epel源 中将 ansible软件包和依赖关系 仅下载 到 新建的httpd服务的默认共享目录的子目录/var/www/html/ansible中

测试主机:

下图:列出未安装的可用软件包时出错了,所以进行原因分析 --- 根据错误提示发现,很有可能是 ansible软件仓库中的 /repodata/repomd.xml 文件消失了。

发布资源的主机:

先安装软件 createrepo

然后根据指定目录生成元数据文件

测试主机:

然后第三方软件仓库中的的软件就可以下载安装了

补充:

若是 发布资源的主机 往ansible软件仓库中 新增加了一些软件,但是因为这时ansible软件仓库的repodata目录和里面的文件没有进行更新,所以测试主机是看不到这些新增加的软件的。

只有 发布资源的主机 使用 createrepo 重新生成repodata目录和其中的文件来进行信息更新,然后 测试主机 要使用 dnf clean all 清除仓库缓存,重新读取ansible软件仓库的信息后,测试主机才能看到ansible软件仓库中新增加的软件。


网站公告

今日签到

点亮在社区的每一天
去签到