`apt-mark showmanual` 显示几乎所有软件包。搞乱了吗?

`apt-mark showmanual` 显示几乎所有软件包。搞乱了吗?

apt-mark showmanual为我列出了很多软件包:

root@hcompneu:~# apt-mark showmanual | wc -l
4013
root@hcompneu:~# apt-mark showmanual | head
a11y-profile-manager-indicator
abiword
abiword-common
abiword-plugin-grammar
account-plugin-facebook
account-plugin-flickr
account-plugin-google
account-plugin-identica
account-plugin-twitter
accountsservice
root@hcompneu:~# apt-mark showmanual | tail
yelp-xsl
zeitgeist
zeitgeist-core
zeitgeist-datahub
zenity
zenity-common
zip
zlib1g
zlib1g-dev
zlib1g:i386

据我了解,它应该只列出我手动安装的那些软件包。我记不清每种情况了,但我很确定我没有手动安装所有这些软件包。实际上,尽管有 Chrome、OpenOffice 和其他一些非常基本的东西,但我很少在这个系统上安装任何软件。所以我希望列表可能有 10-100 个软件包,但不会更多。也许它还包括来自基本 Ubuntu 安装的 ubuntu-desktop、grub 和 linux 等。

也许过去我写过一些脚本来通过自动调用apt-get install XXX各种程序包来修复损坏的系统。或者我做了其他事情。我真的不记得了。

这可能是这种情况吗?所以我搞砸了?如果是这样,你会建议什么?将所有内容标记为自动安装,然后手动添加一些选定的软件包,如 ubuntu-desktop?

或者这样的输出是正确的,而我理解错了?我读到我不太确定。获取手动安装的软件包列表似乎要复杂得多?或者为什么答案这么复杂?

或者是apt-mark showmanual有缺陷?


root@hcompneu:~# ls -ld /var/log/installer/
drwxr-xr-x 2 root root 4096 Dez 27 11:27 /var/log/installer/
root@hcompneu:~# grep -r cdrom /etc/apt/ --include=*.list
root@hcompneu:~# dpkg -l | grep ^ii | wc -l
3812

答案1

总结不,你的系统没有被搞乱。而且,你可以让一切保持原样,保持当前状态。

让我们考虑三个系统:

现行制度 安装介质 年龄 dpkg -l | grep ^ii | wc -l apt-mark showmanual | wc -l
带有 MATE 桌面的 Ubuntu 18.04.6 LTS(*) Ubuntu 12.04.4 LTS 7 岁 5680 3953
带有 MATE 桌面的 Ubuntu 18.04.6 LTS(*) Ubuntu 10.04 LTS 11 岁 6395 3947
您的 Ubuntu 18.04 LTS (**) ~Ubuntu 8.04 LTS ~13岁 3812 4013

笔记:

  • (*) 我的系统最初是从 Ubuntu 桌面安装盘安装的,因此附带 GNOME 和/或 Unity(不是风味)。然后我使用官方 PPA 安装了 MATE 桌面12.04 LTS14.04 长期支持及其元包;然后当 16.04 LTS 发布时,我使用类似 的命令将 MATE 桌面重新安装为任务包sudo apt-get install ubuntu-mate-desktop^。任务包的安装会导致所有此类包被标记为手动安装,从而保护它们免遭删除。所有其他软件都是在两个系统的生命周期内手动安装的。
  • (**) 您的系统出现奇怪现象,安装的软件包总数为 3812,比手动安装的软件包数量 4013 少。您必须使用 Synaptic 来调查此问题。

我尝试对新旧系统的全新安装进行一些研究。下表是关于普通 Ubuntu 桌面 ISO 的全新安装。

Ubuntu 版本 dpkg -l | grep ^ii | wc -l aptitude search '~i!~M' | wc -l apt-mark showmanual Synaptic:状态 → 已安装(手动)
6.06 长期支持 1046 1046
8.04 长期支持 1102 1087
10.04 LTS 1296 1286 1286
12.04 LTS 1392 1367 1367 1342
14.04 长期支持 1722 1690 1690 1666
16.04 LTS 1745 220 220 195
18.04 LTS 1602 1557 1557 1529
20.04 LTS 1607 49 49 49
22.04 LTS(开发) 1700 四十四 四十四 31

我们可以了解到 Ubiquity 安装程序和 APT 本身的功能会随着时间的推移而发生变化。

从上表我们可以看出,旧系统从安装第 0 天起就有大量手动安装的软件包。
较新的 Ubuntu 版本的数量较少,这简化了维护。它们可能安装了更多元软件包,从而防止因依赖关系而删除软件包。

我做过的另一个实验:我将全新安装的 Ubuntu 从 8.04 LTS 升级到 10.04 LTS → 12.04 LTS → 14.04 LTS → 18.04 LTS → 20.04 LTS,在最终的 20.04.3 LTS 系统中,我手动安装了 2913 个软件包中的 1867 个。

包的“手动”安装状态阻止其被删除,因此您不应将包设置为自动安装。


值得阅读的优秀资源:

答案2

showmaual 选项的输出包括任何曾经更新过的软件包,因此并不是您真正想要的。下面的命令是我从其他答案中复制的(不记得在哪里或我将它归因于何处),并将输出与初始安装列表进行比较,生成您自己安装的软件包。为了方便起见,请将其放入 bin 区域中的文件中。

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)  

第一次运行 apt-mark showmanual 时,我知道列表太大了,因为包括了“tar”之类的东西,我知道我从未手动碰过它。然而,“tar”已经应用了更新,这导致它被输出。由于“tar”包含在初始系统包中,因此它会被脚本删除,只留下初始系统安装后“出现”的东西。

答案3

系统并没有“混乱”,但基本上你对什么的理解手动安装意思是不正确的。包实际上从未被标记为手动或非手动。它只能被标记为自动或非自动。

当某个软件包为了满足依赖关系而自动安装时,该软件包将被标记为自动。这意味着当没有其他包不再依赖它时,它可以(并且暗示它应该)被自动删除。

在普通桌面系统中,大多数软件包都是在安装程序首次安装操作系统时安装的。这些软件包必须以非自动方式安装,否则它们将被删除,因为没有任何依赖项。

以列表顶部附近的“abiword”为例。这是一个文字处理器,安装在桌面系统上可能很正常。我假设您使用了多种桌面安装程序中的一种。它可能没有明确询问您是否需要 abiword。您可能没有按名称自行安装 abiword。您仍然选择通过选择您使用的安装介质来安装它。

由于您的系统上没有其他软件包需要您安装 abiword 才能运行,因此它不能被标记为自动,否则将被删除。这意味着它没有被标记为自动。 apt-mark showmanual列出未标记为自动的软件包。

还要注意的是,许多安装程序会安装所有非自动程序,即使它们可以将它们标记为自动程序,因为有些程序依赖于它们。即使是数百个程序所依赖的重要核心软件包也会被标记为非自动程序。从这个意义上讲,安装程序可能“搞砸了”,但这与您的系统无关。

我尽力列出我可能自己安装的东西的清单是:

aptitude search -F '%p' --disable-columns '~i !~M !~E !~prequired !~pimportant !~pstandard !~tminimal !~tstandard'

要排除所依赖的包,请使用:

aptitude search -F '%p' --disable-columns '~i !~M !~R~i !~E !~prequired !~pimportant !~pstandard !~tminimal !~tstandard'

答案4

根据手册页,apt-mark所有元包的依赖项都标记为manual。因此您可以运行:

apt-mark minimize-manual

将所有这些包标记为自动。之后,

apt-mark showmanual

显示较少的包。

相关内容