软件包管理

在 Linux 系统中,软件包管理是系统管理的重要组成部分。Rocky Linux 作为企业级 Linux 发行版,提供了强大而灵活的软件包管理系统。本教程将详细介绍 Rocky Linux 中的软件包管理工具,包括 DNF、RPM 的使用方法,软件仓库管理以及常见软件安装方式。

软件包管理基础

软件包管理概念

软件包是一个或多个程序及其相关文件(配置文件、文档等)的集合,以标准格式打包。软件包管理系统提供了安装、升级、删除和查询软件包的功能,同时处理软件包之间的依赖关系。

在 Rocky Linux 中,主要使用以下组件进行软件包管理:

  • RPM(Red Hat Package Manager):底层软件包管理工具,负责软件包的安装、升级和删除
  • DNF(Dandified YUM):高级软件包管理工具,是 YUM 的下一代版本,提供了更好的性能和用户体验
  • 软件仓库(Repository):存储软件包的服务器,包含软件包及其元数据

DNF 包管理器

DNF 是 Rocky Linux 中默认的软件包管理器,提供了强大的软件包管理功能。

基本语法

dnf [选项] 命令 [软件包名称...]

安装软件包

# 安装单个软件包
sudo dnf install package_name

# 安装多个软件包
sudo dnf install package1 package2 package3

# 安装指定版本的软件包
sudo dnf install package_name-1.0.0

# 重新安装软件包
sudo dnf reinstall package_name

# 安装软件包组
sudo dnf groupinstall "Development Tools"

升级软件包

# 检查可用更新
sudo dnf check-update

# 升级单个软件包
sudo dnf update package_name

# 升级所有软件包
sudo dnf update
# 或简写为
sudo dnf up

# 升级系统内核(通常会自动包含在 update 中)
sudo dnf update kernel

# 升级软件包组
sudo dnf groupupdate "Development Tools"

删除软件包

# 删除软件包(保留配置文件)
sudo dnf remove package_name
# 或使用老式命令
sudo dnf erase package_name

# 删除软件包及其依赖(不再需要的)
sudo dnf autoremove package_name

# 删除软件包组
sudo dnf groupremove "Development Tools"

查询软件包

# 搜索软件包
sudo dnf search keyword

# 精确搜索软件包名称
sudo dnf search --name package_name

# 显示软件包详情
sudo dnf info package_name

# 列出所有已安装的软件包
sudo dnf list installed

# 列出所有可安装的软件包
sudo dnf list available

# 列出所有软件包(已安装和可安装)
sudo dnf list all

# 列出软件包组
sudo dnf grouplist

# 显示软件包组详情
sudo dnf groupinfo "Development Tools"

# 查找哪个软件包提供特定文件
sudo dnf provides /path/to/file

# 列出软件包中包含的文件
sudo dnf repoquery -l package_name

DNF 缓存管理

# 清理所有缓存
sudo dnf clean all

# 只清理过期缓存
sudo dnf clean expire-cache

# 下载软件包但不安装
sudo dnf download package_name

DNF 高级功能

# 查看软件包的依赖关系
sudo dnf deplist package_name

# 显示软件包的变更日志
sudo dnf changelog package_name

# 检查软件包的安全更新
sudo dnf updateinfo list security

# 只更新安全相关的软件包
sudo dnf update --security

# 显示事务历史
sudo dnf history

# 显示特定事务的详情
sudo dnf history info 1

# 回滚到特定事务
sudo dnf history rollback 1

DNF 配置

DNF 的主配置文件是 /etc/dnf/dnf.conf,可以通过编辑此文件来自定义 DNF 的行为:

sudo vim /etc/dnf/dnf.conf

常见配置选项:

[main]
ggcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
max_parallel_downloads=10
deltarpm=True
keepcache=False
timeout=300

配置选项说明:

  • gpgcheck=1:验证软件包的 GPG 签名
  • installonly_limit=3:限制保留的内核版本数量
  • clean_requirements_on_remove=True:删除软件包时自动清理不再需要的依赖
  • best=True:总是尝试安装最佳可用版本
  • skip_if_unavailable=False:仓库不可用时跳过
  • max_parallel_downloads=10:最大并行下载数量
  • deltarpm=True:启用增量 RPM 下载
  • keepcache=False:不保留已安装的软件包
  • timeout=300:下载超时时间(秒)

RPM 包管理工具

RPM 是 Rocky Linux 中底层的软件包管理工具,DNF 实际上是构建在 RPM 之上的高级工具。在某些情况下,可能需要直接使用 RPM 命令。

基本语法

rpm [选项] 命令 [软件包名称或文件...]

安装软件包

# 安装 RPM 软件包
sudo rpm -ivh package.rpm

# 升级 RPM 软件包
sudo rpm -Uvh package.rpm

# 强制安装或升级(覆盖已安装文件)
sudo rpm -ivh --force package.rpm

查询软件包

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

# 查询特定软件包是否已安装
rpm -q package_name

# 显示软件包详情
rpm -qi package_name

# 列出软件包中包含的文件
rpm -ql package_name

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

# 查找哪个软件包提供特定文件
rpm -qf /path/to/file

# 验证软件包的安装文件
rpm -V package_name

删除软件包

# 删除软件包
sudo rpm -e package_name

# 强制删除(忽略依赖关系)
sudo rpm -e --nodeps package_name

软件仓库管理

软件仓库是存储软件包的服务器,Rocky Linux 使用多个官方和第三方软件仓库。

查看已配置的仓库

# 列出所有已启用的仓库
sudo dnf repolist

# 列出所有仓库(包括已禁用的)
sudo dnf repolist all

# 显示特定仓库的详情
sudo dnf repoinfo repository_name

启用和禁用仓库

# 临时启用仓库
sudo dnf --enablerepo=repository_name install package_name

# 临时禁用仓库
sudo dnf --disablerepo=repository_name update

# 永久启用或禁用仓库
sudo dnf config-manager --set-enabled repository_name
sudo dnf config-manager --set-disabled repository_name

添加和删除仓库

# 使用 dnf config-manager 添加仓库
sudo dnf config-manager --add-repo repository_url

# 手动创建仓库配置文件
sudo vim /etc/yum.repos.d/custom.repo

仓库配置文件示例:

[custom-repo]
name=Custom Repository
baseurl=http://example.com/repo/rocky/8/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://example.com/repo/RPM-GPG-KEY-custom

导入 GPG 密钥

# 导入仓库的 GPG 密钥
sudo rpm --import http://example.com/repo/RPM-GPG-KEY-custom

常用软件仓库

官方仓库

  • BaseOS:提供核心操作系统包
  • AppStream:提供应用程序流,包括额外的用户空间应用程序、运行时语言和数据库
  • PowerTools:提供构建软件所需的开发工具和库
  • Extras:提供额外的软件包,包括 EPEL 仓库的集成

EPEL 仓库

EPEL (Extra Packages for Enterprise Linux) 提供了许多在官方仓库中不可用的高质量软件包:

# 安装 EPEL 仓库
sudo dnf install epel-release -y

ELRepo 仓库

ELRepo 专注于硬件相关的软件包,如内核、显卡驱动等:

# 安装 ELRepo 仓库
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo dnf install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm -y

Remi 仓库

Remi 仓库提供了最新版本的 PHP 和相关软件:

# 安装 Remi 仓库
sudo dnf install dnf-utils -y
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y

源码编译安装

除了使用包管理器外,有时还需要从源码编译安装软件。

安装编译工具

# 安装开发工具组
sudo dnf groupinstall "Development Tools" -y

# 安装常用的开发库
sudo dnf install openssl-devel zlib-devel pcre-devel -y

源码编译安装步骤

  1. 下载源码包
wget https://example.com/software-version.tar.gz
  1. 解压源码包
tar -xzvf software-version.tar.gz
cd software-version
  1. 配置
./configure --prefix=/usr/local/software --with-feature
  1. 编译
make -j$(nproc)  # 使用所有可用的 CPU 核心
  1. 安装
sudo make install
  1. 配置环境变量(可选):
sudo vim /etc/profile.d/software.sh

添加以下内容:

export PATH=$PATH:/usr/local/software/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/software/lib

使环境变量生效:

source /etc/profile.d/software.sh

容器化软件安装

Docker 提供了另一种安装和运行软件的方式,特别适合开发和测试环境:

安装 Docker

# 安装 Docker 依赖
sudo dnf install dnf-utils device-mapper-persistent-data lvm2 -y

# 添加 Docker 仓库
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker CE
sudo dnf install docker-ce docker-ce-cli containerd.io -y

# 启动 Docker 服务
sudo systemctl start docker

# 设置 Docker 开机自启
sudo systemctl enable docker

# 验证 Docker 安装
sudo docker run hello-world

使用 Docker 安装软件

# 拉取软件镜像
sudo docker pull nginx

# 运行容器
sudo docker run -d -p 80:80 --name nginx-server nginx

# 列出运行中的容器
sudo docker ps

软件包管理最佳实践

  1. 优先使用官方仓库:官方仓库中的软件包经过测试,与系统兼容性更好
  2. 定期更新系统sudo dnf update 可以确保系统安全和稳定
  3. 保持系统清洁:使用 sudo dnf autoremove 清理不再需要的依赖
  4. 谨慎添加第三方仓库:第三方仓库可能导致软件包冲突
  5. 备份配置文件:在升级重要软件前备份配置文件
  6. 使用 DNF 历史:了解系统上的软件包变更历史
  7. 验证软件包签名:确保软件包的完整性和来源

常见问题与解决方案

依赖冲突

  • 问题:安装软件包时出现依赖冲突
  • 解决方案
    • 尝试使用 --best--allowerasing 选项:sudo dnf install package --allowerasing
    • 检查是否有冲突的仓库,暂时禁用它们:sudo dnf --disablerepo=problematic-repo install package
    • 查找并删除冲突的软件包:sudo dnf remove conflicting-package

仓库不可用

  • 问题:无法访问软件仓库
  • 解决方案
    • 检查网络连接:ping mirror.rockylinux.org
    • 清理缓存:sudo dnf clean all
    • 尝试使用不同的镜像:编辑仓库配置文件中的 baseurl
    • 暂时禁用有问题的仓库:sudo dnf --disablerepo=problematic-repo update

GPG 密钥错误

  • 问题:安装软件包时出现 GPG 密钥错误
  • 解决方案
    • 导入正确的 GPG 密钥:sudo rpm --import key-url
    • 临时禁用 GPG 检查(不推荐):sudo dnf install package --nogpgcheck

软件包无法找到

  • 问题:无法找到需要的软件包
  • 解决方案
    • 检查软件包名称是否正确:sudo dnf search keyword
    • 确保已启用包含该软件包的仓库:sudo dnf repolist
    • 考虑添加提供该软件包的第三方仓库
    • 如果官方仓库中没有,尝试从源码编译安装

总结

本教程详细介绍了 Rocky Linux 中的软件包管理系统,包括:

  • DNF 包管理器的基本和高级使用方法
  • RPM 包管理工具的使用
  • 软件仓库的管理,包括添加、启用和禁用仓库
  • 常用的第三方软件仓库
  • 从源码编译安装软件
  • 使用 Docker 容器化安装软件
  • 软件包管理的最佳实践和常见问题排查

掌握这些软件包管理技能,您可以轻松地在 Rocky Linux 系统中安装、更新和管理软件,保持系统的安全和稳定。在实际应用中,根据软件的重要性和来源,选择合适的安装方法,确保系统的安全性和稳定性。