包管理是 Linux 发行版最核心的组成部分之一。不同发行版使用不同的包管理工具,但背后的理念高度一致。

包管理的本质

包(Package) 是软件的打包单元,包含可执行文件、配置文件、文档及元数据(版本、依赖关系等)。包管理工具解决三个核心问题:

  • 安装:从何处获取包、如何解压到正确位置。
  • 依赖:软件 A 依赖 B,包管理器自动计算并安装所需依赖。
  • 更新与卸载:追踪已安装文件,确保完整移除或升级。

包管理工具的两大类

类别工具对应发行族
底层工具dpkgrpm直接操作 .deb/.rpm 包文件,不处理依赖
上层工具aptdnf/yumpacman自动解析依赖、从远程仓库获取包

底层工具处理单个包文件,上层工具提供仓库级依赖管理——这是现代包管理的核心能力。

Debian 系(.deb

底层上层发行版
dpkgapt(含 apt-getapt-cacheDebian、Ubuntu 等

核心命令

操作命令
安装本地 .debdpkg -i 包名.deb
查看包信息dpkg -s 包名
列出已安装文件dpkg -L 包名
列出所有已安装包dpkg -l
操作命令
从仓库安装apt install 包名
卸载(保留配置)apt remove 包名
卸载(清除配置)apt purge 包名
更新包列表apt update(同步仓库元数据)
升级所有包apt upgrade(更新软件包)
搜索apt search 关键词
查看包信息apt show 包名

工作机制

  • 软件源配置在 /etc/apt/sources.list/etc/apt/sources.list.d/ 下,指向提供 .deb 包的远程仓库。
  • apt update 同步仓库元数据(即 apt 知道远程仓库里有什么、版本多少、依赖是什么),但不安装任何东西,相当于更新本地索引。
  • apt upgrade 才真正对比本地已安装版本与仓库版本,执行升级。

Red Hat 系(.rpm

底层上层(旧)上层(新)发行版
rpmyumdnfRHEL、Fedora、CentOS 等

yum 是传统工具(RHEL 7 及以前),dnf 是新一代实现(RHEL 8+、Fedora),命令语法基本兼容。dnf 性能更好、依赖解析更先进,yum 命令通常保留为 dnf 的别名。

核心命令

操作命令
安装本地 .rpmrpm -ivh 包名.rpm
查看包信息rpm -qi 包名
列出已安装文件rpm -ql 包名
查询文件属于哪个包rpm -qf /path/to/file
操作命令(dnf/yum)
从仓库安装dnf install 包名
卸载dnf remove 包名
更新包列表dnf makecache(同步仓库元数据)
升级所有包dnf update(也常作 upgrade
搜索dnf search 关键词
查看包信息dnf info 包名
查看历史dnf history

工作机制:与 Debian 系类似,软件源配置在 /etc/yum.repos.d/ 下。dnf makecache 同步仓库元数据到本地,dnf update 执行实际升级。

Arch 系(.pkg.tar.zst

工具发行版
pacmanArch Linux 等

Arch 系不区分底层与上层工具,pacman 统一处理包文件与依赖管理。

核心命令

操作命令
安装pacman -S 包名
安装本地包pacman -U 包名.pkg.tar.zst
卸载(保留配置)pacman -R 包名
卸载(连带依赖)pacman -Rs 包名
卸载(清除配置及依赖)pacman -Rns 包名
同步仓库元数据pacman -Sy(仅更新,不安装)
升级所有包pacman -Syu(同步+升级)
搜索pacman -Ss 关键词
查看包信息pacman -Si 包名(仓库) / pacman -Qi 包名(已安装)
列出已安装包pacman -Q
列出已安装文件pacman -Ql 包名
查询文件属于哪个包pacman -Qo /path/to/file

工作机制:软件源配置在 /etc/pacman.conf 中,仓库地址在 /etc/pacman.d/mirrorlist 里。pacman -Sy 仅同步元数据,pacman -Syu 是更常用的全量更新命令。

通用包管理工具

以下工具跨发行版,以容器化方式运行应用,不依赖系统包管理器,但会占用额外磁盘空间。

工具说明
snapCanonical 主导,应用自包含,自动更新。常用于 Ubuntu,其他发行版也可安装。
flatpak主打桌面应用沙箱,支持多发行版。应用从 Flathub 获取,权限可精细控制。
AppImage单个可执行文件,无需安装,双击即运行。无依赖管理,适合便携式分发。

与系统包管理器的关系:snap/flatpak 的应用运行在沙箱中,与系统其他部分隔离,安全性更高;AppImage 则无需任何包管理器就能运行。它们不解决系统级库依赖问题。

源码编译安装

源码编译是最原始的方式,也是包管理系统出现之前的通用做法。

典型流程

tar -xzf software.tar.gz
cd software
./configure
make
make install
  • ./configure:检测系统环境,生成 Makefile,可指定安装路径 --prefix=/usr/local
  • make:根据 Makefile 编译源代码
  • make install:将编译好的文件复制到系统目录

特点

  • 可定制编译选项(启用/禁用功能,优化特定架构)
  • 不受发行版包管理限制,适合没有打包的软件
  • 缺点:依赖需手动解决,升级与卸载困难(make uninstall 依赖 Makefile 支持,且源码目录通常保留编译状态才能执行;不保留则无法干净卸载,这也是 checkinstall 等工具存在的原因)

替代方案

  • checkinstall:在 make install 前运行,拦截安装过程,生成 .deb.rpm 包并由系统包管理器接管,实现可卸载、可追踪。
  • 构建脚本(如 CMakeMeson)提供更现代的构建流程,但本质仍是源码编译。
  • 部分语言自带包管理器(如 Python 的 pip、Rust 的 cargo、Node.js 的 npm)可编译安装,但通常纳入用户空间而非系统级。

补充概念

  • 软件源(Repository):存储包的远程服务器。包管理器从配置的源中获取包和元数据。
  • 依赖地狱(Dependency Hell):指软件包之间复杂的版本依赖关系难以满足,尤其在手动处理时容易陷入循环依赖或版本冲突。包管理器的核心价值就是自动化解决这一问题。
  • 元数据(Metadata):包的描述信息,包含名称、版本、依赖、维护者、校验和等。apt update / dnf makecache / pacman -Sy 同步的就是这些元数据到本地缓存。
  • 滚动更新 vs 版本发布:Arch 采用滚动更新,无大版本概念,持续更新到最新。Debian/RHEL 采用版本发布模式,大版本内仅获得安全补丁(如 Debian Stable、RHEL 点版本)。两者没有优劣之分,取决于使用场景:服务器追求稳定,桌面追求新特性。