大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
包管理
这一课你将能做到
- 用 apt 完成软件的搜索、安装、升级、卸载全流程,并能处理常见的依赖报错
- 查看已安装包的版本、文件清单和依赖关系,排查「某个命令是哪个包提供的」这类问题
- 理解 apt 仓库的工作原理,能更换国内镜像源加速下载,知道 PPA 和 snap 的适用场景
为什么要学
Windows 装软件是「下载 exe → 双击 → 下一步」,Linux 装软件是「一条命令,自动解决依赖」。本站服务器(Ubuntu)上的 Nginx、MySQL、Redis 全部通过 apt 安装。包管理器不仅负责安装,还管升级(安全补丁)、卸载(清理残留)、依赖解析(A 依赖 B,装 A 时自动装 B)。
不理解包管理,你会在「为什么 apt install 报错」「为什么升级后服务起不来」「磁盘被旧内核占满」这类问题上反复栽跟头。面试中「apt 和 yum 的区别」「如何查找某个文件属于哪个包」是运维基础题。
先建立图像
apt 的工作流程:
你的命令 apt 内部动作 远程仓库
┌──────────────┐
│ apt install │ ──→ 1. 读本地包索引 (/var/lib/apt/lists)
│ nginx │ 2. 解析依赖树(nginx 依赖哪些库)
└──────────────┘ 3. 计算需要下载的 .deb 包清单 ──→ ┌─────────────┐
4. 下载 .deb 到 /var/cache/apt ←── │ archive. │
5. 用 dpkg 解包安装 │ ubuntu.com │
6. 运行配置脚本、启动服务 └─────────────┘
关键概念:
- 仓库(Repository):存放 .deb 包和索引的远程服务器
- 索引:包名、版本、依赖关系的清单,apt update 就是更新它
- dpkg:底层的包安装工具,apt 是它的「智能前端」
跟着做
步骤 1:更新包索引——一切操作的前提
sudo apt update
这条命令不升级任何软件,只是从仓库下载最新的「包清单」。装任何软件前都应该先跑一遍,否则可能装到旧版本或报「找不到包」。
步骤 2:搜索与查看包信息
apt search redis # 搜索名字含 redis 的包
apt show redis-server # 查看包的详细信息:版本、依赖、描述、大小
apt policy redis-server # 查看可安装的版本和优先级
步骤 3:安装软件
# 安装单个包,-y 自动回答 yes(脚本中必加)
sudo apt install -y nginx
# 一次装多个
sudo apt install -y redis-server mysql-server
# 安装指定版本(先看 apt policy 有哪些版本)
sudo apt install -y nginx=1.24.0-2ubuntu7
# 只下载不安装(离线部署时有用)
apt download nginx # 下载 .deb 到当前目录
sudo dpkg -i nginx_*.deb # 本地安装(依赖不全时会报错)
sudo apt -f install # 修复 dpkg 留下的依赖问题
步骤 4:升级与卸载
# 查看哪些包可以升级
apt list --upgradable
# 升级所有包(生产环境谨慎!先看变更列表)
sudo apt upgrade -y
# 完整升级(允许卸载冲突包、装新依赖,更接近「发行版升级」)
sudo apt full-upgrade -y
# 卸载软件(保留配置文件)
sudo apt remove nginx
# 彻底卸载(连配置文件一起删)
sudo apt purge nginx
# 清理不再被需要的依赖(释放空间)
sudo apt autoremove -y
生产经验:升级 MySQL 这类核心服务前,先在测试环境验证;apt upgrade 会顺带升级内核,升级后需重启生效。
步骤 5:查询已安装的包
# 列出所有已安装的包
apt list --installed
# 查某个包是否已安装及版本
apt list --installed | grep nginx
dpkg -l | grep nginx
# 查看某个包安装了哪些文件(配置文件、二进制在哪)
dpkg -L nginx-core
# 反查:某个文件是哪个包提供的(排查神器)
dpkg -S /usr/sbin/nginx
# 输出:nginx-core: /usr/sbin/nginx
# 查看包的依赖关系
apt-cache depends nginx
apt-cache rdepends nginx # 反向依赖:谁依赖 nginx
步骤 6:更换国内镜像源(提速 10 倍)
默认源在国外,下载慢。换成阿里云镜像:
# 备份原配置
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# Ubuntu 24.04 起源配置迁移到了 /etc/apt/sources.list.d/ubuntu.sources
# Ubuntu 22.04 及之前直接编辑 sources.list
sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list
sudo sed -i 's@//.*security.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list
sudo apt update # 换源后必须刷新索引
步骤 7:安装第三方仓库——以 MySQL 官方源为例
Ubuntu 自带仓库的 MySQL 版本可能偏旧,需要官方最新版时:
# 通用流程:加 GPG 密钥 → 加仓库 → update → install
# 示例:安装 Docker 官方仓库(本站容器化时会用到)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install -y docker-ce
步骤 8:snap——apt 之外的补充
snap list # 查看已安装的 snap 包
sudo snap install certbot --classic # 安装 HTTPS 证书工具(官方推荐 snap 方式)
snap 自带依赖、自动更新,适合桌面软件和 certbot 这类工具;服务器端服务类软件(Nginx/MySQL)仍推荐 apt,资源占用和集成度更好。
讲清楚要点
apt update和apt upgrade是两回事:update 刷新包清单(下载索引),upgrade 才真正升级软件。只 upgrade 不 update,升的是旧清单里的版本。remove留配置,purge全删除:卸载 MySQL 用remove重装后配置还在;想彻底重来必须purge。注意 purge 不删数据目录(/var/lib/mysql),要手动rm。- apt 是 dpkg 的智能前端:dpkg 只负责解包安装,不管依赖;apt 自动解析依赖、下载、按顺序安装。底层装 .deb 用
dpkg -i,依赖报错用apt -f install修。 apt autoremove释放空间:内核升级后旧内核残留,定期 autoremove 能清出几百 MB。但要确认没在运行的旧内核被误删(一般会自动保留当前运行的)。- 第三方仓库三件套:GPG 密钥(验证包的签名,防篡改)+ 仓库地址(.list 文件)+
apt update。缺少密钥会报NO_PUBKEY错误。 apt-cache policy看版本来源:同一个包多个仓库都有时,它会告诉你 apt 实际会装哪个版本、来自哪个源。- 锁定版本防意外升级:
sudo apt-mark hold mysql-server锁定后 upgrade 不会动它;apt-mark unhold解除。生产数据库服务器常用。
你可能会懵的地方
-
为什么 apt install 报
Unable to locate package? 三种可能:包名打错了;没跑apt update;包不在已配置的仓库里(需要加 PPA 或官方源)。用apt search确认正确的包名。 -
PPA 是什么?安全吗? PPA(Personal Package Archive)是个人/团队在 Launchpad 上维护的第三方仓库。方便但质量参差不齐,生产环境优先选软件官方仓库,慎用来源不明的 PPA。
-
apt 和 apt-get 有什么区别?
apt是新一代命令,输出更友好(有进度条、彩色提示),适合交互使用;apt-get是老命令,输出稳定,适合写进脚本。功能基本等价。 -
为什么
apt upgrade说「有 N 个包被保留未升级」? 这些包升级需要安装新依赖或卸载旧包,upgrade 默认不做这种「破坏性」操作。需要apt full-upgrade或逐个apt install 包名。 -
下载的 .deb 缓存在哪里?占空间怎么办? 缓存在
/var/cache/apt/archives/。sudo apt clean清空缓存,sudo apt autoclean只清理已过期版本的缓存。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 不 update 直接 install | 装到旧版本或找不到包 | sudo apt update && sudo apt install -y xxx |
apt remove mysql-server 后以为数据没了/还在 | remove 不删 /var/lib/mysql 数据 | 备份后手动 sudo rm -rf /var/lib/mysql |
生产环境随手 apt full-upgrade | 可能重启关键服务、引入不兼容变更 | 测试环境验证后,维护窗口内执行 |
用 dpkg -i 装包后依赖报错就放弃 | dpkg 不管依赖 | sudo apt -f install 自动补齐依赖 |
| 把 22.04 的源配置照搬到 24.04 | 24.04 改用 deb822 格式(ubuntu.sources) | 按版本编辑对应文件 |
apt purge nginx 后重装想恢复旧配置 | purge 已删配置 | 卸载前备份 /etc/nginx/ |
卡点急救
-
现象:
E: Could not get lock /var/lib/dpkg/lock-frontend另一个 apt 进程正在运行(可能是系统自动升级 unattended-upgrades)。解决:等几分钟;确认没进程在跑后sudo rm /var/lib/dpkg/lock-frontend并sudo dpkg --configure -a。 -
现象:
NO_PUBKEY XXXX签名验证失败 缺少仓库的 GPG 公钥。解决:按该软件官方文档导入密钥;临时绕过可用--allow-unauthenticated(不推荐)。 -
现象:安装中断后任何 apt 操作都报
dpkg was interrupteddpkg 数据库处于不一致状态。解决:sudo dpkg --configure -a恢复,然后再继续 apt 操作。
面试常问
-
apt 和 yum/dnf 的区别? 都是包管理器,apt 用于 Debian 系(Debian/Ubuntu),包格式 .deb;yum/dnf 用于 RedHat 系(CentOS/RHEL/Fedora),包格式 .rpm。dnf 是 yum 的继任者。核心概念(仓库、索引、依赖解析)完全一致。
-
如何查找某个命令是哪个包提供的? 已安装的情况:
dpkg -S $(which nginx)。未安装的情况:apt-file search /usr/bin/xxx(需apt install apt-file并apt-file update)。 -
生产环境如何安全地升级系统? 快照/备份 →
apt update && apt list --upgradable审查变更 → 锁定关键包(apt-mark hold)→ 维护窗口执行 upgrade → 验证服务状态 → 必要时重启。内核升级必须重启才生效,可用needrestart检查哪些服务需要重启。
自测三问
apt remove和apt purge的区别是什么?卸载后 MySQL 的数据文件还在吗?- 执行
apt install报Unable to locate package,按什么顺序排查? - 如何锁定 mysql-server 包,防止
apt upgrade时把它一起升级?
小结一句话
apt 的核心就四件事——update 刷新清单、install 装、upgrade 升、remove/purge 卸;记住「先 update 再操作,生产升级先测试」,包管理就不会出事。
延伸
- Debian APT 用户手册
- Ubuntu 包管理官方文档
- 下一课:systemd 服务——管理 Nginx、MySQL、Redis 的启动、停止与开机自启。