我创建了一个红宝石帮助删除多年来积累并占用磁盘空间的旧内核。 (我的笔记本电脑上有 19 个内核,还有一个小型 SSD...)
我想使用 apt-get 或 dpkg 作为卸载程序,因为有些人不会安装 aptitude,而且我不希望 gem 的用户必须安装任何东西。
问题来了,当一些用户确实用于aptitude
其他用途。设想:
- 用户使用我的 gem 成功地
apt-get purge
获得了内核包。 - 用户
aptitude
出于任何原因以交互模式启动, - 用户立即按“g”键(下载/安装/删除 Pkg)而不标记任何更改,-->
aptitude
重新下载并重新安装已清除的软件包apt-get
。
目前,gem 用于apt-get purge <packages>
清除内核包。 (在这里看到的.) 我也尝试过dpkg --purge <packages>
,但结果是一样的,aptitude 仍然想重新安装它们。
我已经阅读了整个aptitude
手册并用谷歌搜索了很多东西,没有骰子。
或许如果我能找到它的位置,我可以以编程方式管理 的aptitude
标记/未标记包列表(尽管我更喜欢更干净的解决方案。)我认为它不是,/var/lib/dpkg/status
否则就不会有差异?
dpkg-query 将包显示status
为Not
并将desired
状态显示为Unknown
。
deKernel$ dpkg-query -l linux-image-3.2.0-39-generic
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 Description
+++-==========================================-==========================================-====================================================================================================
un linux-image-3.2.0-39-generic <none> (no description available)
deKernel$
可以进入 aptitude 并手动取消标记这些内核包,问题就会消失,但这显然是不切实际的。
答案1
aptitude
有它自己的包状态数据库/var/lib/aptitude/pkgstates
,不幸的是它似乎没有记录。它为每个包存储一个像这样的块:
Package: bash
Architecture: amd64
Unseen: no
State: 1
Dselect-State: 1
Remove-Reason: 0
我相信状态1意味着installed
,白色状态3意味着not installed
。我的系统上还有一些状态为 4 的软件包,但我不明白这意味着什么。
dpkg
我相信您的问题是数据库/var/lib/dpkg/status
与aptitude
数据库之间不一致的结果/var/lib/aptitude/pkgstates
。根据这个帖子 pkgstates
应该反映“用户对软件包的‘预期’状态”,因此 aptitude 可能认为用户希望安装这些软件包,即使 apt-get 刚刚删除了它们。
看来解决您的问题的最佳解决方案是按照 Tripleee 的建议进行操作:aptitude
如果已安装,则使用它,如果未安装,则回退到apt-get
.