目录
Please enable Javascript to view the contents

Linux查漏补缺-4: 安装包管理

 ·  ☕ 7 分钟
核心结论说明
RPM / DEB 是包格式,也是底层包管理体系负责安装、卸载、查询本地包,但依赖处理能力有限
YUM / DNF / APT 是仓库管理器负责从远程仓库解析依赖、下载软件包、统一升级
DNF 是 YUM 的下一代实现RHEL 8+ / Fedora 默认使用 DNF,命令兼容大部分 YUM 用法
Snap / Flatpak / AppImage 偏应用分发更适合桌面应用或跨发行版分发,不是传统系统包管理的完全替代
生产环境不建议随意 update/upgrade 全量升级应固定仓库、固定版本、先测试再发布

1.简介

Linux 安装软件时,容易混淆几个概念:

  • rpmdpkg 是什么;
  • yumdnfapt 有什么区别;
  • 为什么手动安装 .rpm / .deb 经常报依赖错误;
  • 为什么同一个软件在 CentOS、Ubuntu、Fedora 上安装命令不同;
  • Snap、Flatpak、AppImage 和传统包管理器是什么关系。

本文按“包格式 → 本地包管理器 → 仓库管理器 → 应用分发方式”的顺序梳理。

2.说明

2.1 包管理分层

Linux 包管理可以分为三层:

层级作用RPM 系Debian 系
包文件格式单个软件包文件.rpm.deb
本地包管理器安装、卸载、查询本地包rpmdpkg
仓库管理器解析依赖、下载、升级yum / dnfapt
手动安装 .rpm / .deb 时,依赖通常需要自己解决;通过 yum/dnf/apt 安装时,依赖由仓库管理器解析。

2.2 RPM 系:CentOS / RHEL / Fedora

2.2.1 rpm:底层包管理器

rpm 负责安装、卸载、升级、查询 RPM 包。它会维护本机软件包数据库,记录软件版本、文件列表、依赖关系等信息。

常用命令:

命令作用
rpm -ivh package.rpm安装 RPM 包
rpm -Uvh package.rpm升级 RPM 包,如果未安装则安装
rpm -Fvh package.rpm只升级已安装的软件包
rpm -e package卸载软件包
rpm -qa列出已安装的所有 RPM 包
rpm -qi package查看已安装包信息
rpm -ql package查看软件包安装了哪些文件
rpm -qf /path/file查询某个文件属于哪个 RPM 包
rpm -qpi package.rpm查看未安装 RPM 包的信息
rpm -qpl package.rpm查看未安装 RPM 包包含哪些文件
rpm -V package校验已安装文件是否被修改

常见问题:

1
2
3
rpm -ivh nginx.rpm
# error: Failed dependencies:
#         libxxx.so.1()(64bit) is needed by nginx

原因:rpm 知道依赖缺失,但不会自动从远程仓库把依赖全部下载并安装。

2.2.2 yum:仓库管理器

yumrpm 之上增加了仓库和依赖解析能力。用户只需要声明要安装的软件,yum 会根据仓库元数据计算依赖并下载。

常用命令:

命令作用
yum repolist查看启用的仓库
yum repolist all查看所有仓库
yum list installed查看已安装软件包
yum list available查看仓库可安装软件包
yum info package查看软件包信息
yum install package安装软件包
yum reinstall package重新安装软件包
yum update package升级指定软件包
yum update升级所有可升级软件包
yum remove package卸载软件包
yum clean all清理缓存
yum makecache重建仓库缓存
yum provides */command查询哪个包提供某个命令或文件
yum history查看安装/升级历史

仓库配置文件通常位于:

1
/etc/yum.repos.d/*.repo

示例:

1
2
3
4
5
6
[base]
name=Base Repository
baseurl=https://mirror.example.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://mirror.example.com/RPM-GPG-KEY

2.2.3 dnf:YUM v4

dnfyum 的下一代实现,RHEL 8+、Fedora 默认使用。相比传统 yumdnf 依赖解析更稳定,性能更好,API 也更清晰。

多数命令可直接替换:

1
2
3
4
5
dnf install nginx
dnf remove nginx
dnf update nginx
dnf repolist
dnf provides '*/nginx'

在 RHEL 8+ 中,很多系统上的 yum 实际已经是 dnf 的兼容入口。

2.3 Debian 系:Debian / Ubuntu

2.3.1 dpkg:底层包管理器

dpkg 负责安装、卸载、查询 .deb 包。它类似 RPM 系中的 rpm

常用命令:

命令作用
dpkg -i package.deb安装 DEB 包
dpkg -r package卸载软件包,保留配置
dpkg -P package卸载软件包并删除配置
dpkg -l查看已安装包列表
dpkg -s package查看包状态和信息
dpkg -L package查看软件包安装了哪些文件
dpkg -S /path/file查询文件属于哪个 DEB 包

常见依赖问题:

1
2
dpkg -i package.deb
# dependency problems prevent configuration of package

修复方式:

1
apt -f install

apt -f install 会尝试修复依赖关系,安装缺失依赖或移除不完整包。

2.3.2 apt:仓库管理器

apt 是 Debian 系常用的仓库管理器,负责解析依赖、下载软件包、升级系统。

常用命令:

命令作用
apt update更新仓库索引
apt install package安装软件包
apt reinstall package重新安装软件包
apt remove package卸载软件包,保留配置
apt purge package卸载软件包并删除配置
apt upgrade升级已安装软件包,不主动移除包
apt full-upgrade升级系统,必要时可移除或安装包
apt autoremove删除不再需要的依赖包
apt search keyword搜索软件包
apt show package查看软件包信息
apt list --installed查看已安装包

仓库配置文件:

1
2
/etc/apt/sources.list
/etc/apt/sources.list.d/*.list

Ubuntu 22.04 常见源格式:

1
2
3
deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu jammy-security main restricted universe multiverse

需要注意:

  • apt update 只更新索引,不升级软件;
  • apt upgrade 才会升级软件;
  • apt full-upgrade 可能移除包,生产环境需要谨慎;
  • 脚本中更建议使用 apt-get,交互使用可以用 apt

2.4 Snap / Flatpak / AppImage

这些工具更偏应用分发,不是传统系统包管理器的完全替代。

工具特点常见场景
SnapCanonical 主导,应用和依赖打包,沙箱运行Ubuntu 桌面应用、跨发行版应用
Flatpak桌面应用分发,依赖运行时Linux 桌面应用
AppImage单文件运行,不强依赖系统安装便携式桌面软件

它们解决的问题:

  • 不同发行版依赖版本不一致;
  • 软件需要快速分发到多个发行版;
  • 桌面应用不想依赖系统仓库版本。

它们带来的问题:

  • 体积更大;
  • 与系统服务集成不如原生包;
  • 沙箱权限、自动更新、路径管理需要额外关注。

2.5 常见排查命令

2.5.1 查询命令来自哪个包

RPM 系:

1
2
3
rpm -qf /usr/bin/curl
yum provides '*/curl'
dnf provides '*/curl'

Debian 系:

1
2
dpkg -S /usr/bin/curl
apt-file search /usr/bin/curl

apt-file 需要额外安装并更新索引:

1
2
apt install apt-file
apt-file update

2.5.2 查询包安装了哪些文件

RPM 系:

1
rpm -ql nginx

Debian 系:

1
dpkg -L nginx

2.5.3 查询本机安装了哪些包

RPM 系:

1
rpm -qa

Debian 系:

1
2
dpkg -l
apt list --installed

2.5.4 清理缓存

RPM 系:

1
2
yum clean all
dnf clean all

Debian 系:

1
2
apt clean
apt autoclean

区别:

命令说明
apt clean删除本地所有已下载 .deb 缓存
apt autoclean只删除已经无法从仓库下载的旧包缓存

2.6 镜像源与离线源

生产环境常见两类需求:

场景目标典型做法
使用镜像源加速下载、降低外网依赖替换为公司内网源或可信公共镜像源
自建离线源无外网环境安装软件缓存完整软件包和仓库元数据

2.6.1 使用镜像源

镜像源本质是把包管理器的远程仓库地址换成更近、更稳定、可控的地址。

Debian / Ubuntu 修改 APT 源:

1
2
3
cp /etc/apt/sources.list /etc/apt/sources.list.bak
vim /etc/apt/sources.list
apt update

示例格式:

1
2
3
deb http://mirror.example.com/ubuntu jammy main restricted universe multiverse
deb http://mirror.example.com/ubuntu jammy-updates main restricted universe multiverse
deb http://mirror.example.com/ubuntu jammy-security main restricted universe multiverse

RHEL / CentOS 修改 YUM / DNF 源:

1
2
3
4
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
vim /etc/yum.repos.d/internal.repo
yum clean all
yum makecache

示例格式:

1
2
3
4
5
6
[base]
name=Internal Base Repo
baseurl=http://mirror.example.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://mirror.example.com/RPM-GPG-KEY

需要注意:

  • 不建议混用多个发行版源,例如 Ubuntu 22.04 混入 20.04 源;
  • 不建议随意关闭 gpgcheck,除非是临时排障;
  • 生产环境建议固定镜像源快照,避免今天装和明天装的软件版本不同。

2.6.2 缓存 RPM 离线源

RPM 系离线源需要两部分:

  1. RPM 包文件;
  2. 仓库元数据,也就是 repodata/

在线机器下载包和依赖:

1
2
mkdir -p /data/offline-repo/rpms
reposync -p /data/offline-repo --download-metadata

如果只下载指定软件及其依赖,可以使用:

1
2
3
yum install -y yum-utils
mkdir -p /data/offline-repo/rpms
yumdownloader --resolve --destdir=/data/offline-repo/rpms nginx

生成仓库元数据:

1
2
yum install -y createrepo
createrepo /data/offline-repo/rpms

离线机器配置本地仓库:

1
2
3
4
5
[offline]
name=Offline Repo
baseurl=file:///data/offline-repo/rpms
enabled=1
gpgcheck=0

刷新缓存并安装:

1
2
3
yum clean all
yum makecache
yum install nginx

2.6.3 缓存 DEB 离线源

Debian / Ubuntu 离线安装也需要两部分:

  1. .deb 包文件;
  2. Packages 索引文件。

在线机器下载指定软件及依赖:

1
2
3
4
mkdir -p /data/offline-repo/debs
cd /data/offline-repo/debs
apt download nginx
apt-cache depends nginx | grep Depends | awk '{print $2}' | xargs apt download

上面方式适合简单依赖,复杂场景建议使用 apt-mirroraptly 或在同版本干净机器上执行 apt-get --download-only install

1
2
3
apt-get install --download-only nginx
mkdir -p /data/offline-repo/debs
cp /var/cache/apt/archives/*.deb /data/offline-repo/debs/

生成本地索引:

1
2
cd /data/offline-repo
dpkg-scanpackages debs /dev/null | gzip -9c > debs/Packages.gz

离线机器配置本地源:

1
deb [trusted=yes] file:/data/offline-repo debs/

刷新索引并安装:

1
2
apt update
apt install nginx
离线源的关键不是“把 rpm/deb 拷过去”,而是同时准备依赖包和仓库元数据。否则包管理器无法正常解析依赖。

2.7 生产环境建议

场景建议
安装服务优先使用发行版官方仓库或可信内部仓库
固定版本使用版本号安装,避免无意升级
批量机器建议建设内部镜像源,减少外网依赖
容器镜像Dockerfile 中固定基础镜像版本和包版本
安全更新先测试,再分批升级
离线环境准备完整依赖包和仓库元数据,不要只拷贝单个 rpm/deb

不建议生产环境直接执行:

1
2
3
4
apt upgrade -y
apt full-upgrade -y
yum update -y
dnf upgrade -y

更稳妥的方式:

  1. 确认升级范围;
  2. 在测试环境验证;
  3. 备份配置和数据;
  4. 分批升级;
  5. 保留回滚方案。

3.总结

  1. RPM / DEB 是软件包格式,rpm / dpkg 是底层包管理器,主要负责本地包安装、卸载、查询;
  2. yum / dnf / apt 是仓库管理器,核心价值是依赖解析、远程下载、统一升级;
  3. RHEL 8+ 默认使用 DNF,Ubuntu / Debian 使用 APT;
  4. Snap / Flatpak / AppImage 更偏应用分发,适合桌面软件或跨发行版分发;
  5. 镜像源用于加速和统一来源,离线源必须同时准备软件包和仓库元数据;
  6. 生产环境安装软件时,重点不是命令本身,而是仓库来源、版本固定、升级策略和回滚方案。

4.参考

分享

Hex
作者
Hex
CloudNative Developer