为什么移除一个“元包”不会移除它所安装的依赖项?

如果我尝试卸载一个元包,apt实际上并不会删除元包的依赖项,只会删除"包装器"本身。即使运行apt autoremove命令,这些子包也不会被列出。我发现很困惑的是,autoremove命令可以删除大多数普通软件包的依赖项,但对于许多元包却不起作用。为什么会这样呢?
2个回答

元包在任何方面都不是神奇的:"元包"的概念并不是APT系统的一部分 - 元包只是一个没有实际内容,只有依赖关系的软件包。因此,删除它们的效果与删除具有实际内容并且还依赖其他东西的软件包相同,例如一个网页服务器应用程序模块将需要一个网页服务器,但当您删除它时,网页服务器应该仍然保留安装。
话虽如此,APT会跟踪哪些软件包是由于另一个软件包的请求而自动安装的(例如一个元包请求"实际"软件包,或者一个网页服务器应用程序模块需要一个网页服务器),一旦您删除了请求软件包,APT会建议您运行apt autoremove来摆脱这些自动安装的软件包。
“元包”在Ubuntu操作系统中的主要问题是它们依赖于许多软件包,基本上通过单个安装来安装大量软件。当安装这么多软件包时,特别是那些非常紧密相关的软件包,就会出现很多交叉依赖:元包需要软件包A、B和C,但A也依赖于B,而B(可能令人惊讶地)也依赖于A。因此,如果您删除元包,只有C会被删除。
以LXDE元包“lubuntu-desktop”为具体例子。

以下答案提供了更多细节:


非常感谢您的回答,我猜我应该更清楚地表达我的问题。很多时候,似乎 apt autoremove 不会显示任何元软件包的依赖关系,而如果卸载一个“普通”的软件包,则会显示出来。对此有什么想法吗? - tech4him
@tech4him: 我修改了我的回答以应对你的编辑。 - Guss
1谢谢!对于我尝试在常规(GNOME)基础系统上安装的大多数替代桌面环境(xubuntu-desktopkubuntu-desktoplubuntu-desktop等),都发生了这种情况。要卸载它们,我总是不得不返回到Apt日志。 - tech4him
@tech4him - 经过进一步的研究,我给你一个更好的答案。 - Guss
这个例子也可以解释为什么一个有循环依赖的包,但是直接安装(而不是通过元包)后仍然会自动删除。当它位于另一层下面时,这些假设就不起作用了。我假设循环依赖在非“核心”包(如桌面环境)中较少见,但仍然可能存在。 - tech4him
我认为“元包是一个没有实际内容,只有依赖关系的包”可以修改为“元包其实就是一个,它列出了如果安装了这个元包将会安装哪些包及其依赖关系”。换句话说,元包是“主要”包的列表,而不是它们的依赖关系。 - DK Bose
你的概念是正确的,但在技术上,元包中的依赖性与标准包中的依赖性并没有区别,APT也会以相同的方式对待它们——这正是我试图表达的观点。 - Guss

Ubuntu的ubiquity安装程序所安装的所有软件包都被标记为“手动”(而不是“自动”),这使得所有这些软件包都不能自动删除。

当然,您仍然可以删除它们,只是无法自动删除

Ubuntu服务器、Minimal Image和Cloud Image安装程序并不基于ubiquity,它们的软件包是符合自动删除条件的。

如果您对apt-marking不熟悉,那就是apt用来跟踪管理员指定的依赖项(“手动”)和作为依赖项引入的依赖项(“自动”)的方式。有关更多信息,请参阅man apt-mark

非标准Ubiquity行为的原因是为了保护您:人们以各种方式修改他们的桌面系统,其中一些方式需要删除元软件包。大多数用户通常并不打算删除整个桌面系统,但如果意外发生,则可能会引起相当重要的情绪事件。因此,Ubuntu开发人员进行了更改,以保护用户免受其自身(无意中的)错误影响。毕竟,Ubuntu也面向新手和不熟练的用户。

想要精简软件包,只保留实际使用的功能的朋友们(我们都曾尝试过这样做),从Minimal Image开始逐步构建会比与apt-marking抗争来减少软件包要容易得多。

这是一个非常好的观点,尽管我主要是在询问系统安装后进行二次元包安装的情况。这个回答是否完全解决了这个问题,还是只涉及到初始安装?无论哪种情况,都很有帮助--我只是想澄清一下。 - tech4him
1安装系统运行后,Ubiquity的更改将不再适用,当然。所有apt操作将是正常的:新安装的依赖项将被apt标记为“自动”,并且可以自动删除。 - user535733