在Debian系統(tǒng)中,由于各種原因可能會導(dǎo)致軟件包損壞或安裝失敗。本教程將詳細(xì)介紹如何從這些損壞的系統(tǒng)中恢復(fù)軟件包,并提供相應(yīng)的解決方案和技巧。通過掌握這些知識將能夠更有效地管理和使用Debian系統(tǒng),確保軟件包的穩(wěn)定運行和安全使用。
一、缺少依賴
如果通過”sudo dpkg -i …”強制安裝一個軟件包到系統(tǒng),而不安裝它所依賴的所有軟件包,這個軟件包將作為“部分安裝”而失敗。
應(yīng)當(dāng)安裝所有依賴的軟件包,使用 APT 系統(tǒng)或者 “sudo dpkg -i …”。然后,使用下列命令來配置所有部分安裝的軟件包。
# dpkg --configure -a
二、軟件包數(shù)據(jù)緩存錯誤
軟件包數(shù)據(jù)緩存錯誤,能夠造成奇怪的錯誤,比如 APT 的 “GPG error: … invalid: BADSIG …”。
應(yīng)該通過 “sudo rm -rf /var/lib/apt/* ” 刪除所有緩存的數(shù)據(jù),然后重新嘗試。(如果使用了 apt-cacher-ng,還應(yīng)運行”sudo rm -rf /var/cache/apt-cacher-ng/* “。 )
三、不兼容舊用戶配置
如果一個桌面 GUI 程序在重要的上游版本升級后變得不穩(wěn)定,應(yīng)該懷疑這是舊的本地配置文件(由它創(chuàng)建的)所導(dǎo)致的。如果它在新建的用戶賬號下運行穩(wěn)定,那么這個假設(shè)就得到了證實。(這是一個打包的 bug 并且打包者通常會避免它。)
為了恢復(fù)穩(wěn)定,應(yīng)該移除相應(yīng)的本地配置文件并重新啟動 GUI 程序??赡苄枰喿x舊的配置文件內(nèi)容以便之后恢復(fù)配置信息。
四、不同軟件包
文檔級的軟件包管理系統(tǒng),比如說 aptitude(8) 或 apt-get(1), 使用軟件包依賴,當(dāng)出現(xiàn)相同文件時,不會嘗試去安裝軟件包。
軟件包維護者的錯誤,或者系統(tǒng)管理員配置了不一致的檔案庫混合源,都會出現(xiàn)不正確的軟件包依賴情況。如果在出現(xiàn)相同文件的情況下,通過 aptitude(8) 或 apt-get(1) 安裝軟件包,dpkg(1) 在對軟件包解包時,確定會給調(diào)用程序返回錯誤,并不會覆蓋已經(jīng)存在的文件。
使用第三方軟件包會導(dǎo)致重大的系統(tǒng)風(fēng)險,因為其通過使用 root 權(quán)限運行維護者腳本能夠?qū)ο到y(tǒng)做任何事。dpkg(1) 命令只防止解包時的覆蓋行為。可以先通過刪除舊的令人討厭的軟件包,old-package,來解決這類錯誤的安裝問題。
$ sudo dpkg -P old-package
五、修復(fù)軟件包腳本
當(dāng)軟件包腳本中的一個命令由于某些原因返回錯誤,腳本也將由于錯誤而退出,軟件包管理系統(tǒng)忽略它們的行為,并導(dǎo)致部分安裝的軟件包。當(dāng)一個軟件包在它的刪除腳本中有錯誤時,該軟件包將會成為不可能刪除的軟件包,處理這些問題,都會變得相當(dāng)棘手。
對于 “package_name” 的軟件包腳本問題,應(yīng)該查看下列的軟件包腳本。
- “/var/lib/dpkg/info/package_name.preinst”
- “/var/lib/dpkg/info/package_name.postinst”
- “/var/lib/dpkg/info/package_name.prerm”
- “/var/lib/dpkg/info/package_name.postrm”
使用下列的方法,以 root 編輯損壞的軟件包腳本。
- 在行首添加 “#” 可以禁用出錯的行;
- 在出錯行的行尾添加 “|| true” 可以強制返回成功。
六、使用dpkg命令
因為 dpkg 是非常底層的軟件包工具,它可以在很糟糕的情況下進(jìn)行工作,例如無法啟動系統(tǒng)且沒有網(wǎng)絡(luò)連接。讓我們假定 foo 軟件包損壞了,并且需要更換。
可以在軟件包緩存目錄:“/var/cache/apt/archives/” 中找到舊的 foo 軟件包的無 bug 版本。(如果找不到,可以從檔案庫 https://snapshot.debian.org/ 中下載它,或從具有軟件包緩存功能的機器中拷貝它。)
如果能夠啟動系統(tǒng),可以通過下列命令來安裝它。
# dpkg -i /path/to/foo_old_version_arch.deb
如果系統(tǒng)無法從硬盤啟動,應(yīng)該尋找其它方式來啟動它。
- 使用 Debian 安裝光盤以救援模式啟動系統(tǒng);
- 將硬盤上無法啟動的系統(tǒng)掛載到 “/target”;
- 通過下列命令安裝舊版本的 foo 軟件包。
# dpkg --root /target -i /path/to/foo_old_version_arch.deb
即使位于硬盤上的 dpkg 命令已損壞,該命令依舊可以執(zhí)行。
任何由硬盤、live GNU/Linux CD、可啟動的 USB 驅(qū)動或網(wǎng)絡(luò)啟動上的另一系統(tǒng)啟動的 GNU/Linux 系統(tǒng)到可以類似地用來救援損壞的系統(tǒng)。如果由于依賴問題,無法用這種方式安裝軟件包,并且真的必須真么做,可以使用 dpkg 的 “–ignore-depends”、“–force-depends” 和其它選項來無視依賴。如果這么做了,之后必須認(rèn)真努力地修復(fù)依賴關(guān)系。
如果系統(tǒng)嚴(yán)重?fù)p壞了,應(yīng)該將系統(tǒng)完整備份到一個安全的地方(參見 第 10.2 節(jié) “備份和恢復(fù)”)并進(jìn)行一次全新的安裝。這是耗時較少且效果較好的辦法。
七、恢復(fù)軟件包選擇數(shù)據(jù)
如果 “/var/lib/dpkg/status” 因為某種原因出現(xiàn)錯誤,Debian 系統(tǒng)會丟失軟件包選擇數(shù)據(jù)并受到嚴(yán)重影響。尋找位于 “/var/lib/dpkg/status-old” 或 “/var/backups/dpkg.status.*” 中舊的 “/var/lib/dpkg/status” 文件。
給 “/var/backups/” 分配一個單獨的分區(qū)是一個好習(xí)慣,因為這個目錄包含了許多重要的系統(tǒng)數(shù)據(jù)。對于嚴(yán)重的損壞,我建議備份系統(tǒng)后重新安裝。即使失去 “/var/” 中的所有數(shù)據(jù),依舊可以從 “/usr/share/doc/” 目錄恢復(fù)一些信息來引導(dǎo)進(jìn)行新的安裝。
重新安裝最?。ㄗ烂妫┫到y(tǒng):
# mkdir -p /path/to/old/system 將舊系統(tǒng)掛載到 “/path/to/old/system/”。 # cd /path/to/old/system/usr/share/doc # ls -1 >~/ls1.txt # cd /usr/share/doc # ls -1 >>~/ls1.txt # cd # sort ls1.txt | uniq | less
然后就可以根據(jù)軟件包名稱來進(jìn)行安裝了。(可能會有一些非軟件包名稱,例如 “texmf”。)