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.pswp.cn/web/92026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92026.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YooAsset源碼閱讀-Downloader篇

YooAsset源碼閱讀-Downloader 繼續 YooAsset 的 Downloader &#xff0c;本文將詳細介紹如何創建下載器相關代碼 CreateResourceDownloaderByAll 關鍵類 PlayModeImpl.csResourceDownloaderOperation.csDownloaderOperation.csBundleInfo.cs CreateResourceDownloaderByAll 方法…

豆包新模型與 PromptPilot 實操體驗測評,AI 輔助創作的新范式探索

摘要&#xff1a;在 AI 技術飛速發展的當下&#xff0c;各類大模型及輔助工具層出不窮&#xff0c;為開發者和創作者帶來了全新的體驗。2025 年 7 月 30 日廈門站的火山方舟線下 Meetup&#xff0c;為我們提供了近距離接觸豆包新模型與 PromptPilot 的機會。本次重點體驗了實驗…

深入探討AI在測試領域的三大核心應用:自動化測試框架、智能缺陷檢測和A/B測試優化,并通過代碼示例、流程圖和圖表詳細解析其實現原理和應用場景。

引言隨著人工智能技術的飛速發展&#xff0c;軟件測試領域正在經歷一場深刻的變革。AI技術不僅提高了測試效率&#xff0c;還增強了測試的準確性和覆蓋范圍。本文將深入探討AI在測試領域的三大核心應用&#xff1a;自動化測試框架、智能缺陷檢測和A/B測試優化&#xff0c;并通過…

音視頻學習筆記

0.vs應用其他庫配置1基礎 1.1視頻基礎 音視頻錄制原理音視頻播放原理圖像表示rgb圖像表示yuvhttps://blog.51cto.com/u_7335580/2059670 https://blog.51cto.com/cto521/1944224 https://blog.csdn.net/mandagod/article/details/78605586?locationNum7&fps1 視頻主要概念…

LLM隱藏層狀態: outputs.hidden_states 是 MLP Residual 還是 Layer Norm

outputs.hidden_states 是 MLP Residual 還是 Layer Norm outputs.hidden_states 既不是單純的 MLP Residual,也不是單純的 Layer Norm,而是每一層所有組件(包括 Layer Norm、注意力、MLP、殘差連接等)處理后的最終隱藏狀態。具體需結合 Transformer 層的結構理解: 1. T…

XML 用途

XML 用途 引言 XML&#xff08;可擴展標記語言&#xff09;是一種用于存儲和傳輸數據的標記語言。自1998年推出以來&#xff0c;XML因其靈活性和可擴展性&#xff0c;在眾多領域得到了廣泛應用。本文將詳細介紹XML的用途&#xff0c;幫助讀者全面了解這一重要技術。 一、數據存…

亞馬遜撤離Google購物廣告:重構流量生態的戰略博弈

戰略突變&#xff1a;從漸進收縮到全面退潮的背后邏輯亞馬遜在2025年7月突然全面停止Google Shopping廣告投放&#xff0c;這場看似 abrupt 的決策實則經歷了一年多的戰略鋪墊&#xff0c;從2024年Q1開始的預算削減&#xff0c;到2025年Q2美國市場支出減半&#xff0c;直至核心…

【QT】常?控件詳解(三)常用按鈕控件PushButton RadioButton CheckButton Tool Button

文章目錄前言一、PushButton1.1 QAbstractButton1.2 添加圖標的按鈕1.3 給按鈕添加快捷鍵1.4 代碼?例:按鈕的重復觸發二、 RadioButtion2.1簡介2.2 幾個槽函數 click,press,release, toggled 的區別2.2 模擬分組點餐三、 CheckBox四、Tool Button&#x1f6a9;總結前言 一、P…

數據結構:反轉鏈表(reverse the linked list)

目錄 通過交換元素值實現反轉&#xff08;reverse by swapping elements&#xff09; 滑動指針&#xff08;sliding pointers&#xff09; 使用滑動指針反轉鏈表&#xff08;Reversing a Linked List using Sliding Pointers&#xff09; 對比分析 如何用遞歸&#xff08;R…

【C#】基于SharpCompress實現壓縮包解壓功能

1.SharpCompress安裝 在vs的nuget下搜索安裝SharpCompress&#xff0c;如圖所示2.解壓縮包功能實現 /// <summary> /// 解壓壓縮包 /// </summary> /// <param name"filePath">壓縮包文件路徑</param> /// <param name"directoryPat…

mybatis連接PGSQL中對于json和jsonb的處理方法

pgsql數據庫表字段設置了jsonb格式&#xff1b;在java的實體里使用String或者對象轉換會一直提示一個錯誤&#xff1a; Caused by: org.postgresql.util.PSQLException: ERROR: column “xx” is of type jsonb but expression is of type character varying 需要加一個轉換方法…

Spring AI Alibaba Graph 深度解析:原理、架構與應用實踐

1. 引言概述 1.1 什么是 Spring AI Alibaba Graph Spring AI Alibaba Graph 是阿里云團隊基于 Spring AI 生態開發的一個強大的工作流編排框架&#xff0c;專門用于構建復雜的 AI 應用。它采用聲明式編程模型&#xff0c;通過圖結構來定義和管理 AI 工作流&#xff0c;讓開發…

C++少兒編程(二十一)—軟件執行流程

讓我們將以下程序視為用C編寫的示例程序。步驟1&#xff1a;預處理器將源代碼轉換為擴展代碼。當您運行程序時&#xff0c;源代碼首先被發送到稱為預處理器的工具。預處理器主要做兩件事&#xff1a;它會從程序中刪除注釋。它擴展了預處理器指令&#xff0c;如宏或文件包含。它…

精通Webpack搭建Vue2.0項目腳手架指南

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;在Web應用程序開發中&#xff0c;Vue 2.0因其虛擬DOM、單文件組件、增強的生命周期鉤子和Vuex及Vue Router狀態管理與路由解決方案&#xff0c;成為了提高開發效率和代碼組織性的關鍵。Webpack作為必不可少的模…

無償分享120套開源數據可視化大屏H5模板

數據可視化跨越了語言、技術和專業的邊界&#xff0c;是能夠推動實現跨界溝通&#xff0c;實現國際間跨行業的創新的工具。正如畫家用顏料表達自我&#xff0c;作者用文字講述故事&#xff0c;而統計人員用數字溝通 ...... 同樣&#xff0c;數據可視化的核心還是傳達信息。而設…

Qt按鍵響應

信號與槽機制是一個非常強大的事件通信機制&#xff0c;是 Qt 最核心的機制之一&#xff0c;初學者掌握它之后&#xff0c;幾乎可以做任何交互操作。信號&#xff08;Signal&#xff09; 是一種“事件”或“通知”&#xff0c;比如按鈕被點擊、文本改變、窗口關閉等。 槽&#…

【Git】常見命令整理

Git分區與操作關系&#xff1a;Working Directory&#xff08;工作區&#xff0c;對于本地的編輯和修改在此進行&#xff09;->Staging Area&#xff08;暫存區/Index&#xff0c;在工作區進行git add操作后的位置&#xff09;->Git Repository&#xff08;本地倉庫&…

Linux-Shell腳本基礎用法

1.變量定義變量命名規則&#xff1a;可以包含字母&#xff0c;數字&#xff0c;下劃線&#xff0c;首字母不能用數字開頭&#xff0c;中間不能又空格&#xff1b;為變量賦值等號之間不能為空格&#xff1b;變量命名不能使用標點符號&#xff0c;不能使用bash的關鍵字&#xff1…

JS中的Map和WeakMap區別和聯系

JavaScript 中 Map 與 WeakMap 的區別、聯系及示例核心區別特性MapWeakMap鍵的類型允許任意類型的鍵&#xff08;對象、原始值&#xff09;鍵必須是對象&#xff08;非原始值&#xff09;垃圾回收強引用鍵 → 阻止垃圾回收弱引用鍵 → 不影響垃圾回收可遍歷性支持遍歷&#xff…

Linux 環境 libpq加載異常導致psql 連接 PostgreSQL 庫失敗失敗案例

文章目錄局點現象定位結論局點環境補充知識點如下庫文件加載順序關鍵事實&#xff1a;您系統中的證據&#xff1a;優先級對比表&#xff1a;解決方案強化&#xff1a;最終檢查&#xff1a;本局點解決方法局點現象 數據庫 mdm 升級失敗檢查日志, 發現是由于 psql 連接數據庫報錯…