Debian軟件包管理系統(tǒng)是一個(gè)高度組織化和規(guī)范化的系統(tǒng),本教程將深入探討Debian 軟件包管理的內(nèi)部工作原理,包括檔案庫(kù)元數(shù)據(jù)、頂層“Release”文件及真實(shí)性、檔案庫(kù)層的“Release”文件以及獲取用于軟件包的元數(shù)據(jù)等方面的內(nèi)容。
一、檔案庫(kù)元數(shù)據(jù)
每個(gè)發(fā)行版的元數(shù)據(jù)文件都保存在 Debian 鏡像站的 “dist/codename” 下面,例如 “http://deb.debian.org/debian/”。檔案庫(kù)的結(jié)構(gòu)可以通過(guò)網(wǎng)絡(luò)瀏覽器來(lái)瀏覽。其中有 6 種關(guān)鍵的元數(shù)據(jù)。
Debian 檔案庫(kù)元數(shù)據(jù)的內(nèi)容:
文件 | 位置 | 內(nèi)容 |
---|---|---|
Release |
發(fā)行版的頂層 | 檔案庫(kù)描述和完整性信息 |
Release.gpg |
發(fā)行版的頂層 | “Release ” 文件的簽名文件,使用檔案庫(kù)密鑰簽名 |
Contents-architecture |
發(fā)行版的頂層 | 列出在相關(guān)架構(gòu)中所有軟件包的全部文件 |
Release |
每個(gè)發(fā)行版/區(qū)域/架構(gòu)組合的頂部 | 歸檔描述使用?apt_preferences ( 5 ) 的規(guī)則 |
Packages |
每個(gè)發(fā)行版/區(qū)域/二進(jìn)制架構(gòu)組合的頂部 | 連接?debian/control ?獲得二進(jìn)制包 |
Sources |
每個(gè) 發(fā)行版/區(qū)域/源代碼 組合的頂部 | 連接?debian/control ?獲取源代碼包 |
為了減少網(wǎng)絡(luò)流量,在最近的檔案庫(kù)中,這些元數(shù)據(jù)存儲(chǔ)為壓縮了的差分文件。
二、頂層Release文件
頂層“Release”文件用于簽署 secure APT 系統(tǒng)下的歸檔文件。每個(gè) Debian 檔案庫(kù)的網(wǎng)址都有一個(gè)這樣的 “Release” 文件,例如 “http://deb.debian.org/debian/dists/unstable/Release”,內(nèi)容如下。
Origin: Debian Label: Debian Suite: unstable Codename: sid Date: Sat, 14 May 2011 08:20:50 UTC Valid-Until: Sat, 21 May 2011 08:20:50 UTC Architectures: alpha amd64 armel hppa hurd-i386 i386 ia64 kfreebsd-amd64 kfreebsd-i386 mips mipsel powerpc s390 sparc Components: main contrib non-free Description: Debian x.y Unstable - Not Released MD5Sum: bdc8fa4b3f5e4a715dd0d56d176fc789 18876880 Contents-alpha.gz 9469a03c94b85e010d116aeeab9614c0 19441880 Contents-amd64.gz 3d68e206d7faa3aded660dc0996054fe 19203165 Contents-armel.gz ...
頂層文件 “Release” 的完整性,是由叫 secure apt 的加密架構(gòu)來(lái)驗(yàn)證,在 apt-secure(8)中進(jìn)行描述:
- 加密簽名文件 “Release.gpg” 是由頂層授權(quán)文件 “Release” 和加密的 Debian 檔案庫(kù)公鑰創(chuàng)建;
- 公開(kāi)的 Debian 檔案庫(kù)公鑰能夠通過(guò)安裝 debian-archive-keyring 軟件包來(lái)安裝到本地;
- secure APT 系統(tǒng)自動(dòng)驗(yàn)證下載的頂層文件 “Release” 的完整性。加密驗(yàn)證過(guò)程用到了”Release.gpg”文件和本地安裝的 Debian 檔案庫(kù)公鑰;
- 所有 “Packages” 和 “Sources” 文件的完整性是由在頂層 “Release” 文件里的 MD5sum 值來(lái)驗(yàn)證。所有軟件包文件的完整性由 “Packages” 和 “Sources” 文件里的 MD5sum 值來(lái)驗(yàn)證;
- 因加密簽名驗(yàn)證比計(jì)算 MD5sum 值消耗更多的 CPU,使用 MD5sum 值來(lái)驗(yàn)證每一個(gè)軟件包,使用加密簽名來(lái)驗(yàn)證頂層的 “Release” 文件,這種方式提供 較好安全性的同時(shí),也有比較好的性能。
如果源列表?xiàng)l目特別指定了 “signed-by” 選項(xiàng),它下載的頂層”Release”文件使用這個(gè)指定的公鑰來(lái)驗(yàn)證。這在當(dāng)源列表包含有非 Debian 檔案庫(kù)時(shí)有用。
當(dāng)然,你能夠使用 gpg 手工驗(yàn)證”Release” 的完整性,使用 “Release.gpg” 文件和在 ftp-master.debian.org 上公布的 Debian 檔案庫(kù)公鑰。
三、檔案庫(kù)層的Release文件
檔案庫(kù)層的“Release”文件將用作 apt_preferences(5) 的規(guī)則。歸檔層次的 “Release” 文件,其全部歸檔位置在 源列表 中指定,如以下的 “http://deb.debian.org/debian/dists/unstable/main/binary-amd64/Release” 或 “http://deb.debian.org/debian/dists/sid/main/binary-amd64/Release”。
Archive: unstable Origin: Debian Label: Debian Component: main Architecture: amd64
注意:系列名稱(chēng)(“stable”,”testing”,”unstable”, …) 用于 Debian archive ,而代號(hào)(“trusty”, “xenial”, “artful”, …) 用于 Ubuntu archive。
對(duì)于部分檔案庫(kù),比如說(shuō) experimental 和 bookworm-backports, 它們包含的軟件包不會(huì)被自動(dòng)安裝,這是因?yàn)橛蓄~外的行,例如在 “http://deb.debian.org/debian/dists/experimental/main/binary-amd64/Release” 里面有如下額外的一行。
Archive: experimental Origin: Debian Label: Debian NotAutomatic: yes Component: main Architecture: amd64
普通的檔案庫(kù)沒(méi)有 “NotAutomatic: yes”, 默認(rèn)的 Pin-Priority 值是 500, 而對(duì)于有 “NotAutomatic: yes”的特殊檔案庫(kù), 默認(rèn)的 Pin-Priority 值是 1。
四、獲取元數(shù)據(jù)
當(dāng)使用 APT 工具時(shí),如 aptitude, apt-get, synaptic, apt-file, auto-apt,我們需要更新包含 Debian 檔案庫(kù)信息元數(shù)據(jù)的本地拷貝。這些本地拷貝的文件名稱(chēng),和在 源列表文件里面的 distribution, area, architecture 相應(yīng)名稱(chēng)一致。
- “/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_Release”
- “/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_Release.gpg”
- “/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_area_binary-architecture_Packages”
- “/var/lib/apt/lists/deb.debian.org_debian_dists_distribution_area_source_Sources”
- “/var/cache/apt/apt-file/deb.debian.org_debian_dists_distribution_Contents-architecture.gz” (apt-file)
前 4 種類(lèi)型的文件是所有相關(guān)的 APT 命令共享的,并且可以通過(guò) “apt-get update” 或 “aptitude update” 在命令行中進(jìn)行更新。如果在源列表中有相應(yīng)的 “deb” 行,則 “軟件包” 元數(shù)據(jù)會(huì)進(jìn)行更新。如果在 源列表中有相應(yīng)的 “deb-src” 行,則 “源代碼” 元數(shù)據(jù)會(huì)進(jìn)行更新。
“Packages” 和 “Sources” 的元數(shù)據(jù)文件包含有“Filename:”字段,指向二進(jìn)制和源代碼包文件的位置。目前,這些軟件包都統(tǒng)一放在”pool/”目錄樹(shù)下,這樣可以改善跨版本發(fā)布的傳輸。
“軟件包”元數(shù)據(jù)的本地副本可以使用 aptitude 來(lái)進(jìn)行交互式的搜索。專(zhuān)門(mén)的搜索命令 grep-dctrl(1) 可以搜索“軟件包”和“源代碼”元數(shù)據(jù)的本地副本。
“Contents-architecture”元數(shù)據(jù)的本地拷貝,能夠被”apt-file update”更新,它的位置和其它 4 個(gè)不同。參見(jiàn) apt-file(1). (auto-apt 的 “Contents-architecture.gz”文件的本地拷貝默認(rèn)也使用不同的位置。)
五、APT軟件包狀態(tài)
除了遠(yuǎn)程獲取元數(shù)據(jù),lenny 之后的 APT 工具還會(huì)將它在本地產(chǎn)生的安裝狀態(tài)信息保存在 “/var/lib/apt/extended_states” 中,APT 會(huì)使用它們來(lái)追蹤自動(dòng)安裝的所有軟件包。
六、aptitude軟件包狀態(tài)
除了遠(yuǎn)程獲取元數(shù)據(jù),aptitude 命令還會(huì)將它在本地產(chǎn)生的安裝狀態(tài)信息保存在 “/var/lib/aptitude/pkgstates” 中,這些信息只能被 aptitude 使用。
七、軟件包本地副本
所有通過(guò) APT 機(jī)制遠(yuǎn)程獲取的軟件包都被保存在 “/var/cache/apt/archives” 中,直到它們被清除。
aptitude 的這個(gè)緩存文件清理策略,能夠在”Options” → “Preferences”下設(shè)置,也可以通過(guò)它的菜單,”Actions”下的”Clean package cache” 或 “Clean obsolete files” 來(lái)執(zhí)行強(qiáng)制清理。
八、Debian軟件包文件名稱(chēng)
Debian 軟件包文件有特定的名稱(chēng)結(jié)構(gòu)。
Debian 軟件包的名稱(chēng)結(jié)構(gòu):
軟件包類(lèi)型 | 名稱(chēng)結(jié)構(gòu) |
---|---|
二進(jìn)制軟件包(亦稱(chēng)?deb ) |
package-name_upstream-version-debian.revision_architecture.deb |
用于 debian-installer 的二進(jìn)制軟件包(亦稱(chēng)?udeb ) |
package-name_upstream-version-debian.revision_architecture.udeb |
源代碼軟件包(上游源代碼) | package-name_upstream-version-debian.revision.orig.tar.gz |
1.0 ?源代碼軟件包(Debian 改變) |
package-name_upstream-version-debian.revision.diff.gz |
3.0 (quilt 補(bǔ)丁管理工具) ?源代碼軟件包(Debian 改變) |
package-name_upstream-version-debian.revision.debian.tar.gz |
源代碼軟件包(說(shuō)明) | package-name_upstream-version-debian.revision.dsc |
軟件包名稱(chēng)中每一個(gè)組件可以使用的字符:
名稱(chēng)組件 | 可用的字符(正則表達(dá)式) | 存在狀態(tài) |
---|---|---|
package-name |
[a-z0-9][-a-z0-9.+]+ |
必需 |
epoch: |
[0-9]+: |
可選 |
upstream-version |
[-a-zA-Z0-9.+:]+ |
必需 |
debian.revision |
[a-zA-Z0-9.+~]+ |
可選 |
可以用 dpkg(1)提供的命令檢查軟件包版本, 例如., “dpkg –compare-versions 7.0 gt 7.~pre1 ; echo $?” .
debian-installer (d-i) 使用 udeb 作為它的二進(jìn)制軟件包的文件擴(kuò)展名,而非普通的 deb。一個(gè) udeb 軟件包是從 deb 軟件包中剝離了一些不必要的內(nèi)容(例如文檔),從而節(jié)省空間同時(shí)也放寬軟件包政策的要求。deb 和 udeb 軟件包會(huì)共享相同的軟件包結(jié)構(gòu)。“u” 表示微小。
九、dpkg命令
dpkg(1) 是 Debian 軟件包管理中最底層的工具。它非常強(qiáng)大,必須小心使用。
當(dāng)安裝名為 “package_name” 的軟件包時(shí),dpkg 會(huì)按照下列的順序處理它。
1、解包 deb 文件(等同于 “ar -x”)
2、使用 debconf(1) 執(zhí)行 “package_name.preinst”
3、將軟件包安裝到系統(tǒng)中(等同于 “tar -x”)
4、使用 debconf(1) 執(zhí)行 “package_name.postinst”
debconf 系統(tǒng)提供帶有 I18N 和 L10N (第 8 章 國(guó)際化和本地化)支持的標(biāo)準(zhǔn)化用戶交互。
dpkg 創(chuàng)建的重要文件:
文件 | 內(nèi)容說(shuō)明 |
---|---|
/var/lib/dpkg/info/package_name.conffiles |
列出配置文件。(使用者可修改的) |
/var/lib/dpkg/info/package_name.list |
列出軟件包安裝的所有文件和目錄 |
/var/lib/dpkg/info/package_name.md5sums |
列出軟件包安裝的文件的 MD5 哈希值 |
/var/lib/dpkg/info/package_name.preinst |
軟件包安裝之前運(yùn)行的軟件包腳本 |
/var/lib/dpkg/info/package_name.postinst |
軟件包安裝之后運(yùn)行的軟件包腳本 |
/var/lib/dpkg/info/package_name.prerm |
軟件包移除之前運(yùn)行的軟件包腳本 |
/var/lib/dpkg/info/package_name.postrm |
軟件包移除之后運(yùn)行的軟件包腳本 |
/var/lib/dpkg/info/package_name.config |
用于?debconf ?系統(tǒng)的軟件包腳本 |
/var/lib/dpkg/alternatives/package_name |
update-alternatives ?命令使用的替代信息 |
/var/lib/dpkg/available |
所有軟件包的可用性信息 |
/var/lib/dpkg/diversions |
dpkg (1) 使用的文件移動(dòng)信息,由?dpkg-divert (8) 設(shè)置 |
/var/lib/dpkg/statoverride |
dpkg (1) 使用的文件狀態(tài)改變信息,由?dpkg-statoverride (8) 設(shè)置 |
/var/lib/dpkg/status |
所有軟件包的狀態(tài)信息 |
/var/lib/dpkg/status-old |
“var/lib/dpkg/status ” 文件的第一代備份 |
/var/backups/dpkg.status* |
第二代備份,以及“var/lib/dpkg/status ”文件更舊的備份 |
“status” 文件也被例如 dpkg(1)、“dselect update” 和 “apt-get -u dselect-upgrade” 等工具使用。
專(zhuān)門(mén)的搜索命令 grep-dctrl(1) 可以搜索 “status” 和 “available” 元數(shù)據(jù)的本地副本。在debian 安裝器環(huán)境下, udpkg 命令用于打開(kāi)udeb 軟件包,udpkg 命令是 dpkg 命令的一個(gè)精簡(jiǎn)版本.
十、update-alternatives命令
Debian 系統(tǒng)使用 update-alternatives(1) 讓用戶可以不受干擾地安裝多種重疊的程序。例如,如果同時(shí)安裝了 vim 和 nvi 軟件包,你可以使 vi 命令選擇運(yùn)行 vim。
$ ls -l $(type -p vi) lrwxrwxrwx 1 root root 20 2007-03-24 19:05 /usr/bin/vi -> /etc/alternatives/vi $ sudo update-alternatives --display vi ... $ sudo update-alternatives --config vi Selection Command ---------------------------------------------- 1 /usr/bin/vim *+ 2 /usr/bin/nvi Enter to keep the default[*], or type selection number: 1
Debian 選擇系統(tǒng)在 “/etc/alternatives/” 目錄里通過(guò)符號(hào)鏈接來(lái)維持它的選擇。選擇進(jìn)程使用”/var/lib/dpkg/alternatives/”目錄里面的相應(yīng)文件。
十一、dpkg-statoverride命令
當(dāng)安裝一個(gè)軟件包時(shí),由 dpkg-statoverride(8) 命令提供的 狀態(tài)修改,是告訴dpkg(1) 對(duì) 文件 使用不同的屬主或權(quán)限的一個(gè)方法。如果使用了 “–update” 選項(xiàng),并且文件存在,則該文件會(huì)被立即設(shè)置為新的屬主和模式。
注意:
- 系統(tǒng)管理員使用 chmod 或 chown 命令直接修改某個(gè)軟件包文件的屬主或權(quán)限,在下次軟件包升級(jí)時(shí),將會(huì)被重置;
- 在此使用了文件 一詞,但事實(shí)上也可用于dpkg 所處理的任何文件系統(tǒng)對(duì)象,包括目錄,設(shè)備等。
十二、dpkg-divert命令
dpkg-divert(8) 命令提供的文件轉(zhuǎn)移功能,是強(qiáng)制 dpkg(1) 不將文件安裝到其默認(rèn)位置,而是安裝到被轉(zhuǎn)移 的位置。dpkg-divert 專(zhuān)用于軟件包維護(hù)腳本。不建議系統(tǒng)管理員隨意使用它。