跳转至

Linux 软件包管理:从安装到仓库配置的完全指南

在 Linux 系统中,软件包管理是安装、升级、卸载软件的标准方式。不同发行版有着各自的包管理工具,但核心思想相通:软件被封装成“包”,依赖关系由包管理器自动处理,仓库(repository)提供软件的来源。本文将带你掌握 aptdnfpacman 等主流包管理器的使用,以及如何解决日常中遇到的依赖问题、软件源配置等场景。

💡 还不错

很多初学者喜欢从官网下载 .tar.gz 源代码手动编译安装。我的建议是:能用包管理器就别手动编译。包管理器不仅会处理依赖,还能让你方便地卸载、更新软件。我曾经在生产环境手动编译了 Nginx,两年后需要升级 OpenSSL 时,发现完全记不清当初的编译参数,最后只得重新部署。从那时起,只要仓库提供的版本不是太老,一律用 apt install nginx


一、主流包管理器概览

发行版家族 包管理器 底层工具 包格式 前端命令(常用)
Debian / Ubuntu APT dpkg .deb apt, apt-get, aptitude
RHEL / Fedora / Rocky DNF rpm .rpm dnf, yum(旧)
openSUSE Zypper rpm .rpm zypper
Arch Linux Pacman pacman .pkg.tar.zst pacman
Gentoo Portage ebuild emerge

本文重点介绍 APT(Ubuntu/Debian)、DNF(Fedora/RHEL)和 Pacman(Arch Linux),其他可以类推。


二、APT 包管理(Debian/Ubuntu 系列)

基本操作

操作 命令
更新软件源列表 sudo apt update
升级所有已安装包 sudo apt upgrade
完整升级(包含内核和部分依赖变化) sudo apt full-upgrade
搜索软件包 apt search <keyword>
查看软件包详细信息 apt show <package>
安装软件包 sudo apt install <package>
卸载软件包(保留配置文件) sudo apt remove <package>
卸载并清除配置文件 sudo apt purge <package>
删除不再需要的依赖包 sudo apt autoremove
清理下载的 .deb 缓存 sudo apt clean

常用组合示例

# 安装三个软件包
sudo apt install vim git curl

# 卸载并清理配置
sudo apt purge --auto-remove nginx

# 模拟执行(查看会安装哪些包,但不实际安装)
sudo apt install --dry-run docker.io

管理软件源(仓库)

软件源配置文件位于 /etc/apt/sources.list/etc/apt/sources.list.d/ 目录下。

# 备份原始源文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 编辑源列表(例如更换为国内镜像)
sudo vim /etc/apt/sources.list

# 添加第三方源(例如 Docker)
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list

# 添加 GPG 密钥(防止篡改)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg

💡 推荐给你

在国内使用 Ubuntu,第一件事就是把软件源换到国内镜像(阿里云、清华、中科大)。但要注意:lsb_release -cs 返回的是发行版代号(如 focaljammy),不要混用不同版本的源。有一次我错把 bullseye(Debian 11)的源写进了 Ubuntu 系统,导致大量软件包不兼容。另外,aptapt-get 的区别:apt 更现代,进度条友好,但某些脚本中仍然需要用 apt-get,因为它的输出更稳定。


三、DNF 包管理(Fedora / RHEL / Rocky 系列)

基本操作

操作 命令
检查更新 sudo dnf check-update
升级所有包 sudo dnf upgrade
搜索软件包 dnf search <keyword>
查看包信息 dnf info <package>
安装软件 sudo dnf install <package>
卸载软件 sudo dnf remove <package>
删除无用依赖 sudo dnf autoremove
清理缓存 sudo dnf clean all
列出已安装的包 dnf list installed

管理模块化(Module)

Fedora 引入了模块化概念,同一软件可以选不同版本流(stream)。

# 查看某个模块可用的流
dnf module list nodejs

# 安装特定流的 Node.js 14
sudo dnf module install nodejs:14

仓库管理

仓库配置文件在 /etc/yum.repos.d/ 目录下(.repo 文件)。

# 添加 EPEL 仓库(Extra Packages for Enterprise Linux)
sudo dnf install epel-release

# 启用/禁用仓库
sudo dnf --enablerepo=epel install <package>
sudo dnf --disablerepo=\* --enablerepo=baseos install <package>

💡 经验之谈

RHEL 及其免费克隆(Rocky、AlmaLinux)的软件源往往比较旧,生产环境求稳定是好事,但开发时可能缺依赖。我一般会启用 EPELPowerTools(RHEL 8/9 中叫 CRB)。另外,dnf 比旧的 yum 快很多,且支持事务回滚——当你发现 dnf update 升级了内核导致机器起不来,可以 dnf history rollback last 回滚,非常有用。


四、Pacman 包管理(Arch Linux 及其衍生版)

基本操作

操作 命令
同步仓库(类似 update sudo pacman -Sy
升级所有包 sudo pacman -Su
同步并升级(常用组合) sudo pacman -Syu
安装软件 sudo pacman -S <package>
卸载软件(保留依赖) sudo pacman -R <package>
卸载软件及其依赖(不再被其他包需要的) sudo pacman -Rs <package>
卸载软件、依赖和配置文件 sudo pacman -Rns <package>
搜索软件包 pacman -Ss <keyword>
查看包详细信息 pacman -Si <package>(远程)、pacman -Qi <package>(本地)
列出所有已安装包 pacman -Q
删除不再需要的依赖 sudo pacman -R $(pacman -Qdtq)

AUR(Arch User Repository)

AUR 是社区维护的软件仓库,包含大量官方仓库没有的软件。

# 安装 AUR 助手(如 yay、paru)
sudo pacman -S --needed git base-devel
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

# 使用 yay 安装 AUR 包
yay -S google-chrome

🔔 提示

pacman -Syu 之前,先去 Arch Linux 官网新闻 看看是否有需要手动干预的更新。我曾经因为没看新闻,直接升级了 glibc 导致系统部分二进制无法运行——恢复备份才解决。从那以后,我坚持用 pacman -Syu 前先 pacman -Syuw 仅下载,再 pacman -Su 实际升级。


五、跨发行版的常见操作与问题解决

查找包属于哪个已安装文件

# Debian/Ubuntu
dpkg -S /path/to/file

# RHEL/Fedora
rpm -qf /path/to/file

# Arch
pacman -Qo /path/to/file

查看某个命令是由哪个包提供的(未安装时)

# Ubuntu(需要安装 apt-file)
sudo apt install apt-file
sudo apt-file update
apt-file search bin/htop

# Fedora
dnf provides */htop

# Arch
pkgfile htop

解决依赖冲突

  • APT:有时需要 apt --fix-broken install 修复损坏的依赖。
  • DNF:会提示冲突的包,可以尝试 dnf distro-sync 强制对齐版本。
  • Pacman:冲突时通常需要手动移除冲突包,或使用 --overwrite 选项(谨慎)。

⚠️ 注意

依赖冲突最常出现在混合使用不同仓库时。例如在 Ubuntu 中同时启用了 ppa:ubuntu-toolchain-r/test(新版 GCC)和官方源,可能导致 libstdc++ 版本冲突。我的原则是:尽量少的第三方源,能用 snap/flatpak 代替的就用容器化方案。另外,当 apt 提示“无法锁定 /var/lib/dpkg/lock”时,通常是有另一个包管理进程在跑(如自动更新)。不要强制删除锁文件,先 ps aux | grep apt 查看进程,确认无危险后再 sudo rm /var/lib/dpkg/lock


六、软件包管理的实践建议

1. 定期清理缓存和旧内核

# Ubuntu 清理旧内核(保留当前和上一个)
sudo apt autoremove --purge

# Fedora 清理旧内核(保留最近的三个)
sudo dnf remove $(dnf repoquery --installonly --latest-limit=-3 -q)

# Arch 清理 pacman 缓存
sudo paccache -r

2. 锁定特定包版本防止意外升级

# APT
sudo apt-mark hold nginx
sudo apt-mark unhold nginx

# DNF
sudo dnf versionlock add nginx
# 需要安装 dnf-plugin-versionlock

# Pacman
# 编辑 /etc/pacman.conf,加入 IgnorePkg = nginx

3. 从源代码编译的注意事项

当必须从源码编译时,遵循以下原则:

  • 使用 checkinstall 代替 make install,它会生成 .deb.rpm 包,方便卸载。
  • 将编译安装目录统一放到 /usr/local 下,不要直接覆盖系统库。
  • 记录编译参数到 /root/compile-notes.log

!!! tip “💡 经验之谈” 我最推荐的编译方式是 构建自己的 deb/rpm 包。例如一个内部工具,写个简单的 debian/ 目录或 .spec 文件,然后用自己的仓库分发。这样团队所有人都能 apt install mytool


七、实战练习

在虚拟机中分别体验不同包管理器(可以用 Docker 容器快速体验):

  1. APT 练习
  2. 启动一个 Ubuntu 容器:docker run -it ubuntu:22.04 bash
  3. 运行 apt update,然后安装 curlvim
  4. 使用 apt search 找到 htop 并安装
  5. 卸载 curl 但保留配置文件,然后 purge 彻底清除
  6. 查看已安装包数量:apt list --installed | wc -l

  7. DNF 练习

  8. 启动 Fedora 容器:docker run -it fedora:38 bash
  9. 启用 EPEL 仓库,安装 neofetch
  10. 尝试 dnf history 查看事务列表,回滚上一次安装

  11. Pacman 练习

  12. 启动 Arch 容器(需使用 archlinux 镜像):docker run -it archlinux bash
  13. 初始化 pacman 密钥:pacman-key --init && pacman-key --populate archlinux
  14. 安装 gitbase-devel
  15. 从 AUR 安装 yay 体验(可跳过,容器内可能需要额外配置)

  16. 综合练习

  17. 在你的主要 Linux 系统中,查看软件源配置文件,确保使用的是国内镜像(如果需要)
  18. 模拟安装一个大型软件(如 docker),观察依赖树
  19. 尝试锁定某个软件的版本,然后运行升级命令,验证是否被跳过

💪 推荐

如果你想彻底理解包管理器原理,可以尝试 搭建一个本地镜像仓库。用 apt-mirror 同步 Ubuntu 源,或者 reposync 同步 RHEL 源,然后修改内网机器的源指向你的镜像。这不仅是技术挑战,还能在公司内部大幅提升安装速度。


总结

软件包管理是 Linux 发行版的“软件供应链”。掌握包管理器的核心命令和仓库配置,能让你:

  • 快速安装所需的工具和运行环境
  • 安全地升级系统和应用
  • 解决令人头疼的依赖冲突
  • 定制自己的软件分发方案

三条黄金经验

  1. 优先使用官方仓库:第三方源要足够信任才添加。
  2. 学习包的元信息:一个包提供了哪些文件、依赖哪些库、版本有什么限制——这些都能通过 apt showdnf infopacman -Qi 找到。
  3. 定期自动更新,但保留手动回滚能力:设置 unattended-upgrades(安全更新自动安装),同时保持 apt historydnf history 日志。

下一步,你可以学习 systemd 服务管理网络配置与防火墙,将软件包管理、权限控制和系统服务串联起来,构建完整的 Linux 运维知识体系。

Happy Packaging!