在进行其他维护任务时,我注意到
我仅使用
(另一个存在相同问题的系统提供的额外细节:)
所以
具有
同一套餐的附加信息如下:
在阅读可能原因后的附加信息:
如https://askubuntu.com/a/802612/50254中所解释的,可以通过运行以下命令来修复这些软件包的状态,使其与当前安装的软件包匹配(请注意,在
这个问题的原因尚不清楚。"ri"状态应该意味着"dselect"(旧版Debian软件包管理器,现在已完全被"apt"取代)已经标记了要从系统中删除的软件包,如果你确实想应用这些选择状态,可以运行"apt-get dselect-upgrade"命令。请参阅"man dpkg"和"INFORMATION ABOUT PACKAGES"章节以获取更多信息。
"apt install --reinstall package-name"也可以解决问题,但它会对系统进行比最小更多的更改。
dpkg -l
列出了大约90个状态为ri
而不是预期的ii
的软件包。我仅使用
apt
和aptitude
来维护软件包,并且没有强制安装任何软件包,但我经常使用apt install --no-install-recommends ...
来避免安装不需要的软件包。我还尽量仔细维护"自动安装"标志,我有2914个状态为"自动安装"的软件包(aptitude search '~i~M'
),以及422个状态为"手动安装"的软件包(aptitude search '~i!~M'
)。
当我没有要求删除这些软件包时,软件包在dpkg -l
列表中具有状态Remove
+ Inst
(ri
)的原因是什么?看起来这些状态的软件包实际上是我想保留在系统中的软件包。例如,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
都不会触及到具有 ri
状态的 171 个软件包。具有
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"和"INFORMATION ABOUT PACKAGES"章节以获取更多信息。
"apt install --reinstall package-name"也可以解决问题,但它会对系统进行比最小更多的更改。
ri
标记的软件包可能是另一个被移除的软件包的依赖项,但它们没有被移除,可能是因为没有使用apt
的--autoremove
开关。但是我不建议使用--autoremove
,因为可能会移除其他需要的软件包。我希望软件包管理的这部分是完美的,但事实并非如此。我曾经因为一个应用程序将所有系统都设置为自动删除而意外导致系统崩溃。 - Terrancedist-upgrade
和autoremove
对这些软件包都没有任何作用。 - Mikko Rantalainendpkg -l | grep -w "ri"
没有任何结果,但是dpkg -l | grep -w "rc"
有结果,但那是用于配置的,完全不同的情况。希望你能找到答案! - Terranceri
的软件包与这个列表匹配:dpkg --get-selections | awk '$2 == "deinstall" {print $1}'
。所以问题是,当我没有使用dselect
时,什么过程会意外地将dselect
标记为deinstall
? - Mikko Rantalainen/var/log/dpkg.log
中的日志,或者类似于journalctl -xe
的内容。我真希望我也能遇到同样的问题,这样就能有第二双眼睛来帮忙了。我还找到了另一个链接,其中提到运行--clear-selections
可能会导致类似的问题。很难说是否已经运行过这个命令。https://askubuntu.com/questions/687272/revert-accidental-dpkg-clear-selections?rq=1 - Terrancedpkg --clear-selections
的内容,但我绝对没有运行过那个命令。在阅读了它的功能后,我不会运行那个命令。我还发现deinstall
在历史上被用来向dselect
发送信号,表示要移除一个软件包。然而,我刚刚检查了一下,我甚至没有安装dselect
,所以它不应该设置错误的标志位。这确实是一个非常有趣的问题。我目前的猜测是VirtualBox软件包执行了一些错误的命令,因为这两个系统都安装了VirtualBox,并且这个问题似乎在一般情况下非常罕见。 - Mikko Rantalainenjournalctl
,在我可用的最近1.5年日志中,它没有提到有问题的软件包。系统安装大约11个月前,所以错误一定发生在那个时候,或者造成这个问题的原因根本不会记录到journalctl
中。 - Mikko Rantalainen