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