Aptitude 說我的很多包裹都需要刪除…?
我正在執行以下 linux 發行版…
DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
我進入
aptitude
,它現在告訴我,我安裝的所有 1,425 個軟體包都將被刪除,因為它們不再使用。我能想到的只是我可能不小心按錯了aptitude
.我該如何正確糾正這個問題?
非常感謝您提前。
PS:我的
/etc/sources.list
文件和/etc/sources.list.d
目錄沒有改變。PPS:我現在意識到這不是我所有的包裹,只有大約一半。但它們通常是標準的 linux 軟體包。
PPPS:
aptitude keep-all
執行時不產生任何錯誤資訊,但它不能解決問題。但是,如果我進入aptitude
gui 並在任何包上點擊加號 (+
),它會將我置於“檢查”對話框中,在該對話框中我可以選擇“將以下包保持在目前版本”。如果我選擇該選項,則不再將包標記為需要刪除。但是,我有 1,400 多個包,我需要很長時間才能手動標記所有這些包並通過此對話框。有沒有辦法通過一個單一的命令為所有這些軟體包實現這一點?
dpkg 數據庫 (in
/var/lib/dpkg/status
) 將包的預期狀態儲存在與**目前狀態相同的行中,如 中所述dpkg(1)
。因此,已安裝的軟體包將具有與此範例類似的條目:# dpkg -s hello| egrep '^(Package|Status|Architecture):' Package: hello Status: install ok installed Architecture: amd64
一旦您使用工具設置刪除它的意圖,它將顯示為:
# dpkg -s hello| egrep '^(Package|Status|Architecture):' Package: hello Status: deinstall ok installed Architecture: amd64
用
purge
而不是deinstall
用於待清除的包。您可能選擇了(用於解除安裝)一個重要的軟體包,該軟體包觸發了其他選定的軟體包或整組軟體包的更改。
有一些工具可以做到這一點,其中有 venerable
dselect
、aptitude
、lower leveldpkg --set-selections
或apt-mark
. 後者更易於使用,但仍不能用於檢查更改的內容(因為它不會與deinstall
上面的比較installed
)並且一次只能執行一項操作,因此多次修復會非常慢。dpkg --set-selections
將被優先使用,因為它可以在一次呼叫中執行此操作。請注意,使用 multi-arch 時一切都變得更加複雜,其中
Architecture
必須檢索值以區分在兩個體系結構中安裝兩次的包。請注意,架構all
也適用於沒有真正架構的包。這是一個
cancel-changes.awk
腳本,它將設置與目前狀態兼容的意圖:安裝已安裝的內容,清除未安裝的內容並繼續解除安裝已刪除的內容(仍保留配置文件),格式適合dpkg --set-selections
.#!/usr/bin/awk -f /^Package:/ { package=$2; newintent="none" } /^Status: (purge|deinstall) ok installed$/ { newintent="install" } /^Status: install ok config-files$/ { newintent="deinstall" } /^Status: install ok not-installed$/ { newintent="purge" } /^Architecture:/ { package=package ":" $2 } /^$/ && newintent != "none" { print package, newintent }
您應該先驗證此腳本的輸出,然後再將其提供給
dpkg --set-selections
. Debian(和 Ubuntu)的未來版本可能會改變內部格式。這是 Debian 10 上的一個使用範例,用於在受害軟體包上進行測試
hello
。# apt-get install hello [...] # apt-mark remove hello Selected hello for removal. # dpkg -l hello Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-==============-============-============-================================== ri hello 2.10-2 amd64 example package based on GNU hello # cancel-changes.awk < /var/lib/dpkg/status hello:amd64 install # cancel-changes.awk < /var/lib/dpkg/status | dpkg --set-selections # dpkg -l hello Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Architecture Description +++-==============-============-============-================================== ii hello 2.10-2 amd64 example package based on GNU hello