〖已解决〗到底什么是“孤立”包?

这个问题是从我想要删除一些没有用的包开始的。
我从wiki上看到递归删除“孤立包”的命令是

# pacman -Qtdq | pacman -Rns -

但当我运行这个命令之后,我发现系统要把几乎所有明确安装的包都删掉,例如xorg组里的包、xfce4组里的包、firefox等等一看就不应该删的包。而且删除的体积大约是18个G,我archlinux分区里如果不算home,也就20多G,如果连/opt也不算的话,勉强20个G,所以从体积上看也是包括了大多数安装包的。我担心自己命令输入有误,又试了几次,包括直接复制wiki里的命令尝试,结果都是一样的。然后我紧接着在后面看到一个命令,就是

# pacman -D --asdeps $(pacman -Qqe)

其实这个命令是在“Removing everything but essential packages”条目下的,但是我当时错误的理解了“essential packages”的含义。也是因为上面阐述的问题,让我错误理解了“孤立”包的含义——当时我认为只要安装原因不是“作为依赖安装”且不被其他软件包依赖的,都是孤立包,那明确指定安装的包肯定是符合“孤立包”的含义了,所以要先把明确指定安装的包改成作为依赖安装,这样就“可以”了。后面的事情就是原帖说明的了。

感谢SamLukeYes依云的帮助,我正确理解了命令和“孤立”包的含义,也通过pacman.log里的记录把安装原因改回来了。

但就是这一来一回的更改包安装原因之后,一开始那个“运行pacman -Qtdq | pacman -Rns -会删除所有明确指定安装包“的问题莫名奇妙的就消失了,再运行时只删除了大概40来个包,几百M大小,没有一个是我明确指定安装的包。

虽然不知道怎么就解决了,但总算是解决了。

PS: 空间不足的问题是靠pacman -Scc和删掉一些看过的视频解决的。

==============================================================分割线========================================================================

最近觉得archlinux的分区有点儿紧张了,想删掉一些没用的包。网上搜了一下,看有人说“孤立”的包可以删掉。

但是我用pacman -Qtdq列了一下,发现它给我列出了几乎所有的安装包,然后我有趣wiki上看了一下,说要用pacman -D --asdeps $(pacman -Qqe)命令把所有明确安装的包变成“依赖”关系,再看哪些包是孤立的。

我运行了命令之后,确实显示大量的安装包被设置成“作为依赖安装”了,但我再运行pacman -Qtdq时,还是给我列出几乎全部的安装包。

我还安装了一个pamac,用它看,除了它自己不是孤立包之外,其他都是孤立包……

这是咋回事?还是我操作有啥问题?

谢谢大家。

你的操作有大问题。执行了 pacman -D --asdeps $(pacman -Qqe) 之后,你所有单独指定安装的软件包就都被标记为作为依赖安装的了。现在你的 pacman 数据库中关于哪些包是单独指定安装的信息已经丢失了,以后在卸载软件包的时候带 s 选项都会很危险,除非你从执行这个操作前的备份或快照中恢复,或者借助 pacman.log 和你的记忆恢复这一部分信息。

谢谢,那为什么用pacman -Qt命令,还是把这些包列出来呢?还是我对-Qt命令理解错了,不是把孤立的包列出来?(用-Qtdq和-Qtt列出来的包差不多)

-Qt 不是把孤立包列出来,而是把“不被任何包需要的包”列出来,正常情况下其中会包括单独指定安装的包。如果一个不被任何包需要的包是作为依赖安装的,它才是孤立包。

感谢,原来是这样啊。

也就是说,我虽然执行了 pacman -D --asdeps $(pacman -Qqe) ,只是把那些单独指定安装的包在pacman的数据库里标记为“作为依赖安装的”,但用pacman -Qt并不是看这个标记,而是看它是不是被其他包需要(就是pacman -Qi里的“Required By ”),所以即使我把这个标记改了,那些单独指定安装的包仍然会被-Qt参数列出来。我这么理解对吗?

从 pacman 的手册来看,确实是这个意思。

另外再次提醒你,能回滚的话还是尽快回滚吧。在没有正确标记单独指定安装的软件包的情况下,一些 AUR helper 或者其他包管理前端可能会产生预期之外的损坏系统的行为。

多谢多谢

不过系统回滚是没戏了,我没有备份(的磁盘空间)。我先把home里一些重要的个人文件备份一下,要是系统出问题了大不了重新安装吧。

那我建议你自己准备一份文件,然后进行以下操作:

  • pacman -Qdtt
  • 挑几个你知道自己需要用的包, pacman -D --asexplicite xxx 标记上。然后在你的文件里记上这些包是需要的,并且可选地注册需要的原因
  • 跳回第一步重做

当你的 pacman -Qdtt 里输出的包名你都不需要的时候,你就可以删掉它们啦。

多谢,但是这其中有不少是类似lib开头的、python-开头的,那些我也不知道需不需要啊。
而且有500多个包了,只能这样一个一个的看吗?

不知道要不要的,就假定不需要,卸载了出问题再装回来,顺便记下来缺少它会出什么问题。
500个包那么少,我都快1800个包了呢。

多谢多谢

您是专业人员啊,我哪比得了。我的电脑就是上网和娱乐用的,装个浏览器和几个游戏以及一些必要的应用而已,-Qdtt出来的有那么多就算不少了 :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

你都 -D --asdeps 了,-Qdtt 可不就多起来了么。

这倒是。
那我就有另一疑问了:在我尚未运行pacman -D --asdeps $(pacman -Qqe)的时候,我是先按照wiki上的这条: Removing unused packages (orphans)
的说明,首先运行的 pacman -Qtdq | pacman -Rns - (也用了一次-Qttdq),但是给我显示要删除的有上千个包啊,而且这些包里几乎包括了所有我自己安装的包(比如xorg、xfce4、firefox、hexchat这类等等)。
所以如果按照wiki上的说明来删除孤立包的话,实际上就把除了最初安装使的base、linux等基础包外,就把其他的几乎所有指定安装的包都删掉了啊。这是我理解错了吗,还是哪里除了问题?

这不对啊。正常来说 pacman -Qtdq 这个命令不会列出多少包来的。

是不是因为我这个系统是用rsycn从另一块硬盘上迁移过来的原因,但我早忘了用的什么参数了,毕竟一晃都好几年了。

应该无关。这个信息是记录在 /var/lib/pacman/local 下的文件里的。如果你这里的文件同步的过程中出了事的话,应该整个包的信息都没了,而不是只有一项不对。

我发现在/var/log/pacman.log里有当时我运行“pacman -D --asdeps $(pacman -Qqe)”命令后,有哪些包被重新标记了,然后我对比了用“pacman -Qdtt”列出的软件包。这两个大约有90%的包是重合的。

对了,那我是不是把pacman.log里记录在命令“pacman -D --asdeps ”后面的那些包用pacman -D --asexplicit重新标记为“单独指定安装”就可以了呢?

重做重合很正常啊。显式安装的包大都是依赖树上的叶子节点嘛。
可以。

好的,我先解决一个问题。孤立包的事回来再说。谢谢

竟然都解决了……