主题
软件包管理
Linux 的精髓之一就是包管理器——一条命令安装、卸载、升级软件,依赖自动解决。本篇覆盖 APT/YUM/DNF 三大阵营,以及源码编译和新型打包格式。
三大包管理器对比
| APT (Debian/Ubuntu) | YUM (RHEL 7-) | DNF (RHEL 8+/Fedora) | |
|---|---|---|---|
| 安装 | apt install pkg | yum install pkg | dnf install pkg |
| 移除 | apt remove pkg | yum remove pkg | dnf remove pkg |
| 搜索 | apt search keyword | yum search keyword | dnf search keyword |
| 更新索引 | apt update | yum makecache | dnf makecache |
| 检查可更新包 | apt list --upgradable | yum check-update | dnf check-update |
| 升级包 | apt upgrade | yum update | dnf upgrade |
| 查看包信息 | apt show pkg | yum info pkg | dnf info pkg |
| 列出已安装 | apt list --installed | yum list installed | dnf list --installed |
| 清理缓存 | apt clean | yum clean all | dnf 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,实在不行才源码编译
新型打包格式
| 格式 | 特点 | 适用场景 |
|---|---|---|
| Snap | Canonical 主导,沙箱隔离,自动更新 | 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 验证,再灰度到生产
加载练习题中...