软件包管理避坑指南:Yum / Apt 换源与生产实践

软件管理是所有 Linux 操作的入口,装错了源、乱跑了 update,轻则环境不可用,重则直接干崩生产。这篇把两系包管理的日常操作和生产避坑点整理成一份清单。

一、先建立两层结构的心智模型

不管哪个发行版,软件管理都是两层:

  • 高层工具(自动解决依赖):RedHat 系 yum/dnf、Debian 系 apt/apt-get——生产中 99% 的场景用它们;
  • 底层工具(只管单个包):rpmdpkg——只在装本地安装包、排查依赖时用。

配置文件位置:RedHat 系在 /etc/yum.repos.d/(每个 .repo 一个源),Debian 系在 /etc/apt/sources.listsources.list.d/

二、RedHat 系日常操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装
yum install -y nginx # -y 自动确认(脚本里必须加)
yumdownloader --resolve nginx # 只下载不安装(排查依赖问题用)

# 查询
yum info nginx # 包信息
rpm -qa # 已安装的所有包
rpm -ql nginx # 某个包装了哪些文件
rpm -qf /usr/sbin/nginx # 反查:这个文件属于哪个包
rpm -qi nginx # 包的详细信息

# 升级(生产慎用!)
yum update --security -y # 只更新安全补丁(生产推荐)
yum update -y # 全量更新——可能升级内核导致重启起不来

全量 yum update 是生产大忌。我吃过一次亏:凌晨跑了个全量升级,把内核从 3.10 升到了新版本,第二天重启服务器直接进不去系统,最后靠 grub 手动切回旧内核才救回来。从那以后生产只做 --security 安全更新,大版本升级一律走变更评审 + 灰度环境验证。

换源(阿里云,CentOS 7 为例):

1
2
3
4
mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/bak/
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all && yum makecache

本地 rpm 安装(底层工具):

1
2
3
4
rpm -ivh nginx-1.20.1-1.el7.x86_64.rpm   # 安装本地包(-i 安装 -v 详细 -h 进度条)
rpm -Uvh nginx-1.20.1-1.el7.x86_64.rpm # 升级安装(没装过就装,装过就升)
rpm -e nginx # 卸载
rpm -e --nodeps nginx # 强删(极少用,除非确认后果)

三、Debian 系日常操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 源:deb = 二进制包源(一般用不到 deb-src 源码源)
# 组件:main/restricted/universe/multiverse(开源程度不同)

apt update # 刷新索引(相当于 makecache)
apt install -y nginx
apt search nginx
apt show nginx # 包信息
apt depends nginx # 依赖关系

# 升级:只更新已装包(不增删依赖)
apt update && apt upgrade -y
# 完整升级:会处理依赖变更,可能删旧包
apt full-upgrade -y

apt remove nginx # 卸载保留配置
apt purge nginx # 彻底卸载(连 /etc 配置一起删)
apt autoremove -y # 清理孤立依赖(装完卸完跑一下)

本地 deb 安装与依赖修复:

1
2
3
4
dpkg -i nginx_1.18.0-0ubuntu1_amd64.deb
apt install -f -y # 报依赖错误时修复,自动补装缺失依赖
dpkg -l nginx # 状态标记:ii=已安装, rc=删了但配置残留
dpkg -S /usr/sbin/nginx # 反查文件属于哪个包

四、两个高频排障场景

  1. 装包报依赖错误:先 yum search/yum deplist(或 apt depends)看依赖闭包,缺什么补什么;本地包优先用高层工具的本地安装参数(yum localinstall),让依赖自动解决。
  2. rpm -qf 反查没结果:文件可能是手动编译安装的,不在任何 rpm 包内——这类文件升级时要特别注意,卸载重装会丢。

小结

包管理的核心纪律就三条:换源用国内镜像、生产只做安全更新、卸载前看清依赖提示。把这三点写进初始化检查清单(见《Linux 发行版选型与系统初始化实践》),基本能避开 90% 的软件管理事故。