Debian系統(tǒng)中的軟件包管理是一個復(fù)雜而靈活的過程,涉及到多個工具和命令。首先,我們要理解的是高層的軟件包管理工具,例如 aptitude 或 synaptic,它們依賴 apt,而 apt 又依賴 dpkg 來管理系統(tǒng)中的軟件包。
一、上傳軟件包
盡管 “/var/lib/dpkg/available” 和 “/usr/share/doc/package_name/changelog” 中列出的維護(hù)者姓名提供了關(guān)于“軟件包運作的幕后者是誰”這一問題的一些信息,但軟件包的實際上傳者依舊不明。devscripts 軟件包中的 who-uploads(1) 可以識別 Debian 源軟件包的實際上傳者。
二、限制APT下載帶寬
如果想限制 APT 的下載帶寬到 800Kib/sec(=100KiB/sec),應(yīng)該像下面那樣設(shè)置 APT 的配置參數(shù)。
APT::Acquire::http::Dl-Limit "800";
三、自動下載/升級軟件包
apt 軟件包有自己的 cron 腳本 “/etc/cron.daily/apt” ,它支持自動下載軟件包。可以安裝 unattended-upgrades 軟件包來增強這個腳本,使它能夠自動升級軟件包??梢酝ㄟ^ “/etc/apt/apt.conf.d/02backup” 和 “/etc/apt/apt.conf.d/50unattended-upgrades” 中的參數(shù)來進(jìn)行自定義,相關(guān)說明位于 “/usr/share/doc/unattended-upgrades/README” 中。
unattended-upgrades 軟件包主要用于 stable 系統(tǒng)的安全更新。如果自動升級損壞 stable 系統(tǒng)的風(fēng)險小于被入侵者利用已被安全更新修復(fù)的安全漏洞,應(yīng)該考慮使用自動更新,配置參數(shù)如下。
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::Unattended-Upgrade "1";
如果運行的是 testing 或 unstable 系統(tǒng),應(yīng)該不會想要使用自動更新,因為它肯定會在某天損壞系統(tǒng)。即使位于這樣的 testing 或unstable 情況下,可能依舊想提前下載軟件包以節(jié)省交互式升級的時間,其配置參數(shù)如下。
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::Unattended-Upgrade "0";
四、更新和向后移植
stable-updates (“bookworm-updates”,在 bookworm-作為-stable 發(fā)布循環(huán)) 和 backports.debian.org 檔案庫提供了 stable 版軟件包更新。為了去使用這些檔案庫,需要在 “/etc/apt/sources.list” 文件里寫入如下所示的檔案庫列表。
deb http://deb.debian.org/debian/ bookworm main non-free-firmware contrib non-free deb http://security.debian.org/debian-security bookworm-security main non-free-firmware contrib non-free deb http://deb.debian.org/debian/ bookworm-updates main non-free-firmware contrib non-free deb http://deb.debian.org/debian/ bookworm-backports main non-free-firmware contrib non-free
- 并不需要在 “/etc/apt/preferences” 文件中顯式設(shè)置Pin-Priority值. 當(dāng)新的包可用時,默認(rèn)配置提供了更合理的更新。
- 所有已安裝的舊軟件包都可以通過 bookworm-updates 檔案庫升級到新軟件包。
- 只有從 bookworm-backports 檔案庫中手動安裝的舊軟件包才會通過 bookworm-backports 檔案庫升級到新軟件包。
- 當(dāng)想要從 bookworm-backports 檔案庫中手動的安裝一個名叫 “package-name” 的軟件及其依賴包的時候,應(yīng)該在目標(biāo)檔案庫之前加一個 “-t” 參數(shù)。
$ sudo apt-get install -t bookworm-backports package-name
不要從 backports.debian.org 檔案庫安裝太多軟件包。它能夠造成軟件包依賴復(fù)雜。
五、外部軟件包檔案庫
應(yīng)當(dāng)小心,外部軟件包獲取系統(tǒng)的 root 權(quán)限。應(yīng)當(dāng)只使用可信賴的外部軟件包檔案庫。能夠使用安全 APT 來使用 Debian 兼容的外部軟件包檔案庫,將它加入到 源列表,并把它的檔案庫密鑰放入”/etc/apt/trusted.gpg.d/” 目錄。參見 sources.list(5)、apt-secure(8) 和 apt-key(8)。
六、混合源檔案庫軟件包
從混合源檔案庫中安裝軟件包是不被 Debian 官方發(fā)行版所支持的,除了官方支持的檔案庫的特殊組合以外,例如 stable 的 security updates 和 stable-updates。
這里有一個列子,在原有只跟蹤 testing 的場景,操作包含在 unstable 里發(fā)現(xiàn)的新的上游軟件包版本。
1、臨時更改 “/etc/apt/sources.list” 文件,使之指向單一的 “unstable” 發(fā)行版路徑。
2、運行 “aptitude update” 命令。
3、運行 “aptitude install package-name” 命令。
4、恢復(fù)到原始 “/etc/apt/sources.list” 文件,使之指向 testing 路徑。
5、運行 “aptitude update” 命令。
使用這個手工方法,不需要創(chuàng)建 “/etc/apt/preferences” 文件,也不需要擔(dān)心 apt-pinning。但這個方法仍然是非常麻煩的。
當(dāng)使用混合檔案源的時候,因為 Debian 不會確保軟件之間的兼容性,所以必須自己去解決兼容性問題。如果軟件之間存在不兼容性,系統(tǒng)可能會損壞。必須能夠判斷這些操作所需的技術(shù)要求。使用任意混合的檔案源是完全可選的操作,我并不鼓勵去使用它。
從不同的檔案庫中安裝軟件包的一般規(guī)則如下:
非二進(jìn)制軟件包 (“Architecture: all”) 的安裝是更保險的。
- 文檔軟件包:沒有特別的要求;
- 解釋程序的軟件包:兼容的解釋器必須是可用的。
二進(jìn)制軟件包 (non “Architecture: all”)通常會面臨很多障礙,它的安裝不保險的。
- 庫文件版本的兼容性(包括 “libc”);
- 與之相關(guān)的有用的程序版本的兼容性;
- 內(nèi)核 ABI 的兼容性;
- C++ ABI 的兼容性;
- …
為了使軟件包的安裝變得更保險 ,一些商業(yè)的非自由的二進(jìn)制程序包可能會提供完整的靜態(tài)鏈接庫。還是應(yīng)該檢查 ABI 的兼容性問題等等。
除非為了短期避免破壞軟件包,從非 Debian 檔案庫安裝二進(jìn)制軟件包通常是一個壞的主意。需要查找所有存在的和目前 Debian 系統(tǒng)兼容的安全技術(shù)替代方案。(參見 第 2.1.11 節(jié) “怎樣和不一致的要求協(xié)作”)。
七、使用apt-pinning
新手用 apt-pinning 命令會造成比較大的問題。必須避免使用這個命令除非確實需要它。
- 沒有 “/etc/apt/preferences” 文件,APT 系統(tǒng)使用版本字符串來選擇最新的可用版本作為 候選版本。這是通常的狀態(tài),也是 APT 系統(tǒng)最推薦的使用方法。所有官方支持的檔案庫集合,并不要求 “/etc/apt/preferences” 文件,因此,一些不應(yīng)當(dāng)被作為自動更新源的軟件包,被標(biāo)記為 NotAutomatic,并被適當(dāng)處理。
- 版本字符串的比較規(guī)則可以被驗證,例子如下,”dpkg –compare-versions ver1.1 gt ver1.1~1; echo $?”。
- 如果經(jīng)常從混合源檔案庫中安裝軟件包, 可以通過創(chuàng)建 “/etc/apt/preferences” 文件并且在其中寫入關(guān)于調(diào)整候選版本的軟件包選取規(guī)則的合適條目 (如apt_preferences(5) 中所示)來自動化這些復(fù)雜的操作。這被稱為 apt-pinning。
- 當(dāng)使用 apt-pinning 命令時,因為 Debian 不會確保軟件之間的兼容性,所以必須自己確認(rèn)其兼容性。apt-pinning 是完全可選的操作,我并不建議去使用它。
- 檔案庫層級的 Release 文件使用 apt_preferences(5) 的規(guī)則.對于 Debian 通用檔案庫 和 Debian 安全檔案庫,apt-pinning 只在 “suite” 名下工作。(這點和 Ubuntu 檔案庫不同.)例如,在 “/etc/apt/preferences” 文件里面,可以使用”Pin: release a=unstable” ,但不能使用 “Pin: release a=sid”.
- 當(dāng)使用非 Debian 的檔案庫作為 apt-pinning 的一部分時,應(yīng)該檢查它們的用途和可信度。例如,Ubuntu 和 Debian 是不能混在一起的。
注意:即使不創(chuàng)建 “/etc/apt/preferences” 文件,在不用 apt-pinning 命令的情況下,也可以進(jìn)行相當(dāng)復(fù)雜的系統(tǒng)工作 。
如下是關(guān)于 apt-pinning 技術(shù)的簡化說明:
可用的軟件包源在 “/etc/apt/sources.list” 文件里面定義,APT 系統(tǒng)從可用的軟件包源里面選擇 Pin-Priority 值最大的,作為升級 軟件包的候選版本。如果一個軟件包的 Pin-Priority 大于 1000,這個版本限制為只能 升級,關(guān)閉了軟件包降級功能。
每個軟件包的 Pin-Priority 值是在 “/etc/apt/preferences” 文件中的 “Pin-Priority” 條目中定義或者是使用它的默認(rèn)值。
用于 apt-pinning 技術(shù)的值得注意的 Pin-Priority 值列表:
Pin-Priority | apt-pinning?對軟件包的影響 |
---|---|
1001 | 安裝該軟件包,即使是一個降級軟件包的指令 |
990 | 用作目標(biāo)發(fā)行版檔案庫的默認(rèn)值 |
500 | 用作常規(guī)檔案庫的默認(rèn)值 |
100 | 用于?NotAutomatic?和?ButAutomaticUpgrades?檔案庫的默認(rèn)值 |
100 | 用于已安裝軟件包 |
1 | 用于?NotAutomatic?檔案庫的默認(rèn)值 |
-1 | 即使被推薦,也絕不安裝這個軟件包 |
目標(biāo)版本檔案倉庫,能夠由命令行選項設(shè)置,例如: “apt-get install -t testing some-package”
NotAutomatic 和 ButAutomaticUpgrades 的檔案是由檔案庫服務(wù)器上檔案層級的 Release 文件來設(shè)置,,同時包含”NotAutomatic: yes” 和 “ButAutomaticUpgrades: yes”.而 NotAutomatic 檔案也是由檔案庫服務(wù)器上的檔案層級的 Release 文件來設(shè)置,但只包含 “NotAutomatic: yes”.
來自多個檔案源的軟件包的 apt-pinning 情況可以通過 “apt-cache policy package” 命令顯示。
- “Package pin:” 開頭的行,列出了軟件包版本的 pin ,如果 package 相關(guān)的 pin 已經(jīng)定義, 例如, “Package pin: 0.190″;
- 沒有 “Package pin:” 的行存在,如果沒有 package 相關(guān)的定義;
- 與 package 相關(guān)的 Pin-Priority 值列在所有版本字符串的右邊,比如,”0.181 700″;
- “0” 是列在所有版本字符串的右邊,如果沒有 package 相關(guān)的定義。例如, “0.181 0″;
- 檔案庫 (在 “/etc/apt/preferences” 文件作為”Package: *”定義) 的 Pin-Priority 值,列在所有檔案庫路徑的左邊,例如,”100 http://deb.debian.org/debian/ bookworm-backports/main Packages”。
八、阻止軟件包安裝
如果不想要引入推薦的特定軟件包,必須創(chuàng)建 “/etc/apt/preferences” 文件并且像如下所示的那樣在文件的頂部明確列出這些軟件包。
Package: package-1 Pin: version * Pin-Priority: -1 Package: package-2 Pin: version * Pin-Priority: -1
九、testing版本
新手用 apt-pinning 命令會造成比較大的問題。必須避免使用這個命令除非確實需要它。如下是一個關(guān)于 apt-pinning 技術(shù)的例子,當(dāng)使用 testing的時候,實現(xiàn) unstable 中的特定的較新的上游版本軟件包的日常升級。應(yīng)該按如下所示的在 “/etc/apt/sources.list” 文件中列出所有需要的檔案庫。
deb http://deb.debian.org/debian/ testing main contrib non-free deb http://deb.debian.org/debian/ unstable main contrib non-free deb http://security.debian.org/debian-security testing-security main contrib
按如下所示的設(shè)置 “/etc/apt/preferences” 文件。
Package: * Pin: release a=unstable Pin-Priority: 100
當(dāng)想要在此配置下從 unstable 檔案庫中安裝 “package-name” 軟件及它的依賴包時,執(zhí)行帶有 “-t” 選項 (unstable 的 Pin-Priority 值變?yōu)?990) 的轉(zhuǎn)換目標(biāo)發(fā)行版的命令。
$ sudo apt-get install -t unstable package-name
在此配置下,執(zhí)行 “apt-get update” 和 “apt-get dist-upgrade”(或者 “aptitude safe-upgrade” 和 “aptitude full-upgrade”) 命令,會從 testing 檔案庫升級那些從 testing 檔案庫安裝的軟件包并且從 unstable 檔案庫升級那些從 unstable 檔案庫中安裝的軟件包。
注意:
- 小心不要去移除 “/etc/apt/sources.list” 文件中的 “testing” 檔案庫。如果文件中沒有 “testing” ,APT 系統(tǒng)會使用更加新的 unstable 檔案庫升級軟件包;
- 我通常會在上述操作后,馬上注釋掉 “/etc/apt/sources.list” 文件中的 “unstable” 檔案庫記錄。這避免了因為處理 “/etc/apt/sources.list” 文件中的眾多記錄而造成的升級緩慢雖然同時也阻止了那些從 unstable 檔案庫中安裝的軟件包通過 unstable 升級;
- 如果 “/etc/apt/preferences” 文件中 “Pin-Priority: 1” 替代了 “Pin-Priority:100″,即使 “/etc/apt/sources.list” 文件中的 “testing” 記錄被刪除了,Pin-Priority 值為 100 的已安裝軟件包也不會通過 unstable 檔案庫升級。
如果希望自動跟蹤 unstable 里某些特殊的軟件包,而在安裝時不再使用初始化選項 “-t unstable” , 必須創(chuàng)建 “/etc/apt/preferences” 文件,并在該文件頂部按下面的方式清晰的列出所有那些軟件包。
Package: package-1 Pin: release a=unstable Pin-Priority: 700 Package: package-2 Pin: release a=unstable Pin-Priority: 700
如下是為每個特定的軟件包設(shè)置 Pin-Priority 值。例如,為了使用最新的 unstable 的英文版 “Debian Reference”,應(yīng)該在 “/etc/apt/preferences” 文件中寫入以下條目。
Package: debian-reference-en Pin: release a=unstable Pin-Priority: 700 Package: debian-reference-common Pin: release a=unstable Pin-Priority: 700
即使使用的是 stable 檔案庫,apt-pinning 技術(shù)仍然是有效的。根據(jù)我以前的經(jīng)驗,從 unstable 檔案庫安裝的文檔包一直是安全的。
十、unstable版本
新手用 apt-pinning 命令會造成比較大的問題。必須避免使用這個命令除非確實需要它。這是使用apt-pinning 的另一個示例,該示例主要使用unstable源,但包含了experimental源, 該源可用于安裝上游更新的軟件包 . 需要包含在”/etc/apt/sources.list” 文件中的列表如下:
deb http://deb.debian.org/debian/ unstable main contrib non-free deb http://deb.debian.org/debian/ experimental main contrib non-free deb http://security.debian.org/ testing-security main contrib
由于experimental源是 非自動(NotAutomatic)的源 (參見 第 2.5.3 節(jié) “檔案庫層的“Release”文件”),其默認(rèn)的Pin-Priority值 被設(shè)置為1 (<<100) . 并不需要在”/etc/apt/preferences”文件中設(shè)置Pin-Priority值,只需要指定 experimental 源,除非需要在下次更新時自動升級時更新特定軟件包.
十一、緊急降級
新手用 apt-pinning 命令會造成比較大的問題。必須避免使用這個命令除非確實需要它。降級在 Debian 設(shè)計上就不被官方支持。僅僅是在緊急恢復(fù)過程中需要做的一部分工作。盡管憎恨這種情形,但降級在很多場景下工作得也不錯。對于重要系統(tǒng),應(yīng)當(dāng)在恢復(fù)操作后備份所有重要數(shù)據(jù),并從零開始重新安裝一個新的系統(tǒng)。
可以通過控制候選版本從新的檔案庫降級到舊的檔案庫(參見 第 2.7.7 節(jié) “使用 apt-pinning 調(diào)整獲選版本”),從而使損壞的系統(tǒng)恢復(fù)。下面是一種懶惰的方法,可以避免許多冗長的 “dpkg -i broken-package_old-version.deb” 命令(參見 第 2.6.6 節(jié) “使用 dpkg 命令進(jìn)行救援”)。
搜索 “/etc/apt/sources.list” 文件中像下面那樣使用 unstable 的行。
deb http://deb.debian.org/debian/ sid main contrib non-free
使用下面的行替換它,從而改為使用 testing。
deb http://deb.debian.org/debian/ trixie main contrib non-free
按如下所示的設(shè)置 “/etc/apt/preferences” 文件。
Package: * Pin: release a=testing Pin-Priority: 1010
運行 “apt-get update; apt-get dist-upgrade” 使整個系統(tǒng)的軟件包強制降級。在緊急降級后,移除 “/etc/apt/preferences” 這個特殊的文件。
十二、equivs軟件包
如果從源代碼編譯了一個程序來代替 Debian 軟件包,最好將它做成一個真正的本地 Debian 軟件包(*.deb)并使用私人檔案庫。
如果選擇從源代碼編譯一個程序并將它安裝到 “/usr/local”,可能需要使用 equivs 作為最后步驟來滿足缺失的軟件包依賴。
Package: equivs Priority: optional Section: admin Description: Circumventing Debian package dependencies This package provides a tool to create trivial Debian packages. Typically these packages contain only dependency information, but they can also include normal installed files like other packages do. . One use for this is to create a metapackage: a package whose sole purpose is to declare dependencies and conflicts on other packages so that these will be automatically installed, upgraded, or removed. . Another use is to circumvent dependency checking: by letting dpkg think a particular package name and version is installed when it isn't, you can work around bugs in other packages' dependencies. (Please do still file such bugs, though.)
十三、移植軟件包
由于系統(tǒng)差異,不能夠保證這里描述的過程能夠工作,而不需要額外的手工處理。對于部分升級的 stable 系統(tǒng),使用源軟件包在運行環(huán)境中重新構(gòu)建一個軟件包是不錯的選擇。這可以避免因為依賴關(guān)系導(dǎo)致大量軟件包升級。在 stable 系統(tǒng)的 “/etc/apt/sources.list” 文件中添加下列條目。
deb-src http://deb.debian.org/debian unstable main contrib non-free
如下安裝編譯所需的軟件包并下載源軟件包。
# apt-get update # apt-get dist-upgrade # apt-get install fakeroot devscripts build-essential # apt-get build-dep foo $ apt-get source foo $ cd foo*
如果需要向后移植,可以從 backport 的軟件包中更新一些工具鏈軟件包,例如 dpkg 和 debhelper。
執(zhí)行下列命令:
$ dch -i
更新軟件包版本,例如在 “debian/changelog” 中附加一個 “+bp1”像下面那樣構(gòu)建軟件包并將它們安裝到系統(tǒng)中。
$ debuild $ cd .. # debi foo*.changes
十四、APT代理服務(wù)器
因為鏡像整個 Debian 檔案庫的子區(qū)會浪費硬盤和網(wǎng)絡(luò)帶寬,當(dāng)管理許多 LAN 上的系統(tǒng)時,為 APT 部署一個本地代理服務(wù)器是個好主意。APT 可以通過配置來使用通用 web(http)代理服務(wù)器,例如 squid。環(huán)境變量 “$http_proxy 會覆蓋 “/etc/apt/apt.conf” 文件中設(shè)置的代理服務(wù)器。
這里有一些 Debian 檔案庫的專用代理工具。應(yīng)該在使用它們之前檢查 BTS。
Debian 檔案庫的專用代理工具:
軟件包 | 流行度 | 大小 | 說明 |
---|---|---|---|
approx |
V:0, I:0 | 7124 | 緩存 Debian 檔案庫文件的代理服務(wù)器(已編譯的?OCaml?程序) |
apt-cacher |
V:0, I:0 | 266 | 為 Debian 軟件包和源代碼文件進(jìn)行緩存代理(Perl 程序) |
apt-cacher-ng |
V:4, I:4 | 1816 | 分發(fā)軟件包的緩存代理(C++ 編譯的程序) |
當(dāng) Debian 重構(gòu)它的檔案庫結(jié)構(gòu)時,這些專用的代理工具往往需要軟件包維護(hù)者重寫代碼,并可能在一段時間內(nèi)無法使用。另一方面,通用 web (http) 代理服務(wù)器更強健并且更容易應(yīng)對這種改變。