当前位置: 首页 > news >正文

ubuntu apt安装与dpkg安装相互之间的关系

0. 问题解释

在linux系统中,使用neofetch命令可以看到现在系统中使用dpkg, flatpak, snap安装的包的数量,那么使用apt安装的包被统计在什么位置了呢,使用apt的安装流程和使用flatpak的安装流程有什么关系和区别呢?
在这里插入图片描述

1. apt 安装的包在哪里?和 neofetch 的显示有什么关系?

一句话回答:neofetch 显示的 3332 (dpkg) 这个数量,基本上就包含了所有通过 apt 安装的包。

详细解释:

在 Debian、Ubuntu、Linux Mint 等系统中,软件包管理系统是分层的:

  • dpkg (Debian Package manager): 这是底层的核心工具。它负责直接处理 .deb 软件包文件。它的功能包括:安装一个本地的 .deb 文件、卸载一个已安装的包、查询系统中已安装包的信息等。但是,dpkg 有一个巨大的“缺点”:它不会自动处理依赖关系。如果你想安装的包A需要包B,但你系统里没有包B,dpkg 就会报错并停止安装,需要你手动先去安装包B。

  • apt (Advanced Package Tool): 这是一个高层的、更智能的工具,它构建在 dpkg 之上。你可以把 apt 看作是 dpkg 的一个“智能管家”。apt 最重要的功能就是:

    • 自动解决依赖关系:当你 apt install A 时,它会自动分析出A需要B,然后帮你把A和B都下载并安装好。
    • 管理软件源 (Repositories)apt 知道去哪里(网络上的服务器)下载软件包。这些信息记录在 /etc/apt/sources.list/etc/apt/sources.list.d/ 目录下的文件中。
    • 系统更新和升级apt updateapt upgrade 可以方便地更新整个系统的所有软件包。

所以,它们的关系是:apt 是前端指挥官,dpkg 是后端执行者。

当你运行 sudo apt install firefox 时,apt 会:

  1. 找到 firefox 的最新版本。
  2. 分析出 firefox 需要的所有依赖包。
  3. 从软件源服务器上把 firefox 和它所有依赖包的 .deb 文件都下载下来。
  4. 最后,apt 会按照正确的顺序,调用 dpkg 把这些下载好的 .deb 文件一个个安装到系统里。

因此,neofetch 通过查询 dpkg 的数据库得知系统里有多少个包,这个数字自然就代表了整个 apt/dpkg 系统所管理的包的总数。

结论:aptneofetch 里的 dpkg 数量最一致。Packages: 3332 (dpkg) 就是你通过 apt (以及其他可能直接使用 dpkg 的工具如 synaptic, gdebi 等) 安装的软件包总数。


2. apt 的安装过程具体是怎样的?

sudo apt install vlc 为例,具体过程如下:

  1. 锁定数据库apt 会首先锁定 dpkg 的数据库文件,防止在你安装时,有其他软件管理程序(比如系统自动更新)同时操作,导致冲突。
  2. 读取软件源列表apt 检查 /etc/apt/sources.list 和相关文件,确定可以从哪些服务器下载软件。
  3. 解析依赖关系apt 查看本地的软件包缓存信息(通过 apt update 更新),找到 vlc 包的元数据。元数据里写明了 vlc 依赖哪些其他的包(比如 libvlc-core, vlc-plugin-base 等)以及它们需要的版本。
  4. 构建依赖树apt 会递归地检查所有依赖包的依赖,直到构建出一个完整的“需要安装/更新的软件包列表”。它会对比这个列表和当前系统已安装的包,计算出最终需要执行的操作。
  5. 用户确认apt 会在终端显示将要安装哪些新包、更新哪些包、占用多少磁盘空间等信息,并询问你是否继续 [Y/n]
  6. 下载软件包:在你确认后,apt 会从软件源服务器将所有需要的 .deb 文件下载到本地缓存目录,通常是 /var/cache/apt/archives/
  7. 调用 dpkg 安装:这是关键一步。apt 会根据之前计算好的正确依赖顺序,依次调用 dpkg -i 命令来安装所有下载好的 .deb 文件。先安装被依赖的包,再安装依赖这些包的包。
  8. 配置和收尾dpkg 在安装过程中会运行包自带的配置脚本(比如创建用户、设置服务等)。全部安装完成后,apt 解除数据库锁定,安装过程结束。

3. apt install 与自己安装 .deb 包 (dpkg -i) 的异同

这是一个非常核心的区别,直接体现了高层和底层工具的差异。

相同点
  • 最终执行者相同:无论是 apt 还是你手动用 dpkg,最终将文件解压并安装到系统里的都是 dpkg 这个程序。
  • 包格式相同:两者处理的都是 .deb 格式的软件包。
  • 安装后状态相同:一旦安装成功,包的信息都会被记录在 dpkg 的数据库中,neofetch 都能统计到,你也可以用 dpkg -lapt list --installed 查到它。
不同点
特性sudo apt install <包名>sudo dpkg -i <文件名.deb>
软件包来源自动从配置好的在线软件源下载。手动需要你先通过浏览器或其他方式下载好 .deb 文件到本地。
依赖关系处理自动处理。会自动下载并安装所有缺失的依赖包。这是其最大优势。不处理。如果缺少依赖,安装会直接失败并报错。你需要手动去寻找并安装所有依赖项。
便利性非常高。一条命令解决所有问题,是日常使用的首选。较低。通常只用于安装软件源里没有的软件(比如Google Chrome, VS Code的官网deb包)。
版本管理简单。可以通过 apt upgrade 统一更新所有通过 apt 安装的包。复杂。你手动安装的包不会被 apt upgrade 自动更新。你需要自己去官网下载新版的 .deb 文件再手动安装一次来升级。
命令对象操作的是包名(e.g., vlc)。操作的是本地文件名(e.g., vlc_3.0.18-2_amd64.deb)。

一个典型的例子:

你从官网下载了 google-chrome-stable_current_amd64.deb

  1. 你尝试 sudo dpkg -i google-chrome-stable_current_amd64.deb
  2. 系统可能会报错,提示缺少 libu2f-udev 等依赖。dpkg 安装失败。
  3. 这时,有一个绝佳的修复命令:sudo apt -f install。这个命令的作用是让 apt 介入,自动修复(fix-broken)依赖关系。apt 会发现 Chrome 已经“部分安装”但缺少依赖,于是它会自动从软件源里下载并安装 libu2f-udev 等所有缺失的依赖。依赖装好后,dpkg 会被再次调用来完成 Chrome 的配置。

希望这个详细的解释能帮助你彻底理解 aptdpkg 的关系!

http://www.xdnf.cn/news/1235125.html

相关文章:

  • (一)全栈(react配置/https支持/useState多组件传递/表单提交/React Query/axois封装/Router)
  • 自动驾驶中的传感器技术18——Camera(9)
  • GitLab 代码管理平台部署及使用
  • Java基本技术讲解
  • PPT自动化 python-pptx - 9: 图表(chart)
  • 决策树学习全解析:从理论到实战
  • 【LeetCode刷题指南】--二叉树的后序遍历,二叉树遍历
  • PPT写作五个境界--仅供学习交流使用
  • 【1】WPF界面开发入门—— 图书馆程序:登录界面设计
  • 业务系统跳转Nacos免登录方案实践
  • web前端React和Vue框架与库安全实践
  • 【设计模式】4.装饰器模式
  • ThinkPHP5x,struts2等框架靶场复现
  • LLM - 智能体工作流设计模式
  • 【嵌入式硬件实例】-555定时器IC的负电压发生器
  • 设计原则和设计模式
  • 【C++ 初级工程师面试--4】形参带默认值的函数,特点,效率,注意事项
  • 秋招笔记-8.3
  • PHP面向对象编程与数据库操作完全指南-下
  • C语言数据结构(7)贪吃蛇项目2.贪吃蛇项目实现
  • 云轴科技ZStack AI翻译平台建设实践-聚焦中英
  • React中的Hooks
  • JavaEE初阶第十三期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十一)
  • 设计模式 - 组合模式:用树形结构处理对象之间的复杂关系
  • uniapp 跨端开发
  • 8.3 滑窗 |栈|阶乘判断
  • 什么是列存储(Columnar Storage)?深度解析其原理与应用场景
  • 【领域热点】【Vue】Vue 与 WebAssembly:前端性能优化的黄金搭档
  • [创业之路-535]:软件需要原型验证、产品需要原型验证、商业模式也需要原型验证
  • 实战解析:编程式事务在实际开发中的典型应用场景