AIBOOK入门(二):Ubuntu 软件包管理实战:apt、dpkg 的分工与完整卸载流程

老树 Venerable tree 2026-04-24 10:09:26

 

Ubuntu 的包管理分两层:

dpkg 是底层工具(处理本地 .deb,不解决依赖)。

apt 是高层前端(自动解决依赖,推荐日常使用)。

安装本地 .deb 优先用 apt install ./xxx.deb,卸载分 remove(保留配置)和 purge(彻底清除)两种,卸载后务必执行 autoremove 清理孤儿依赖。


背景与问题定义

在 Ubuntu/Debian 系发行版上管理软件,新手最常遇到两类困惑:

  1. 安装时:为什么有 aptapt-getdpkg 三个看起来功能重叠的工具?本地 .deb 文件该用哪个装?

  2. 卸载时removepurge 有什么区别?卸完之后为什么磁盘占用下降得比预期少?

这两个问题本质上指向同一件事:没有搞清楚 Ubuntu 包管理的两层架构

本文基于 Ubuntu 22.04 LTS 环境,系统梳理从安装到卸载的完整流程,并给出每个操作节点的判断标准。


 

一、apt 与 dpkg 的分工:前端 vs 底层

apt 是 dpkg 的前端,两者分工明确,但不可互相替代。

底层: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

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 的正确安装方式与失败排查

安装本地 .deb 文件的推荐命令是 sudo apt install ./文件名.deb,其中 ./ 不可省略。

为什么必须加 ./

apt install 有两种工作模式:

  1. 传入包名(如 apt install curl)→ 去软件源搜索

  2. 传入路径(以 /./ 开头)→ 处理本地文件

省略 ./ 直接写文件名,apt 会把它当成包名去软件源搜索,通常会报 "E: Unable to locate package",而不是安装你面前的这个文件。

# 完整操作流程
cd ~/下载
sudo apt install ./cherry-studio.deb    # ✅ 正确
sudo apt install cherry-studio.deb      # ❌ 会去软件源搜索,通常报错

备用方案:dpkg + apt -f

如果必须用 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.debdpkg -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 文件的包名

拿到一个 .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。包名确认后再执行任何安装/卸载操作。


 

四、卸载:remove、purge、autoremove 的区别与正确用法

三个卸载相关命令各有用途,配合使用才能彻底清理。

remove vs purge

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 等)下的个人配置不会被删除,需要手动清理。

autoremove:清理孤儿依赖

卸载一个软件后,原本为它安装的依赖包不会被自动删除,会变成"孤儿依赖"——没有任何包依赖它,但占用磁盘空间。

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 状态包)

如果系统积累了大量 rc 状态包(历史上用 remove 卸载的),可以批量清理:

dpkg -l | grep "^rc" | awk '{print $2}' | xargs sudo apt -y purge

这条命令筛选所有 rc 状态包,提取包名,批量执行 purge

小结

卸载流程:purge(彻底删除)> remove(保留配置)> autoremove(清孤儿)。三者按需组合使用,不是替代关系。


 

五、高风险包的识别与规避

在不了解用途的情况下,不要卸载以下类型的包。

Ubuntu 上的软件按风险等级分三类:

类型举例卸载风险判断方式
系统核心组件gnome-shellubuntu-desktoplibc6systemd高:桌面/系统无法启动包名含 ubuntu-gnome-libsystemd
硬件驱动显卡驱动、网卡驱动、network-manager高:GPU 不可用,断网包名含 driverfirmwarexorg
厂商预装应用特定浏览器、工具软件中:可卸载,需先确认用关键词搜索确认用途
用户自行安装个人装的任意软件自己装的随时可卸

判断一个包是否安全删除:

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 包名

 

...全文
39 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

265

社区成员

发帖
与我相关
我的任务
社区描述
摩尔线程成立于 2020 年 10 月,以全功能 GPU 为核心,致力于向全球提供加速计算的基础设施和一站式解决方案,为各行各业的数智化转型提供强大的 AI 计算支持。 我们的目标是成为具备国际竞争力的 GPU 领军企业,为融合人工智能和数字孪生的数智世界打造先进的加速计算平台。我们的愿景是为美好世界加速。
企业社区
社区管理员
  • 摩尔线程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧