为什么已安装的软件包的状态为“删除”?

为什么已安装的软件包的状态为“删除”?

在执行其他维护任务时,我注意到dpkg -l列出的大约 90 个包的状态ri与预期不同ii

我仅使用和维护软件包aptaptitude我没有强制安装任何软件包,但我会定期这样做apt install --no-install-recommends ...以避免安装不需要的软件包。我还尝试仔细维护“自动安装”标志,我有 2914 个软件包的状态为“自动安装”(aptitude search '~i~M'),422 个软件包的状态为“手动安装”(aptitude search '~i!~M')。

当我没有请求删除这些软件包时,为什么列表中的软件包状态为Remove+ Inst( )?ridpkg -l看起来具有此状态的软件包是我真正想保留在系统中的软件包。 eg 是否可能sudo apt dist-upgrade在我不注意的情况下导致这种情况?

(我知道我可以使用 重新安装这些软件包以apt install --reinstall package-name使状态恢复到ii。我还经常清除已删除的软件包并且aptitude search '~c'不列出任何软件包。)

来自另一个存在同样问题的系统的更多详细信息:

$ sudo apt dist-upgrade && sudo apt autoremove && dpkg -l | grep ^ri | wc -l
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  virtualbox-6.0
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.
171

所以dist-upgradeautoremove不要触碰 171 个有ri状态的包裹。

状态包示例ri

$ dpkg -l ca-certificates-java
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  ca-certificates-java                            20160321ubuntu1              all                          Common CA certificates (JKS keystore)

以及同一软件包的附加信息:

$ aptitude show ca-certificates-java
Package: ca-certificates-java            
State: installed
Automatically installed: no
Multi-Arch: foreign
Version: ...

$ aptitude why ca-certificates-java 
i   default-jre-headless   Depends openjdk-8-jre-headless
iBA openjdk-8-jre-headless Depends ca-certificates-java  

$ apt-mark showhold
virtualbox-6.0

阅读可能的原因后获得的附加信息:

正如答案中所解释的那样https://askubuntu.com/a/802612/50254可以通过运行来修复这些包的状态以匹配当前安装的包(请注意,后面的换行符IFS不是拼写错误,但此命令需要设置IFS为单行换行符):

export IFS='
'
for i in $(dpkg -l |egrep '^[a-z]i.*' |awk '{print $2" install"}') ; do echo $i|dpkg --set-selections  ; done
unset IFS

造成该问题的原因仍不清楚。ri状态意味着dselect(旧版 Debian 软件包管理器现已完全被 取代apt)已用于标记要从系统中删除的软件包,如果您确实想应用这些选择状态,您可以运行apt-get dselect-upgrademan dpkg有关更多信息,请参阅“有关软件包的信息”部分。

apt install --reinstall package-name也还可以,但是它所做的不仅仅是对系统进行最小程度的改变来解决问题。

答案1

免责声明:在分布方面我并不是专业人士,因此这些只是我通过将 1 和 1 多次放在一起而做出的猜测。

序幕

在较旧的 Ubuntu 机器上,我有一个状态为 的软件包ri,即libllvm5.0(以及一堆其他正常的ii软件包,如libllvm4.0libllvm6.0)。软件包 <=libllvm5.0被标记为手动安装,但libllvm6.0被标记为自动安装。
所以我的猜测是,它是一个依赖项,并且通过升级或删除依赖包而变得过时。

解释

逐一检查你的论点/条件:

  • 我只用--no-install-recommends
    好吧,无论如何都需要安装依赖项,否则程序将无法运行。
  • autoremove对这些包不做任何操作
    嗯,有点......我很确定所有ri留下的包autoremove都被标记为手动安装,尽管你从来没有“单独”安装过它。这是因为在初始设置之后,很少(如果有的话)软件包被标记为自动安装,因为实际上不可能确定哪些软件包会故意安装,因为这会因用户而异。(所以......有点“你已经手动安装了你的操作系统”。)
  • 可能sudo apt dist-upgrade导致此情况吗?
    不是,是的……sudo apt dist-upgrade它本身不会导致这种情况,但随着整个系统的升级,很可能一堆(最初安装的)软件包会变得过时。

总结原因:我的猜测是这些软件包是在初始设置时安装的,因此被标记为手动安装,然后通过升级某些软件包或整个发行版而过时。并且因为它们被标记为手动安装,所以它们不会受到影响autoremove

相关内容