Linux深入探索08-軟件管理與安裝(dpkg與apt-*)

----- 最近更新【2022-01-01】-----

一、簡介

前面的一篇文章《Linux深入探索06-軟件管理與安裝(源碼安裝)》詳細介紹了 Linux 平臺下的源碼包安裝原理毅厚,雖然使用源代碼進行軟件編譯可以具有定制化的設(shè)置,但對于Linux的發(fā)行商來說展鸡,則有軟件管理不完的問題,畢竟不是每個人都會進行源代碼編譯的。這個問題將會嚴(yán)重的影響linux平臺上軟件的發(fā)行與推廣扰肌。

為了解決上述的問題厚柳,廠商先在他們的系統(tǒng)上面編譯好了我們用戶所需要的軟件氧枣,然后將這個編譯好并可執(zhí)行的軟件直接發(fā)布給用戶安裝。不同的 Linux 發(fā)行版使用不同的打包系統(tǒng)别垮,一般而言便监,大多數(shù)發(fā)行版分別屬于兩大包管理技術(shù)陣營: Debian 的 “.deb”,和 Red Hat 的 “.rpm”碳想。也有一些例外烧董,比方說 Gentoo、Slackware 和 Foresight胧奔,但大多數(shù)會使用這兩個基本系統(tǒng)中的一個逊移。

本篇文章將要介紹的是 Debian 系列發(fā)行版的 dpkg 與 apt-* 的詳細使用方法,如需要了解 Red Hat 系列發(fā)行版的包管理系統(tǒng)可查看我的另一篇文章:《Linux深入探索07-軟件管理與安裝(RPM與YUM)》龙填。

注:本人系統(tǒng)版本【Ubuntu 12.04 LTS】

二胳泉、dpkg

1拐叉、簡介

dpkg - package manager for Debian (debian系統(tǒng)的包管理工具)。

dpkg 是 Debian 的一個底層包管理工具扇商,主要用于對已下載到本地和已安裝的軟件包進行管理凤瘦。(dpkg is a tool to install, build, remove and manage Debian packages)

dpkg 這個機制最早由 Debian Linux 社區(qū)所開發(fā)出來的,通過 dpkg 的機制案铺,Debian 提供的軟件就能夠簡單的安裝起來蔬芥,同時能提供安裝后的軟件信息,實在非常不錯控汉。派生于 Debian 的其它 Linux distributions 大多都使用 dpkg 這個機制來管理笔诵,包括 B2D,Ubuntu 等姑子。

2乎婿、deb 軟件包命名規(guī)則

deb 軟件包的命名規(guī)則為:Package_Version-Build_Architecture.deb

如:nano_1.3.10-2_i386.deb
nano -- 軟件包名稱(Package Name)
1.3.10 -- 版本號(Version Number)
2 -- 修訂號(Build Number)
i386 -- 平臺(Architecture)

3、dpkg軟件包相關(guān)文件介紹

/etc/dpkg/dpkg.cfg dpkg包管理軟件的配置文件【Configuration file with default options】
/var/log/dpkg.log dpkg包管理軟件的日志文件【Default log file (see /etc/dpkg/dpkg.cfg(5) and option --log)】
/var/lib/dpkg/available 存放系統(tǒng)所有安裝過的軟件包信息【List of available packages.】
/var/lib/dpkg/status 存放系統(tǒng)現(xiàn)在所有安裝軟件的狀態(tài)信息
/var/lib/dpkg/info 記錄安裝軟件包控制目錄的控制信息文件

4壁酬、dpkg數(shù)據(jù)庫

dpkg 使用文本文件作為數(shù)據(jù)庫來維護系統(tǒng)中軟件次酌,包括文件清單、依賴關(guān)系舆乔、軟件狀態(tài)等等詳細的內(nèi)容岳服,通常在/var/lib/dpkg 目錄下。 通常在 status 文件中存儲軟件狀態(tài)和控制信息希俩。 在 info/ 目錄下備份控制文件吊宋, 并在其下的.list文件中記錄安裝文件清單, 其下的.mdasums保存文件的 MD5 編碼颜武。

例:查詢dpkg數(shù)據(jù)庫(顯示所有已安裝的Deb包)

上圖每條記錄對應(yīng)一個軟件包璃搜,注意每條記錄的第一、二鳞上、三個字符摔竿,這就是軟件包的狀態(tài)標(biāo)識呆盖,后邊依此是軟件包名稱、版本號和簡單描述。

1)第一字符為期望值(Desired=Unknown/Install/Remove/Purge/Hold)柄驻,它包括:

u  Unknown狀態(tài)未知,這意味著軟件包未安裝,并且用戶也未發(fā)出安裝請求.
i  Install用戶請求安裝軟件包.
r  Remove用戶請求卸載軟件包.
p  Purge用戶請求清除軟件包.
h  Hold用戶請求保持軟件包版本鎖定.

2)第二列入蛆,是軟件包的當(dāng)前狀態(tài)(Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend)

n  Not軟件包未安裝.
i  Inst軟件包安裝并完成配置.
c  Conf-files軟件包以前安裝過,現(xiàn)在刪除了,但是它的配置文件還留在系統(tǒng)中.
u  Unpacked軟件包被解包,但還未配置.
f  halF-conf試圖配置軟件包,但是失敗了.
h  Half-inst軟件包安裝,但是但是沒有成功.
w  trig-aWait觸發(fā)器等待
t  Trig-pend觸發(fā)器未決

3)第三列標(biāo)識錯誤狀態(tài)吧秕,第一種狀態(tài)標(biāo)識沒有問題始赎,為空。 其它符號則標(biāo)識相應(yīng)問題(Err?=(none)/Reinst-required (Status,Err: uppercase=bad))

h  軟件包被強制保持,因為有其它軟件包依賴需求,無法升級.
r  Reinst-required这难,軟件包被破壞,可能需要重新安裝才能正常使用(包括刪除).
x  軟包件被破壞,并且被強制保持.

狀態(tài)標(biāo)識案例說明:

ii —— 表示系統(tǒng)正常安裝了該軟件
pn —— 表示安裝了該軟件舟误,后來又清除了
un —— 表示從未安裝過該軟件
iu —— 表示安裝了該軟件,但是未配置
rc —— 該軟件已被刪除姻乓,但配置文件仍在

5嵌溢、dpkg 子命令

為了方便用戶使用眯牧,dpkg 不僅提供了大量的參數(shù)選項, 同時也提供了許多子命令。

比如:dpkg-deb赖草、dpkg-divert炸站、dpkg-querydpkg-split疚顷、dpkg-statoverridestart-stop-daemon

這里無法對每個 dpkg 的子命令作詳細介紹禁偎,如需了解可自行查閱資料腿堤。

三、dpkg 使用手冊

1如暖、安裝

1)安裝相關(guān)命令

dpkg -i package-name.deb --install笆檀,安裝軟件包,必須是deb包的完整名稱盒至。(軟件的安裝可被拆分為兩個對立的過程“解包”和“配置”)
dpkg --unpack package-name.deb “解包”:解開軟件包到系統(tǒng)目錄但不配置,如果和-R一起使用酗洒,參數(shù)可以是一個目錄
dpkg --configure package-name.deb “配置”:配置軟件包
dpkg -c package-name.deb 列出 deb 包的內(nèi)容

2)安裝相關(guān)選項

-R,--recursive Recursively handle all regular files matching pattern *.deb found at specified directories and all of its subdirectories. This can be used with -i, -A, --install, --unpack and --avail actions(遞歸地指向特定目錄的所有安裝包枷遂,可以結(jié)合-i, -A, --install, --unpack--avail一起使用)

2樱衷、移除軟件包

dpkg -r package-name --remove, 移除軟件包酒唉,但保留其配置文件
dpkg -P package-name --purge矩桂, 清除軟件包的所有文件(removes everything, including conffiles)

3、查詢

dpkg -l package-name-pattern --lis痪伦,查看系統(tǒng)中軟件包名符合 pattern 模式的軟件包
dpkg -L package-name --listfiles侄榴,查看 package-name 對應(yīng)的軟件包安裝的文件及目錄
dpkg -p package-name --print-avail,顯示包的具體信息
dpkg -s package-name --status网沾,查看 package-name(已安裝)對應(yīng)的軟件包信息
dpkg -S filename-search-pattern --search癞蚕,從已經(jīng)安裝的軟件包中查找包含filename的軟件包名稱

Tip:也可使用子命令dpkg-query來進行查詢操作

案例:

# 例1:列出系統(tǒng)上安裝的與 dpkg 相關(guān)的軟件包
dpkg -l \*dpkg*
# 例2:查看 dpkg 軟件包安裝到系統(tǒng)中的文件
dpkg -L dpkg

更多 dpkg 的使用方法可在命令行里使用man dpkg來查閱 或直接使用dpkg --help

四辉哥、apt

1桦山、apt 簡介

雖然我們在使用 dpkg 時,已經(jīng)解決掉了軟件安裝過程中的大量問題证薇,但是當(dāng)依賴關(guān)系不滿足時度苔,仍然需要手動解決,而 apt 這個工具解決了這樣的問題浑度。linux 先將軟件放置到對應(yīng)的服務(wù)器中寇窑,然后分析軟件的依賴關(guān)系,并且記錄下來箩张,然后當(dāng)客戶端有安裝軟件需求時甩骏,通過清單列表與本地的 dpkg 已存在的軟件數(shù)據(jù)相比較窗市,就能從網(wǎng)絡(luò)端獲取所有需要的具有依賴屬性的軟件了。

2饮笛、工作原理

Ubuntu 采用集中式的軟件倉庫機制咨察,將各式各樣的軟件包分門別類地存放在軟件倉庫中,進行有效地組織和管理福青。然后摄狱,將軟件倉庫置于許許多多的鏡像服務(wù)器中,并保持基本一致无午。這樣媒役,所有的 Ubuntu 用戶隨時都能獲得最新版本的安裝軟件包。因此宪迟,對于用戶酣衷,這些鏡像服務(wù)器就是他們的軟件源(Reposity)

然而,由于每位用戶所處的網(wǎng)絡(luò)環(huán)境不同次泽,不可能隨意地訪問各鏡像站點穿仪。為了能夠有選擇地訪問,在Ubuntu系統(tǒng)中意荤,使用軟件源配置文件/etc/apt/sources.list列出最合適訪問的鏡像站點地址啊片。

工作原理1:apt-get 的更新過程

1)執(zhí)行apt-get update
2)程序分析 /etc/apt/sources.list
3)自動連網(wǎng)尋找 list 中對應(yīng)的 Packages/Sources/Release 列表文件,如果有更新則下載袭异,存入 /var/lib/apt/lists/ 目錄
4)然后apt-get install 相應(yīng)的包 钠龙,下載并安裝。

即使這樣御铃,軟件源配置文件只是告知 Ubuntu 系統(tǒng)可以訪問的鏡像站點地址碴里,但那些鏡像站點具體都擁有什么軟件資源并不清楚。若每安裝一個軟件包上真,就在服務(wù)器上尋找一遍咬腋,效率是很低的。因而睡互,就有必要為這些軟件資源列個清單(建立索引文件)根竿,以便本地主機查詢。

用戶可以使用apt-get update命令刷新軟件源就珠,建立更新軟件包列表寇壳。在 Ubuntu Linux 中,apt-get update命令會掃描每一個軟件源服務(wù)器妻怎,并為該服務(wù)器所具有軟件包資源建立索引文件壳炎,存放在本地的/var/lib/apt/lists/ 目錄中。 使用apt-get執(zhí)行安裝逼侦、更新操作時匿辩,都將依據(jù)這些索引文件腰耙,向軟件源服務(wù)器申請資源。因此铲球,在計算機設(shè)備空閑時挺庞,經(jīng)常使用apt-get update命令刷新軟件源,是一個好的習(xí)慣稼病。

工作原理2:apt-get install 原理圖

3选侨、apt 相關(guān)文件

  • var/lib/dpkg/available 文件的內(nèi)容是軟件包的描述信息, 該軟件包括當(dāng)前系統(tǒng)所使用的 Debian 安裝源中的所有軟件包,其中包括當(dāng)前系統(tǒng)中已安裝的和未安裝的軟件包.
  • /etc/apt/sources.list記錄軟件源的地址(當(dāng)你執(zhí)行sudo apt-get install xxx時然走,Ubuntu 就去這些站點下載軟件包到本地并執(zhí)行安裝)
  • /var/cache/apt/archives已經(jīng)下載到的軟件包都放在這里(用apt-get install安裝軟件時侵俗,軟件包的臨時存放路徑)
  • /var/lib/apt/lists 使用apt-get update命令會從/etc/apt/sources.list中下載軟件列表,并保存到該目錄

4丰刊、源文件

apt 的源文件由配置文件/etc/apt/sources.list指定,該配置文件內(nèi)容如下圖所示:

感興趣的可以用瀏覽器打開上面的鏈接去看看增拥,鏡像服務(wù)器的存放位置如:

通過解壓Packages.gz后我們可以看到所有軟件包的基本信息啄巧,并且Packages.gz 已經(jīng)包含所有所依賴的軟件及其版本信息、以及下載地址掌栅。

五秩仆、apt使用手冊

1、apt-get

apt-get is the command-line tool for handling packages, and may be considered the user's "back-end" to other tools using the APT library. Several "front-end" interfaces exist, such as dselect(1), aptitude(8), synaptic(8) and wajig(1).

apt-get 是一個處理軟件包的簡單命令行工具猾封。最常用的參數(shù)是update(更新)和install(安裝)澄耍。

用法: apt-get [選項] 參數(shù)

常用選項:

-h 查看幫助文件。
-q 輸出到日志 - 無進展指示
-qq 不輸出信息晌缘,錯誤除外
-d 僅下載 - 不安裝或解壓歸檔文件
-s 不實際安裝齐莲。模擬執(zhí)行命令
-y 假定對所有的詢問選是,不提示
-f 嘗試修正系統(tǒng)依賴損壞處
-m 如果歸檔無法定位磷箕,嘗試?yán)^續(xù)
-u 同時顯示更新軟件包的列表
-b 獲取源碼包后編譯
-V 顯示詳細的版本號
-c 閱讀此配置文件
-o 設(shè)置自定的配置選項选酗,如 -o dir::cache=/tmp

常用命令:

1)更新源:
apt-get update
2)升級系統(tǒng)到相應(yīng)的發(fā)行版(根據(jù) source.list 的配置):
apt-get dist-upgrade
3)更新所有已經(jīng)安裝的軟件包:
apt-get upgrade
4)安裝軟件包(加上選項--reinstall表示重新安裝):
apt-get install package_name
apt-get install package_name=version(安裝指定版本的軟件包)
5)卸載一個已安裝的軟件包(保留配置文件):
apt-get remove package_name
6)移除軟件包(刪除配置信息):
apt-get purge package_name
apt-get --purge remove packagename
7)檢查是否有損壞的依賴:
apt-get check
8)清除你已經(jīng)刪掉的軟件的相關(guān)文件:
apt-get autoclean
(定期運行這個命令來清除那些已經(jīng)卸載的軟件包的.deb文件。通過這種方式岳枷,您可以釋放大量的磁盤空間芒填。如果您的需求十分迫切,可以使用apt-get clean以釋放更多空間空繁。這個命令會將已安裝軟件包裹的.deb文件一并刪除殿衰。大多數(shù)情況下您不會再用到這些.deb文件,因此如果您為磁盤空間不足 而感到焦頭爛額盛泡,這個辦法也許值得一試)
9)把安裝的軟件的備份也刪除闷祥,不過這樣不會影響軟件的使用
apt-get clean

2、apt-cache

apt-cache —— query the APT cache.

apt-cache performs a variety of operations on APT's package cache. apt-cache does not manipulate the state of the system but does provide operations to search and generate interesting output from the package metadata.

1)apt-cache depends packagename 了解使用依賴
2)apt-cache rdepends packagename 是查看該包被哪些包依賴
3)apt-cache search packagename 搜索包
4)apt-cache show packagename 獲取包的相關(guān)信息饭于,如說明蜀踏、大小维蒙、版本等
5)apt-cache showpkg packagename 顯示軟件包的大致信息

Debian類系統(tǒng)還有一個類似于 apt-* 的一個包管理上層工具:aptitude,感興趣也可以去試試

參考:

開源鏡像站:
-- 阿里:http://mirrors.aliyun.com/
-- 網(wǎng)易:http://mirrors.163.com/

書籍:
-- 《The Linux Command Line》William E. Shotts, Jr.

官方網(wǎng)站:
-- Ubuntu官方網(wǎng)站:https://www.ubuntu.com
-- Debian官方網(wǎng)站:https://www.debian.org/doc/user-manuals
-- https://www.debian.org/doc/manuals/debian-handbook/apt.zh-cn.html

個人博客:http://blog.csdn.net/astraylinux/article/details/7039744

阿里云開源鏡像站還是挺全面的果覆。各種常用工具的鏡像也有颅痊,如 Docker、Composer局待,國內(nèi)推薦斑响。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钳榨,隨后出現(xiàn)的幾起案子舰罚,更是在濱河造成了極大的恐慌,老刑警劉巖薛耻,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件营罢,死亡現(xiàn)場離奇詭異,居然都是意外死亡饼齿,警方通過查閱死者的電腦和手機饲漾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缕溉,“玉大人考传,你說我怎么就攤上這事≈づ福” “怎么了僚楞?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枉层。 經(jīng)常有香客問我泉褐,道長,這世上最難降的妖魔是什么鸟蜡? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任兴枯,我火速辦了婚禮,結(jié)果婚禮上矩欠,老公的妹妹穿的比我還像新娘财剖。我一直安慰自己,他們只是感情好癌淮,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布躺坟。 她就那樣靜靜地躺著,像睡著了一般乳蓄。 火紅的嫁衣襯著肌膚如雪咪橙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音美侦,去河邊找鬼产舞。 笑死,一個胖子當(dāng)著我的面吹牛菠剩,可吹牛的內(nèi)容都是我干的易猫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼具壮,長吁一口氣:“原來是場噩夢啊……” “哼准颓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起棺妓,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤攘已,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怜跑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體样勃,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年性芬,在試婚紗的時候發(fā)現(xiàn)自己被綠了彤灶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡批旺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诵姜,到底是詐尸還是另有隱情汽煮,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布棚唆,位于F島的核電站暇赤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宵凌。R本人自食惡果不足惜鞋囊,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞎惫。 院中可真熱鬧溜腐,春花似錦、人聲如沸瓜喇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乘寒。三九已至望众,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烂翰。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工夯缺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甘耿。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓踊兜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棵里。 傳聞我的和親對象是個殘疾皇子润文,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容