在 Ubuntu 或 Debian 上装软件,你会反复碰到三个名字:apt、dpkg、apt-cache。新手容易把它们当成一回事,其实分工很清楚——apt 负责联网装包,dpkg 负责本地解包,apt-cache 负责查仓库索引。这篇把三者的语法、常用参数和配合方式讲透。
一、先理清三者分工
| 工具 | 定位 | 能不能联网 | 典型用途 |
|---|---|---|---|
apt | 上层包管理 | 能 | 装、卸、升级软件,自动处理依赖 |
apt-cache | 仓库索引查询 | 只读本地索引 | 搜包、看依赖、看版本 |
dpkg | 底层解包 | 不能 | 装本地 .deb 文件、查文件归属 |
一句话:平时九成操作用 apt;要查包的详细信息用 apt-cache;手上有个 .deb 文件、或者要排查"这个文件是谁装的",才轮到 dpkg。
二、apt:日常主力
语法格式
apt[选项]子命令[包名...]常用子命令
| 命令 | 作用 |
|---|---|
sudo apt update | 刷新仓库索引 |
sudo apt upgrade | 升级所有可升级包 |
sudo apt install 包名 | 安装包 |
sudo apt remove 包名 | 卸载,保留配置 |
sudo apt purge 包名 | 卸载并删配置 |
sudo apt autoremove | 清理不再被依赖的孤儿包 |
apt list --installed | 列已装包 |
apt edit-sources | 编辑软件源 |
示例与预期输出
示例 1:安装 nginx
sudoaptupdatesudoaptinstall-ynginx预期输出(节选):
Reading package lists... Done Building dependency tree... Done The following additional packages will be installed: nginx-common nginx-core Suggested packages: fcgiwrap nginx-doc The following NEW packages will be installed: nginx nginx-common nginx-core 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Need to get 577 kB of archives. ... Setting up nginx-core (1.22.0-1ubuntu1.24) ... Setting up nginx (1.22.0-1ubuntu1.24) ...示例 2:卸载并清理
sudoaptremove-ynginxsudoaptautoremove-yremove只删主程序,配置留在/etc/nginx;要连配置一起删用purge。autoremove把当初为了装 nginx 而拉进来、现在没人用的依赖一起清掉。
⚠️ 常见错误
- 新装系统直接 install 报 Unable to locate package:先
sudo apt update。 - 把 update 和 upgrade 搞混:update 只更新索引清单,不装任何东西。
apt和apt-get:新脚本用apt,输出更友好;老文档里的apt-get install照样能跑,不必照抄。
三、apt-cache:查仓库索引
apt-cache 不联网,它查的是apt update下载到本地的索引文件,所以查询速度极快,而且不需要 sudo。
常用子命令
| 命令 | 作用 |
|---|---|
apt-cache search 关键词 | 按名字和描述搜包 |
apt-cache show 包名 | 看包的版本、依赖、描述 |
apt-cache depends 包名 | 看这个包依赖谁 |
apt-cache rdepends 包名 | 看谁依赖这个包(反向依赖) |
apt-cache policy 包名 | 看候选版本和各仓库版本 |
示例与预期输出
搜名字带 nginx 的包:
apt-cachesearch nginx|head-5预期输出:
nginx - small, powerful, scalable web/proxy server nginx-common - nginx web/proxy server (common files) nginx-core - nginx web/proxy server (core module) nginx-doc - nginx documentation libnginx-mod-http-image-filter - nginx modules看 nginx 依赖谁:
apt-cachedepends nginx预期输出(节选):
nginx Depends: nginx-core Depends: nginx-common Recommends: libnginx-mod-http-geoiprdepends是反向查询,升级某个包前用它看看"谁在依赖它",避免删了一个公共库导致一片软件挂掉。
四、dpkg:底层解包工具
dpkg 不联网,只处理本地 .deb 文件和本地数据库。apt 装包时,最后一步就是调 dpkg 把文件解开。
常用参数
| 参数 | 作用 |
|---|---|
-i 文件.deb | 安装本地 .deb |
-r 包名 | 卸载(保留配置) |
-P 包名 | 彻底卸载(删配置) |
-l [包名] | 列出已装包 |
-L 包名 | 列出这个包装了哪些文件 |
-S 文件名 | 反查某个文件属于哪个包 |
--configure -a | 修复被中断的配置 |
示例与预期输出
示例 1:从本地 .deb 安装
sudodpkg-i./google-chrome-stable_120.0.6099.71-1_amd64.debdpkg 自己不处理依赖,缺依赖时会报错。这种情况跑完这条再执行一句sudo apt -f install,apt 会把缺的依赖补上:
sudoapt-finstall示例 2:反查文件归属
想知道/usr/sbin/nginx这个文件是哪个包装进来的:
dpkg-S/usr/sbin/nginx预期输出:
nginx-core: /usr/sbin/nginx示例 3:列已装包
dpkg-l|grepnginx预期输出(节选):
ii nginx 1.22.0-1ubuntu1.24 amd64 small, powerful, scalable web/proxy server ii nginx-common 1.22.0-1ubuntu1.24 all nginx web/proxy server (common files)每行开头两个字母:ii表示已正确安装;如果看到iF、iU,说明上次安装中途出错了,跑sudo dpkg --configure -a修复。
五、软件源在哪
apt 从哪下包,由两个位置决定:
/etc/apt/sources.list:主源配置;/etc/apt/sources.list.d/:目录里每个.list文件是一个额外仓库。
国内服务器默认官方源在国外,装软件慢得受不了,换清华、阿里、中科大的镜像源就能解决。改完必须sudo apt update才生效。改之前先备份原文件,改坏了能退回去。
六、知识扩展:/var/lib/dpkg 里记了什么
dpkg 的本地数据库在/var/lib/dpkg/,其中status文件是纯文本,记录了每个已装包的状态、依赖、维护者信息:
Package: nginx Status: install ok installed Priority: optional Section: httpd Architecture: amd64 Version: 1.22.0-1ubuntu1.24 Depends: nginx-core, nginx-commondpkg -l读的就是这个文件。理解这一点,两个故障就有思路了:装包中途断电导致数据库状态不一致,用sudo dpkg --configure -a让它把没跑完的配置流程补完;想强制重装某个包,sudo apt install --reinstall 包名本质也是重新走一遍 dpkg 的解开和登记流程。
另外区分清楚remove和purge:remove 之后/etc/nginx里的配置还在,下次再装 nginx 会沿用老配置;purge 才是连根拔起。生产服务器上排查"为什么我改的配置不生效",经常是之前 purge 没做干净。