Skip to content

软件包管理 ​

Linux 的精髓之一就是包管理器——一条命令安装、卸载、升级软件,依赖自动解决。本篇覆盖 APT/YUM/DNF 三大阵营,以及源码编译和新型打包格式。

三大包管理器对比 ​

APT (Debian/Ubuntu)YUM (RHEL 7-)DNF (RHEL 8+/Fedora)
安装apt install pkgyum install pkgdnf install pkg
移除apt remove pkgyum remove pkgdnf remove pkg
搜索apt search keywordyum search keyworddnf search keyword
更新索引apt updateyum makecachednf makecache
检查可更新包apt list --upgradableyum check-updatednf check-update
升级包apt upgradeyum updatednf upgrade
查看包信息apt show pkgyum info pkgdnf info pkg
列出已安装apt list --installedyum list installeddnf list --installed
清理缓存apt cleanyum clean alldnf clean all

APT 深入(Debian/Ubuntu) ​

源配置文件 ​

bash
# 主源文件
cat /etc/apt/sources.list

# 分片源(推荐)
ls /etc/apt/sources.list.d/

# 典型条目格式
# 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://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

常用操作 ​

bash
# 更新软件包索引(安装/升级前必做)
sudo apt update

# 搜索包
apt search nginx
apt show nginx              # 查看详情

# 安装/卸载
sudo apt install nginx
sudo apt install nginx=1.18.0-0ubuntu1    # 指定版本
sudo apt remove nginx        # 卸载但保留配置
sudo apt purge nginx         # 连配置一起删
sudo apt autoremove          # 清理不再需要的依赖

# 升级
sudo apt upgrade             # 升级所有包
sudo apt full-upgrade        # 必要时会卸载冲突包(更激进)
apt list --upgradable        # 查看有哪些可升级

# 锁定版本(防止意外升级)
sudo apt-mark hold linux-image-$(uname -r)
sudo apt-mark unhold linux-image-$(uname -r)
apt-mark showhold            # 查看所有锁定包

添加 PPA / 第三方源 ​

bash
# PPA(Personal Package Archive,Ubuntu 特有)
sudo add-apt-repository ppa:deadsnakes/ppa   # 新版 Python
sudo apt update

# 添加第三方源(以 Docker 为例)
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list
# 现代方式(apt-key 已废弃,自 Ubuntu 22.04+ 起推荐用 signed-by):
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update

安全提示

只添加你信任的源。恶意的第三方源可以替换你系统中的任何软件包。

DNF(RHEL 8+ / Rocky / Alma / Fedora) ​

bash
# 基本操作(语法和 APT 类似,但有细微差别)
sudo dnf check-update              # 检查有哪些可用更新(等同于 apt list --upgradable)
sudo dnf install nginx
sudo dnf remove nginx
sudo dnf autoremove                # 清理孤儿依赖
sudo dnf upgrade                    # 升级所有
sudo dnf history                    # 查看安装/升级历史
sudo dnf history undo 42            # 回滚第 42 次操作

# 添加 EPEL 源(RHEL 系的"扩展包仓库")
sudo dnf install epel-release       # RHEL 8+
# CentOS 7: sudo yum install epel-release

# 模块化包管理(RHEL 8+ 特性)
dnf module list                     # 查看模块流
sudo dnf module install nodejs:20   # 安装 Node.js 20 模块流

查已装软件包 ​

bash
# APT 系
dpkg -l                              # 所有已装包
dpkg -l | grep nginx
dpkg -L nginx                        # 包安装了哪些文件
dpkg -S /usr/sbin/nginx              # 某文件属于哪个包

# RPM 系
rpm -qa                              # 所有已装包
rpm -qa | grep nginx
rpm -ql nginx                        # 包安装了哪些文件
rpm -qf /usr/sbin/nginx              # 某文件属于哪个包
rpm -qi nginx                        # 包详细信息

源码编译 ​

当仓库版本太旧,或需要自定义编译参数时:

bash
# 经典三步走
wget https://example.com/software-1.0.tar.gz
tar xzf software-1.0.tar.gz
cd software-1.0

# 1. 配置(检查依赖、设置编译选项)
./configure --prefix=/opt/software --enable-feature-x
# 常见错误:缺少依赖 → sudo apt install build-essential libxxx-dev

# 2. 编译(-j 并行编译加速)
make -j$(nproc)

# 3. 安装
sudo make install

# 卸载(如果 Makefile 支持)
sudo make uninstall

源码编译的代价

  • 没有自动更新:安全补丁你得自己盯着
  • 依赖地狱:缺什么库自己装,缺什么版本自己找
  • 卸载难:不是所有 Makefile 都有 uninstall 目标
  • 结论:能用包的用包,仓库版本太老优先找 PPA/EPEL,实在不行才源码编译

新型打包格式 ​

格式特点适用场景
SnapCanonical 主导,沙箱隔离,自动更新Ubuntu 桌面生态,IoT
Flatpak社区驱动,桌面应用为主跨发行版桌面应用
AppImage单文件,无需安装,即下即用便携工具,CI/CD 测试
bash
# Snap
snap install nextcloud
snap list
snap remove nextcloud

# Flatpak
flatpak install flathub org.gimp.GIMP
flatpak run org.gimp.GIMP

# AppImage
chmod +x MyApp.AppImage
./MyApp.AppImage

常见坑与排故 ​

坑 1:依赖地狱 ​

bash
# 症状:apt install 报 "unmet dependencies"
sudo apt --fix-broken install      # 先修破损包
sudo apt update && sudo apt upgrade # 再全面升级
# 还是不行?可能是混用了互斥的第三方源,逐个注释排查

坑 2:混用 apt 和 dpkg ​

bash
# 错误做法:sudo dpkg -i some.deb
# 如果这个 deb 有未满足的依赖,dpkg 会报错且系统进入破损状态

# 正确做法(自动解决依赖):
sudo apt install ./some.deb    # 注意 ./ 路径写法

# 如果已经用 dpkg 装了、依赖破损:
sudo apt --fix-broken install

坑 3:磁盘满了导致升级失败 ​

bash
# 先清缓存
sudo apt clean
sudo apt autoremove --purge

# 清理旧内核(Ubuntu 会保留很多)
dpkg -l | grep linux-image | awk '{print $2}'
sudo apt purge linux-image-5.15.0-旧版本号-generic

坑 4:锁文件冲突 ​

bash
# 症状:E: Could not get lock /var/lib/dpkg/lock
# 原因:另一个 apt 进程在运行,或上次异常退出

# 查看谁在用
sudo lsof /var/lib/dpkg/lock

# 确认没有 apt 在跑后,安全删除锁文件
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo dpkg --configure -a

生产环境经验 ​

  • 锁版本:关键包(内核、数据库)用 apt-mark hold 或 yum versionlock 锁定
  • 镜像源:生产服务器换用阿里/腾讯镜像源,速度快且稳定
  • 定时安全更新:用 unattended-upgrades(Ubuntu)或 dnf-automatic(RHEL)自动装安全补丁
  • 升级有策略:先在 staging 环境升级验证,再灰度到生产
  • 清缓存习惯:定期 apt clean / dnf clean all,避免 /var 被缓存撑爆

🎯 本章要点 ​

  • apt update 更新包索引,apt upgrade 真正安装升级
  • apt clean 清除下载缓存释放磁盘空间
  • 升级前先在 staging 验证,再灰度到生产
加载练习题中...

有问题或补充?欢迎留言