我刚刚开始了解清除和删除有何不同,但我不明白的一件事是:
清除如何知道在哪里查找用户配置文件,以及清除时实际删除了多少?
实际上,如何删除一个包以及安装和配置该包可能留下的每个最后目录或文件,以便当我卸载它时,就像该包从未存在过一样?
有助于向我解释这个删除问题的场景是:
- 我安装了一个包,它安装了一大堆只有它需要的依赖项。
- 我安装一个包,它尝试安装它需要的一大堆依赖项,但发现其他一些包已经安装了这些依赖项,因为它们需要它们,所以它不会安装它们。
- 我删除一个包,它会删除它曾经需要的所有依赖项,无论其他程序是否需要它们。
- 我删除了一个包,它发现其他程序需要一些依赖项,因此它保留了它们,但删除了只有它需要的依赖项。
我认为我的逻辑涵盖了所有场景。我确信有一些方法可以实现这些场景,尽管它们可能固有的无用性。只是把逻辑写出来而已。无论如何,问题更多的是关于清除,而不是删除,所以让我们坚持清除,但如果您认为相关或有必要,请纠正我对删除的理解。
说明清除问题的实际例子是:
示例1:
我安装了ightvncserver 或openssh-server,它们在用户的主目录中创建文件夹来保存其配置。这两个包可以告诉 purge “嘿,当你从系统中删除我的包时,你可能想查看 ~/.vnc 或 ~/.ssh,然后删除这些文件夹,这样就不会留下任何东西了。”
另外,这些包是否会在 /var 或其他目录中留下其他内容,例如 purge 可能想要删除的内容?我不知道,比如 man-db、bash 别名。真的,我不知道,你告诉我,我是新手。
示例2:
灯堆栈。
当你安装 Apache 时,似乎到处都有东西乱扔。 apache2 不是在 /etc 中有自己的文件夹,并在 /var 中为站点本身使用空间吗?如果我清除 apache2,清除会知道查看 /etc 和 /var 并清除所有垃圾吗?如果它确实知道在那里查找以删除这些目录,那么它是如何知道的呢?包文件本身中是否有代码告诉内核或至少清除“嘿,当你清除我时,请查看以下位置并删除所有这些东西,因为除了我之外没有其他人使用它们。哦,同时你正在做,告诉我们所有程序都可以使用它来查找我们需要完全忘记我的东西的系统的一部分(systemctl?bash?其他?)。”
在我看来,我在以下地方看到了删除包的痕迹:
- /ETC
- /var
- 查询 systemctl 的服务状态时
- bash 别名
- 软件包安装到底把我没有列出的东西放在哪里?
显然我是在询问可能存在的或可用的信息。但是,我真的希望对这些问题进行简洁的处理。我认为这将帮助很多人揭开软件包安装和删除工作原理的神秘面纱。也许我问的是一些没有真正联系的事情,但对我来说,它们似乎是有联系的,所以揭开或纠正这些事情之间的联系或不联系显然也可以帮助澄清事实。
答案1
那里有很多问题(明确的和隐含的),我将解决主要问题......
正如您所说,“删除”和“清除”(至少在dpkg
基于 的系统中)之间的区别在于,删除包会保留其配置,而清除会删除它。其中有一个重要的方面:清除软件包只会删除其系统配置;它不会触及主目录中存储的任何用户配置。正如您所怀疑的,它也只删除包管理器知道的配置。
那怎么办工作?包列出了它们的配置文件,就是这样。如果您apache2
安装了该软件包,您可以通过查看来查看其配置文件/var/lib/dpkg/info/apache2.conffiles
;这些不会因软件包删除而被删除,但如果软件包被清除则会被删除。其余包装内容列于/var/lib/dpkg/info/apache2.list
;这就是包删除删除的内容。 (您将看到该.list
文件包含目录;只有当它们为空时才会将其删除。)
任何其他内容都“属于”系统管理员,由管理员来删除它。这包括最终写入的任何额外配置文件,例如下的新文件中的虚拟主机/etc/apache2/sites-available
以及 下的任何内容/var/www/html
。