Ubuntu 軟件包管理主要用到了 apt 和 dpkg 兩個(gè)工具。我們用的最多的就是用他們提供的命令來(lái)安裝和卸載軟件,但他們是如何工作的,我們也許并不十分清楚,這幾天,我專門梳理了一下,以下是我整理出來(lái)的一些資料,供大家參考。
一、軟件包管理器的幾個(gè)重要的目錄和文件
1. /var/lib/apt/lists/
軟件包索引文件,apt update
之后的產(chǎn)物,也是 apt upgrade
讀取的數(shù)據(jù)源。你在 apt update
時(shí)終端的一些提示性內(nèi)容就與該目錄有關(guān)。你可以試著刪除 /var/lib/apt/lists/ 目錄內(nèi)的文件,然后執(zhí)行 sudo apt update
會(huì)發(fā)現(xiàn),該目錄中將出現(xiàn)與終端提示所對(duì)應(yīng)的文件。
$ ls /var/lib/apt/lists/
archive.ubuntukylin.com_ubuntukylin_dists_jammy_InRelease
archive.ubuntukylin.com_ubuntukylin_dists_jammy_main_binary-amd64_Packages
archive.ubuntukylin.com_ubuntukylin_dists_jammy_main_binary-i386_Packages
archive.ubuntukylin.com_ubuntukylin_dists_jammy_main_i18n_Translation-en
archive.ubuntukylin.com_ubuntukylin_dists_jammy-partner_InRelease
archive.ubuntukylin.com_ubuntukylin_dists_jammy-partner_main_binary-amd64_Packages
archive.ubuntukylin.com_ubuntukylin_dists_jammy-partner_main_binary-i386_Packages
auxfiles
lock
mirrors.tuna.tsinghua.edu.cn_wine-builds_ubuntu_dists_jammy_InRelease
mirrors.tuna.tsinghua.edu.cn_wine-builds_ubuntu_dists_jammy_main_binary-all_Packages
...
進(jìn)階:
APT是一個(gè)客戶/服務(wù)器系統(tǒng)。在服務(wù)器上先復(fù)制所有 DEB 包(DEB是Debian軟件包格式的文件擴(kuò)展名),然后用 APT 的分析工具(genbasedir)根據(jù)每個(gè) DEB 包的包頭(Header)信息對(duì)所有的 DEB 包進(jìn)行分析,并將該分析結(jié)果記錄在一個(gè)文件中,這個(gè)文件稱為 DEB 索引清單,APT 服務(wù)器的 DEB 索引清單置于 base 文件夾內(nèi)。一旦 APT 服務(wù)器內(nèi)的 DEB 有所變動(dòng),必須使用 genbasedir 產(chǎn)生新的 DEB 索引清單。
客戶端在進(jìn)行安裝或升級(jí)時(shí)先要查詢 DEB 索引清單,從而可以獲知所有具有依賴關(guān)系的軟件包,并一同下載到客戶端以便安裝。
當(dāng)客戶端需要安裝、升級(jí)或刪除某個(gè)軟件包時(shí),客戶端計(jì)算機(jī)取得 DEB 索引清單壓縮文件后,會(huì)將其解壓置放于 /var/state/apt/lists/,而客戶端使用 apt install 或 apt upgrade 命令的時(shí)候,就會(huì)將這個(gè)文件夾內(nèi)的數(shù)據(jù)和客戶端計(jì)算機(jī)內(nèi)的 DEB 數(shù)據(jù)庫(kù)比對(duì),知道哪些 DEB 已安裝、未安裝或是可以升級(jí)的。
2. /var/lib/dpkg/
Ubuntu 中所有 軟件包(packages) 的信息都放在 /var/lib/dpkg/ 目錄下,下面分析一下幾個(gè)重要的文件和目錄:
1) /var/lib/dpkg/info
該目錄用于保存各個(gè)軟件包的配置信息,并用不同后綴來(lái)表示該軟件包的特定信息。
文件名 | 作用 |
---|---|
*.conffiles | 記錄著指定軟件包所包含的所有配置文件完整路徑 |
.list | 記錄著指定軟件包所包含的所有文件,可通過(guò)執(zhí)行 dpkg -L 軟件包名 來(lái)查看 |
*.md5sums | 記錄了軟件包的md5信息,這個(gè)信息是用來(lái)進(jìn)行包驗(yàn)證的 |
*.preinst | 腳本文件,pre install,在 deb 包安裝之前運(yùn)行,通常為建立相關(guān)目錄、檢測(cè)系統(tǒng)環(huán)境等 |
*.postinst | 腳本文件,post install,在 deb 包安裝之后運(yùn)行,通常為開(kāi)啟daemon,建立菜單項(xiàng)和快捷方式等 |
*.prerm | 腳本文件,pre remove,在移除或重新安裝該軟件包前要做的工作 |
*.postrm | 腳本文件,post remove,在移除該軟件包后要做的工作 |
2) /var/lib/dpkg/status
該文件列出了系統(tǒng)中目前存在的軟件包(已安裝,僅存配置,僅解壓縮,不完全安裝等)的一些描述信息,包括:包的狀態(tài),版本,配置文件,描述等。
如下面的 apt 包信息是從 /var/lib/dpkg/status 中復(fù)制出來(lái)的,可以看看大概包括那些內(nèi)容。
Package: apt
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 4156
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Architecture: amd64
Version: 2.4.9
Replaces: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~)
Provides: apt-transport-https (= 2.4.9)
Depends: adduser, gpgv | gpgv2 | gpgv1, libapt-pkg6.0 (>= 2.4.9), ubuntu-keyring, libc6 (>= 2.34), libgcc-s1 (>= 3.3.1), libgnutls30 (>= 3.7.0), libseccomp2 (>= 2.4.2), libstdc++6 (>= 11), libsystemd0
Recommends: ca-certificates
Suggests: apt-doc, aptitude | synaptic | wajig, dpkg-dev (>= 1.17.2), gnupg | gnupg2 | gnupg1, powermgmt-base
Breaks: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~), aptitude (<< 0.8.10)
Conffiles:
/etc/apt/apt.conf.d/01-vendor-ubuntu c69ce53f5f0755e5ac4441702e820505
/etc/apt/apt.conf.d/01autoremove ab6540f7278a05a4b7f9e58afcaa5f46
/etc/cron.daily/apt-compat 1400ab07a4a2905b04c33e3e93d42b7b
/etc/logrotate.d/apt 179f2ed4f85cbaca12fa3d69c2a4a1c3
Description: commandline package manager
This package provides commandline tools for searching and
managing as well as querying information about packages
as a low-level access to all features of the libapt-pkg library.
.
These include:
* apt-get for retrieval of packages and information about them
from authenticated sources and for installation, upgrade and
removal of packages together with their dependencies
...
Original-Maintainer: APT Development Team <deity@lists.debian.org>
同樣,通過(guò) dpkg -s 軟件包名
命令也可取出該文件中相關(guān)軟件包的信息,可輸入 dpkg -s apt
測(cè)試內(nèi)容是否與上面的內(nèi)容一致。
而,通過(guò) dpkg -l
命令則可以列表形式讀取該文件中軟件包的部分信息
$ dpkg -l
期望狀態(tài)=未知(u)/安裝(i)/刪除(r)/清除(p)/保持(h)
| 狀態(tài)=未安裝(n)/已安裝(i)/僅存配置(c)/僅解壓縮(U)/配置失敗(F)/不完全安裝(H)/觸發(fā)器等待(W)/觸發(fā)器未決(T)
|/ 錯(cuò)誤?=(無(wú))/須重裝(R) (狀態(tài),錯(cuò)誤:大寫=故障)
||/ 名稱 版本 體系結(jié)構(gòu) 描述
+++-=============================================-=======================================-============-==========================================================================================>
ii aapt 1:10.0.0+r36-3 amd64 Android Asset Packaging Tool
ii accountsservice 22.07.5-2ubuntu1.3 amd64 query and manipulate user account information
ii acl 2.3.1-1 amd64 access control list - utilities
ii acpi-support 0.144 amd64 scripts for handling many ACPI events
ii acpid 1:2.0.33-1ubuntu1 amd64 Advanced Configuration and Power Interface event daemon
ii adduser 3.118ubuntu5 all add and remove users and groups
ii adium-theme-ubuntu 0.3.4-0ubuntu4 all Adium message style for Ubuntu
ii adwaita-icon-theme 41.0-1ubuntu1 all default icon theme of GNOME (small subset)
ii aisleriot 1:3.22.22-1 amd64 GNOME solitaire card game collection
ii alsa-base 1.0.25+dfsg-0ubuntu7 all ALSA driver configuration files
...
3) /var/lib/dpkg/available ,可用包列表
該文件列出了系統(tǒng)上可用包(對(duì)應(yīng) status 查詢結(jié)果)對(duì)應(yīng)的老版本包的信息(注解: 應(yīng)該是軟件源為了照顧某些軟件包或者依賴需要用到老版本,因此保留了一些舊的安裝包供需要的人回退安裝)。如下是該文件中保存的 apt 包的信息,其版本是 “2.4.5” ,而系統(tǒng)已經(jīng)安裝的版本是 “2.4.9”
Package: apt
Architecture: amd64
Version: 2.4.5
Priority: important
Section: admin
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: APT Development Team <deity@lists.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 4156
Provides: apt-transport-https (= 2.4.5)
Depends: adduser, gpgv | gpgv2 | gpgv1, libapt-pkg6.0 (>= 2.4.5), ubuntu-keyring, libc6 (>= 2.34), libgcc-s1 (>= 3.3.1), libgnutls30 (>= 3.7.0), libseccomp2 (>= 2.4.2), libstdc++6 (>= 11), libsystemd0
Recommends: ca-certificates
Suggests: apt-doc, aptitude | synaptic | wajig, dpkg-dev (>= 1.17.2), gnupg | gnupg2 | gnupg1, powermgmt-base
Breaks: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~), aptitude (<< 0.8.10)
Replaces: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~)
Filename: pool/main/a/apt/apt_2.4.5_amd64.deb
Size: 1379030
MD5sum: d376f3b95d73f7b9ace2dc9364d876fd
SHA1: 2a85f2cb8fbd3f51932e9fb43c3a031c60bf2c95
SHA256: 89b093ec665072b3400881120aa3f4460222caa6a5d6c6ccb3d016beb18e7a00
SHA512: 5d4e2b80ed0262dcfa9cbc3ca45e663e8e3e080691603eb464c035ad3785c595ca8915b2436ee43242b6cc904c2fd0c0a81ddd902cc2e04fb56f5afa9c1fc2b0
Description: commandline package manager
Task: minimal, server-minimal
Description-md5: 9fb97a88cb7383934ef963352b53b4a7
Build-Essential: yes
可以通過(guò) apt-cache madison
命令來(lái)查看某個(gè)軟件包有哪些可安裝的軟件包
$ apt-cache madison apt
apt | 2.4.9 | http://mirrors.ustc.edu.cn/ubuntu jammy-updates/main amd64 Packages
apt | 2.4.5 | http://mirrors.ustc.edu.cn/ubuntu jammy/main amd64 Packages
二、軟件包管理器是怎么工作的
1.apt update 干了什么
apt update
是安裝和升級(jí)軟件的前提,執(zhí)行它之后,會(huì)做兩件大事:
-
掃描軟件源的每一個(gè)鏡像站點(diǎn)服務(wù)器,并為可用的軟件包資源建立若干個(gè)索引文件,從而保存到本地的 /var/lib/apt/lists/ 目錄。
-
將索引文件與系統(tǒng)可用包進(jìn)行數(shù)據(jù)比對(duì)(應(yīng)該是比對(duì)了 /var/lib/apt/lists/ 和 /var/lib/dpkg/status 兩個(gè)文件,至于有沒(méi)有比對(duì) /var/lib/dpkg/info 有待考證),判斷那些包或者依賴需要升級(jí),那些包需要自動(dòng)卸載等。
2. apt upgrade 如何更新軟件包
根據(jù) apt update
的反饋結(jié)果,自動(dòng)從軟件源下載對(duì)應(yīng)版本的軟件包,并執(zhí)行安裝命令,同時(shí)更新 /var/lib/dpkg/status 文件。
3. apt install 如何安裝軟件包
-
檢索 /var/lib/apt/lists/ 目錄中的索引文件,是否存在指定安裝軟件包的信息。
-
檢索 /var/lib/dpkg/status 文件,查看是否存在指定軟件包信息,并讀取狀態(tài),如已正確安裝,則給出提示信息后直接退出。
-
如未安裝,生成軟件的依賴樹(shù),將需要的依賴包列出來(lái)并在終端予以提示,在安裝所需軟件之前進(jìn)行安裝。
-
從軟件源中下載、安裝依賴包和軟件(下載的安裝包通常保存在 /var/cache/apt/archives/ 目錄下),同時(shí)更新 /var/lib/dpkg/ 目錄內(nèi)相關(guān)文件的內(nèi)容。
三、軟件包管理器使用的經(jīng)驗(yàn)積累
1.安裝提示軟件包為 lock 狀態(tài)
分析: 在執(zhí)行 apt install
的同時(shí),會(huì)在 /var/lib/dpkg/ 和 /var/cache/apt/archives/ 下生成 lock 文件,如果指令正常退出時(shí),系統(tǒng)會(huì)刪除這個(gè) lock 文件,而出現(xiàn)異常退出等情況,lock 文件并不會(huì)刪除,如果再次安裝該軟件,就會(huì)報(bào)錯(cuò)
辦法: 刪除這兩個(gè)文件。
2.軟件包緩存
當(dāng)安裝或更新軟件時(shí),首先會(huì)從軟件源中下載軟件包到本地的 /var/cache/apt/archives/ 目錄下,再執(zhí)行安裝操作,久而久之,該目錄內(nèi)可能存有大量安裝包,清理的辦法是刪除該目錄內(nèi)文件,也可通過(guò) apt clean
命令來(lái)直接清除。當(dāng)然你也可以發(fā)揮這個(gè)目錄的其他用途,如復(fù)制某些軟件包備用。
# 刪除 /var/cache/apt/archives/ 目錄內(nèi)所有 deb 包
$ sudo apt clean
# 刪除 /var/cache/apt/archives/ 目錄內(nèi)過(guò)期 deb 包
$ sudo apt autoclean
3.如何刪除一個(gè)軟件
刪除軟件是安裝軟件的一個(gè)逆向工程,但卻更加復(fù)雜。其中有人為因素考慮,如不同的人對(duì)于軟件刪除有不同的需求,比如他們想保留配置文件;也有歷史因素,比如不同的軟件都用到了依賴,刪除時(shí)要判斷這個(gè)依賴還需不需要,等等。
下面是幾組刪除命令:
# 刪除軟件但不刪除配置文件
$ sudo apt remove packagename
$ sudo dpkg -r packagename
# 刪除軟件以及配置文件
$ sudo apt remove packagename --purge
$ sudo apt purge packagename
$ sudo dpkg -P packagename
# 刪除沒(méi)用的依賴包(不是主動(dòng)安裝,且不被任何軟件依賴的包)
$ sudo apt autoremove
# 清理帶 “rc” (已被刪除僅存配置)狀態(tài)的軟件包,通常用于徹底刪除軟件
dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P
4. apt-cache 命令
apt-cache
是一個(gè)專門查詢和顯示已安裝和可安裝軟件包信息的工具,學(xué)習(xí)它對(duì)于我們理解軟件包管理器的工作原理有很大幫助。
用法: apt-cache [選項(xiàng)] 子命令
常用子命令:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-430700.html
子命令 | 描述 |
---|---|
show | 顯示老版本軟件包的信息(讀取的是 /var/lib/dpkg/available,注意區(qū)分 dpkg -l) |
showpkg | 顯示軟件包的常規(guī)描述信息 |
showsrc | 顯示源文件的各項(xiàng)記錄(在軟件倉(cāng)庫(kù)中指定了代碼源的情況下有作用) |
stats | 顯示軟件源的基本統(tǒng)計(jì)信息 |
dump | 顯示軟件源中所有軟件包的簡(jiǎn)要信息 |
dumpavail | 顯示系統(tǒng)已安裝的所有軟件包的描述信息 |
unmet | 顯示所有未滿足的依賴關(guān)系 |
search | 根據(jù)正則表達(dá)式搜索軟件包列表 |
depends | 顯示該軟件包的依賴關(guān)系信息 |
rdepends | 顯示所有依賴于該軟件包的軟件包名字 |
pkgnames | 列出所有軟件包的名字 |
policy | 顯示軟件包的安裝設(shè)置狀態(tài) |
部分參考文章:
https://blog.csdn.net/Dreamby/article/details/16357921
http://www.lgwimonday.cn/archives/2091
https://blog.csdn.net/m0_68431045/article/details/128294893文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-430700.html
到了這里,關(guān)于Ubuntu 軟件包管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!