265
社区成员
发帖
与我相关
我的任务
分享Ubuntu 的包管理分两层:
dpkg 是底层工具(处理本地 .deb,不解决依赖)。
apt 是高层前端(自动解决依赖,推荐日常使用)。
安装本地 .deb 优先用 apt install ./xxx.deb,卸载分 remove(保留配置)和 purge(彻底清除)两种,卸载后务必执行 autoremove 清理孤儿依赖。
在 Ubuntu/Debian 系发行版上管理软件,新手最常遇到两类困惑:
安装时:为什么有 apt、apt-get、dpkg 三个看起来功能重叠的工具?本地 .deb 文件该用哪个装?
卸载时:remove 和 purge 有什么区别?卸完之后为什么磁盘占用下降得比预期少?
这两个问题本质上指向同一件事:没有搞清楚 Ubuntu 包管理的两层架构。
本文基于 Ubuntu 22.04 LTS 环境,系统梳理从安装到卸载的完整流程,并给出每个操作节点的判断标准。
apt 是 dpkg 的前端,两者分工明确,但不可互相替代。
dpkg(Debian Package Manager)直接操作 .deb 文件,负责将包解包、注册到本地数据库、管理文件列表。
它的边界非常清晰:
只处理本地已有的 .deb 文件
不联网,不知道软件源的存在
不解决依赖关系——如果包 A 依赖包 B,dpkg 安装 A 时不会自动安装 B,直接报错
# dpkg 的典型使用场景
sudo dpkg -i 软件名.deb # 安装本地 .deb(不处理依赖)
dpkg -l # 列出所有已安装包
dpkg -l | grep 关键词 # 按关键词过滤
dpkg-deb -I 软件名.deb # 查看 .deb 包的元信息(包名、版本、架构)
dpkg 有一个关键细节:
它绕过 apt 包管理数据库直接操作软件包。所以用 dpkg 安装过的软件包可以用 apt 再安装一遍,系统不会感知到已经安装过,会直接覆盖。
这意味着混用两种方式可能导致包状态不一致,需要注意。
apt 基于 dpkg,侧重于远程包的下载和依赖管理,相当于 dpkg 的前端。它在 dpkg 之上增加了:
软件源(repository)管理:知道去哪里下载
依赖自动解析:安装 A 时自动安装所有依赖
事务性操作:安装失败时可以回滚
# apt 的典型场景
sudo apt update # 刷新软件源索引
sudo apt install 包名 # 从软件源安装(联网)
sudo apt install ./本地文件.deb # 安装本地 .deb(同时自动解决依赖)
| 工具 | 数据来源 | 依赖处理 | 推荐场景 |
|---|---|---|---|
| dpkg | 本地 .deb 文件 | ❌ 不处理 | 脚本/底层/故障排查 |
| apt | 软件源 + 本地 .deb | ✅ 自动处理 | 日常一切操作 |
结论:除非有明确的脚本或底层需求,所有安装操作优先用 apt,包括安装本地 .deb。
安装本地 .deb 文件的推荐命令是 sudo apt install ./文件名.deb,其中 ./ 不可省略。
./apt install 有两种工作模式:
传入包名(如 apt install curl)→ 去软件源搜索
传入路径(以 / 或 ./ 开头)→ 处理本地文件
省略 ./ 直接写文件名,apt 会把它当成包名去软件源搜索,通常会报 "E: Unable to locate package",而不是安装你面前的这个文件。
# 完整操作流程
cd ~/下载
sudo apt install ./cherry-studio.deb # ✅ 正确
sudo apt install cherry-studio.deb # ❌ 会去软件源搜索,通常报错
如果必须用 dpkg(比如在脚本中或特定场景),需要两步走:
sudo dpkg -i 软件名.deb # 步骤1:安装(可能报依赖错误)
sudo apt -f install # 步骤2:补全缺失的依赖
apt -f install(-f 即 --fix-broken)会扫描当前包数据库中所有依赖不满足的包并尝试修复,不只针对刚才的 dpkg 操作。
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
dependency problems | 依赖缺失 | sudo apt -f install |
wrong architecture | 架构不匹配 | 确认下载的是 amd64 还是 arm64 |
No such file or directory | 路径错误 | 检查路径,补上 ./ |
Permission denied | 缺少权限 | 加上 sudo |
command not found: dpkg | 拼写错误 | 注意顺序是 d-p-k-g,不是 dkpg |
安装本地 .deb 的首选路径是 apt install ./xxx.deb。dpkg -i 是备用方案,使用后需要用 apt -f install 补全依赖。两种方式不建议在同一个包上混用。
卸载、更新、排查问题,第一步永远是获取准确的包名。桌面图标显示的名称和真实包名经常不一致。
dpkg -l # 列出全部已安装包(输出较多)
dpkg -l | grep 关键词 # 按关键词过滤(最常用)
dpkg -l 的输出格式如下:
期望状态 | 当前状态 | 错误标志 | 包名 | 版本 | 架构 | 说明
ii chromium-browser 112.0.5615.49-0ubuntu0.22.04.1 amd64 ...
第1列两个字母:第1个字母是期望状态(i=安装),第2个字母是当前状态(i=已安装)
ii 表示包已正确安装,这是正常状态
rc 表示包已删除但配置文件仍残留,是 apt remove 后的典型状态
第3列是真实包名,卸载时要用这个,不是软件的显示名称。
拿到一个 .deb 文件但不确定包名时:
dpkg-deb -I 软件名.deb
输出示例:
Package: cherry-studio
Version: 0.9.15
Architecture: amd64
Depends: libgbm1, libnotify4 ...
Package: 字段的值就是包名,卸载时使用这个值,而不是文件名。
查包名用 dpkg -l | grep 关键词,不要凭桌面图标名称猜。查 .deb 文件的包名用 dpkg-deb -I。包名确认后再执行任何安装/卸载操作。
三个卸载相关命令各有用途,配合使用才能彻底清理。
apt remove 和 apt purge 的唯一区别在于是否删除配置文件。
sudo apt remove 包名 # 删除程序,保留配置文件
sudo apt purge 包名 # 删除程序 + 配置文件(/etc 下的配置等)
具体差异:
| 命令 | 可执行文件 | /etc 下配置 | /var/lib/dpkg 状态 | 适用场景 |
|---|---|---|---|---|
apt remove | ✅ 删除 | ❌ 保留 | 标记为 rc | 可能重装,想保留配置 |
apt purge | ✅ 删除 | ✅ 删除 | 彻底清除 | 不再需要,或配置已损坏想重置 |
一个实际场景:用 deb 文件安装了 Discord,登录账号后卸载再重装,会发现账号自动登录了——这是因为 apt remove 保留了配置文件,账号信息没有被删除。如果想彻底重置,需要使用 apt purge。
补充:apt purge 仅清除 /etc 下的系统级配置文件,用户主目录(~/.config、~/.local 等)下的个人配置不会被删除,需要手动清理。
卸载一个软件后,原本为它安装的依赖包不会被自动删除,会变成"孤儿依赖"——没有任何包依赖它,但占用磁盘空间。
sudo apt autoremove # 清理所有孤儿依赖
apt autoremove 删除为了满足其他软件包的依赖而安装的、系统会自动卸载这些不再需要的软件包。
推荐做法:卸载软件后紧接着执行 autoremove,养成习惯。
以卸载某浏览器为例:
# 第1步:查真实包名
dpkg -l | grep browser
# 第2步:确认包名(从输出第3列读取,如 chromium-browser)
# 第3步:卸载
sudo apt purge chromium-browser
# 第4步:清理孤儿依赖
sudo apt autoremove
# 第5步:验证
dpkg -l | grep chromium
# 无输出 = 卸载成功;若有 rc 状态残留,重新执行 purge
如果系统积累了大量 rc 状态包(历史上用 remove 卸载的),可以批量清理:
dpkg -l | grep "^rc" | awk '{print $2}' | xargs sudo apt -y purge
这条命令筛选所有 rc 状态包,提取包名,批量执行 purge。
卸载流程:purge(彻底删除)> remove(保留配置)> autoremove(清孤儿)。三者按需组合使用,不是替代关系。
在不了解用途的情况下,不要卸载以下类型的包。
Ubuntu 上的软件按风险等级分三类:
| 类型 | 举例 | 卸载风险 | 判断方式 |
|---|---|---|---|
| 系统核心组件 | gnome-shell、ubuntu-desktop、libc6、systemd | 高:桌面/系统无法启动 | 包名含 ubuntu-、gnome-、lib、systemd |
| 硬件驱动 | 显卡驱动、网卡驱动、network-manager | 高:GPU 不可用,断网 | 包名含 driver、firmware、xorg |
| 厂商预装应用 | 特定浏览器、工具软件 | 中:可卸载,需先确认 | 用关键词搜索确认用途 |
| 用户自行安装 | 个人装的任意软件 | 低 | 自己装的随时可卸 |
判断一个包是否安全删除:
apt show 包名 # 查看包的描述、依赖关系
apt rdepends 包名 # 查看哪些包依赖这个包(如果有很多,谨慎删除)
如果 apt rdepends 的输出列出了 ubuntu-desktop 或其他核心包,说明这个包是系统核心依赖链的一部分,不要随便卸载。
| 操作 | 命令 |
|---|---|
| 安装本地 .deb(推荐) | sudo apt install ./xxx.deb |
| 安装本地 .deb(备用) | sudo dpkg -i xxx.deb && sudo apt -f install |
| 查看所有已安装包 | dpkg -l |
| 按关键词查包名 | dpkg -l | grep 关键词 |
| 查 .deb 文件包名 | dpkg-deb -I xxx.deb |
| 卸载(保留配置) | sudo apt remove 包名 |
| 卸载(彻底清除) | sudo apt purge 包名 |
| 清理孤儿依赖 | sudo apt autoremove |
| 批量清理 rc 残留 | dpkg -l | grep "^rc" | awk '{print $2}' | xargs sudo apt -y purge |
| 查包描述和依赖 | apt show 包名 |
| 查反向依赖 | apt rdepends 包名 |