Ubuntu

Aptitude 說我的很多包裹都需要刪除…?

  • April 5, 2021

我正在執行以下 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 軟體包。

PPPSaptitude keep-all執行時不產生任何錯誤資訊,但它不能解決問題。但是,如果我進入aptitudegui 並在任何包上點擊加號 ( +),它會將我置於“檢查”對話框中,在該對話框中我可以選擇“將以下包保持在目前版本”。如果我選擇該選項,則不再將包標記為需要刪除。但是,我有 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 dselectaptitude、lower leveldpkg --set-selectionsapt-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

引用自:https://unix.stackexchange.com/questions/643518