在执行其他维护任务时,我注意到dpkg -l
列出的大约 90 个包的状态ri
与预期不同ii
。
我仅使用和维护软件包apt
,aptitude
我没有强制安装任何软件包,但我会定期这样做apt install --no-install-recommends ...
以避免安装不需要的软件包。我还尝试仔细维护“自动安装”标志,我有 2914 个软件包的状态为“自动安装”(aptitude search '~i~M'
),422 个软件包的状态为“手动安装”(aptitude search '~i!~M'
)。
当我没有请求删除这些软件包时,为什么列表中的软件包状态为Remove
+ Inst
( )?ri
dpkg -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-upgrade
也autoremove
不要触碰 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-upgrade
。man dpkg
有关更多信息,请参阅“有关软件包的信息”部分。
这apt install --reinstall package-name
也还可以,但是它所做的不仅仅是对系统进行最小程度的改变来解决问题。
答案1
免责声明:在分布方面我并不是专业人士,因此这些只是我通过将 1 和 1 多次放在一起而做出的猜测。
序幕
在较旧的 Ubuntu 机器上,我有一个状态为 的软件包ri
,即libllvm5.0
(以及一堆其他正常的ii
软件包,如libllvm4.0
和libllvm6.0
)。软件包 <=libllvm5.0
被标记为手动安装,但libllvm6.0
被标记为自动安装。
所以我的猜测是,它是一个依赖项,并且通过升级或删除依赖包而变得过时。
解释
逐一检查你的论点/条件:
- 我只用
--no-install-recommends
:
好吧,无论如何都需要安装依赖项,否则程序将无法运行。 autoremove
对这些包不做任何操作:
嗯,有点......我很确定所有ri
留下的包autoremove
都被标记为手动安装,尽管你从来没有“单独”安装过它。这是因为在初始设置之后,很少(如果有的话)软件包被标记为自动安装,因为实际上不可能确定哪些软件包你会故意安装,因为这会因用户而异。(所以......有点“你已经手动安装了你的操作系统”。)- 可能
sudo apt dist-upgrade
导致此情况吗?
不是,是的……sudo apt dist-upgrade
它本身不会导致这种情况,但随着整个系统的升级,很可能一堆(最初安装的)软件包会变得过时。
总结原因:我的猜测是这些软件包是在初始设置时安装的,因此被标记为手动安装,然后通过升级某些软件包或整个发行版而过时。并且因为它们被标记为手动安装,所以它们不会受到影响autoremove
。