Ubuntu零基础入门到精通【5.3讲】: 彻底搞懂 apt、apt-get 与 dpkg 的区别——Ubuntu 包管理体系全面解析!
🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。🎯适合人群:Linux 初学者、Ubuntu 新手、计算机专业学生、后端 / 运维 / 测试入门同学、想搭建 Linux 开发环境的开发者、准备学习服务器部署的同学,以及想从 Windows 过渡到 Ubuntu 工作流的用户。从“会打开终端”到“能管理系统”,从“复制命令”到“理解 Linux 思维”,这一次,我们不零散学,而是一路滚雪球!🎉限时福利:当前专栏活动中,一次订阅,终身阅读,后续更新章节全部免费解锁👉 立即查看👈️演示环境说明:开发工具:Visual Studio Code / JetBrains 系列 IDE / Vim / NanoUbuntu版本:Ubuntu 22.04 LTS / Ubuntu 24.04 LTS,推荐 Ubuntu 24.04 LTSLinux内核版本:Linux Kernel 6.x 或更高终端环境:Bash / Zsh包管理工具:APT / Snap / Flatpak远程连接工具:OpenSSH / Windows Terminal / MobaXterm / Termius虚拟化环境:VMware Workstation / VirtualBox / WSL2 / 云服务器容器环境:Docker / Docker Compose操作系统:Ubuntu Desktop / Ubuntu Server全文目录:一、前言:一个困惑过很多人的问题二、本文要解决什么问题三、Ubuntu 包管理体系的历史背景3.1 Debian 的遗产:.deb 与 dpkg3.2 APT 的出现:自动解决依赖3.3 apt-get 与 apt 的分野四、核心概念:什么是软件包、软件源与包管理器4.1 什么是软件包(Package)4.2 什么是软件源(Repository)4.3 什么是包数据库五、dpkg:最底层的包管理工具5.1 dpkg 的核心定位5.2 dpkg 的常用操作5.3 dpkg 的状态标识含义5.4 dpkg 适合在什么时候用六、apt-get:经典的命令行包管理器6.1 apt-get 的历史地位6.2 apt-get 的核心命令6.3 apt-cache:apt-get 的查询搭档6.4 为什么脚本和 Dockerfile 里更常用 apt-get七、apt:现代 Ubuntu 推荐的包管理命令7.1 apt 的设计目标7.2 apt 的核心命令7.3 apt 的输出改进八、三者对比:到底有什么区别8.1 层级关系对比8.2 功能特性对比8.3 命令对应关系8.4 使用场景决策树九、流程图:apt install 的完整执行链路十、实验环境准备10.1 确认系统版本10.2 确认网络连通性10.3 查看当前软件源配置10.4 更新索引十一、案例一:用 apt 完成日常软件管理操作(基础篇)11.1 第一步:查询包信息11.2 第二步:安装包11.3 第三步:验证安装11.4 第四步:使用 tree11.5 第五步:卸载包11.6 案例一命令解析十二、案例二:用 dpkg 处理本地 .deb 包(进阶篇)12.1 为什么要从官网下载 .deb12.2 下载 .deb 包12.3 查看 .deb 文件信息12.4 使用 dpkg 直接安装12.5 用 apt install -f 修复依赖12.6 更推荐的本地 .deb 安装方式12.7 卸载和查询12.8 案例二命令解析十三、案例三:综合实战——依赖问题排查与修复(工程篇)13.1 场景背景13.2 第一步:查看系统当前状态13.3 第二步:重现依赖冲突13.4 第三步:检查依赖链13.5 第四步:处理被 hold 住的包13.6 第五步:清理并修复依赖13.7 第六步:强制重装问题包13.8 第七步:极端情况下的 dpkg 强制操作13.9 案例三命令解析十四、核心命令完整解析14.1 apt update 深度解析14.2 apt upgrade vs apt full-upgrade14.3 apt install 的选项详解14.4 dpkg -l 输出格式详解14.5 apt-cache policy 的黄金用法十五、常见问题与踩坑总结Q1:为什么 `apt install` 提示 "Unable to locate package"?Q2:apt update 报 "Certificate verification failed" 或 GPG 错误Q3:安装时出现 "dpkg was interrupted, you must manually run 'sudo dpkg --configure -a'"Q4:apt/dpkg 被锁,提示 "Could not get lock /var/lib/dpkg/lock"Q5:用 apt upgrade 后,某个服务无法启动了Q6:apt 和 snap 安装的同名软件有冲突怎么办Q7:dpkg -l 找不到某个包,但包确实安装了Q8:为什么 apt install 的包和 dpkg -i 安装的包不同Q9:如何查看某个包是什么时候安装的Q10:apt upgrade 时某些包被 "kept back"(保留不升级)是什么原因十六、最佳实践建议16.1 日常操作规范16.2 软件安装来源的选择优先级16.3 在 Dockerfile 和 CI 中的写法规范16.4 服务器上的包版本管理16.5 维护升级日志16.6 处理软件源的规范建议十七、扩展知识:APT 背后的机制原理17.1 包优先级与 pinning 机制17.2 APT 的依赖解析算法17.3 /var/lib/apt/lists/ 的结构17.4 .deb 包的内部结构17.5 包签名验证机制十八、完整操作流程回顾操作流程总结十九、总结与下篇预告本篇学到了什么几点实际体会下篇预告🧧 学习福利 · 限时开放 🧧🫵 Who am I?一、前言:一个困惑过很多人的问题我最开始系统学习 Ubuntu 的时候,曾经有过一段特别迷茫的时期——不是因为命令太难,而是因为网上查到的教程实在太乱。有些文章写apt-get install,有些写apt install,还有一些直接用dpkg -i来装包。三个看起来功能差不多的工具,搞得我不知道该用哪个。更让人困惑的是,有时候用apt install装完以后,用dpkg -l才能看到包,而用apt list --installed也能看到——这到底是同一个东西,还是两套不同的系统?后来随着用 Ubuntu 的时间越来越长,才慢慢理清楚了这背后的逻辑:这三个工具并不是互相替代的关系,而是处于不同的层级,各自负责不同的职责。理解清楚这一点,不只是为了知道"该用哪个命令",更是为了在遇到依赖问题、包损坏、安装失败的时候,能知道从哪一层入手排查。这篇文章我想从根上讲清楚:dpkg是什么,它能做什么,不能做什么;apt-get是什么,和dpkg有什么关系;apt是什么,和apt-get有什么区别;什么时候该用哪个,为什么;真实项目中是如何使用这三个工具的;遇到依赖冲突、包损坏时,应该从哪一层去修复。