(我可以列出超过 20 页类似的问题/疑虑。但是,我找不到任何解决方案。因此,在将其标记为重复之前,请耐心等待。)
我从 Windows 切换到 Linux(Ubuntu)已经快三个星期了。我一直在尝试为我的应用程序找到合适的工具。因此,我在 Linux 中尝试了很多不同的应用程序。结果,我使用 安装/删除了很多应用程序apt-get
。
在执行其中一个安装/删除命令后,apt-get
系统提示我运行apt-get autoremove
命令。我照做了,然后意识到它还删除了我的部分桌面应用程序,桌面环境的外观也完全改变了。由于我不是 Linux 专家,我最终花了一些时间重新安装了它!
从那时起,我决定不再使用它apt-get autoremove
。然后,我四处搜索,发现了deborphan
推荐用于删除孤立包的命令。因此,apt-get autoremove
我没有使用,而是使用以下命令来摆脱不需要的包:
sudo deborphan --guess-all | xargs sudo apt-get -y remove --purge
直到最近,一切都很好,但运行后,Qt-Creator 停止编译我的 C++ 代码,并出现错误cannot find -lGL
。在使用之前一切都很好deborphan
。幸运的是,我能够通过重新安装libgl1-mesa-dev
包来修复它。
所以,不幸的是,这也是我对的信任的终结deborphan
。
现在,经过几天的使用apt-get autoremove
,这里是建议删除的 deborphan
软件包的长列表:apt
0 upgraded, 0 newly installed, 79 to remove and 0 not upgraded.> The following packages will be REMOVED: fonts-wine
geany-plugins-common gir1.2-evince-3.0 gir1.2-gconf-2.0
gir1.2-nautilus-3.0 gir1.2-poppler-0.18 libboost-atomic1.62-dev
libboost-atomic1.62.0 libboost-chrono1.62-dev libboost-chrono1.62.0
libboost-context1.62-dev libboost-context1.62.0
libboost-coroutine1.62-dev libboost-coroutine1.62.0
libboost-date-time1.62-dev libboost-date-time1.62.0
libboost-exception1.62-dev libboost-fiber1.62-dev
libboost-fiber1.62.0 libboost-filesystem1.62-dev
libboost-graph-parallel1.62-dev libboost-graph-parallel1.62.0
libboost-graph1.62-dev libboost-graph1.62.0 libboost-iostreams1.62-dev
libboost-locale1.62-dev libboost-locale1.62.0 libboost-log1.62-dev
libboost-log1.62.0 libboost-math1.62-dev libboost-math1.62.0
libboost-mpi-python1.62-dev libboost-mpi-python1.62.0
libboost-mpi1.62-dev libboost-mpi1.62.0
libboost-program-options1.62-dev libboost-program-options1.62.0
libboost-python1.62-dev libboost-python1.62.0
libboost-random1.62-dev libboost-regex1.62-dev
libboost-serialization1.62-dev libboost-serialization1.62.0
libboost-signals1.62-dev libboost-signals1.62.0
libboost-system1.62-dev libboost-test1.62-dev libboost-test1.62.0
libboost-thread1.62-dev libboost-timer1.62-dev libboost-timer1.62.0
libboost-type-erasure1.62-dev libboost-type-erasure1.62.0
libboost-wave1.62-dev libboost-wave1.62.0 libboost1.62-dev
libboost1.62-tools-dev libhwloc-dev libibverbs-dev libieee1284-3:i386
libnuma-dev libopenmpi-dev libpython3-dev libpython3.6-dev libwine
libwine:i386 linux-headers-4.13.0-21 linux-headers-4.13.0-21-generic
linux-image-4.13.0-21-generic linux-image-extra-4.13.0-21-generic
mc-data mpi-default-dev ocl-icd-libopencl1:i386 python-glade2
python3-dev python3.6-dev thunderbird-locale-en wine32:i386 wine64
我既没有时间也没有知识去浏览这个列表并找出我真正需要的包以及哪些包可以删除。
我还尝试将它们全部标记为“手动”,希望这样做之后,apt-get autoremove
可以确定哪些是真正孤立的和不需要删除的。我用过aptitude keep-all
,但总是卡住。我发现这是一个漏洞应该已经修复但显然没有。
问题:在 Ubuntu 中删除不需要的应用程序/库的最安全方法是什么,而无需逐一检查所有软件包及其依赖项?
答案1
自动移除的规则实际上非常简单。
对你的问题的具体回答“在 Ubuntu 中删除不需要的应用程序/库的最安全方法,不需要逐个检查所有软件包及其依赖项“是:让 Apt 完成其工作。当您更好地了解 apt 如何做出决定时,您就可以做到这一点。对于大多数新用户来说,这是学习曲线的正常部分。所以让我们讨论一下 Apt 逻辑......
Apt 不知道你是否使用一个包是否是它所依赖的。它不是通灵的。它只知道每个包的依赖关系以及你告诉它的内容。为了使任何包有资格自动删除(孤立),它必须满足两个标准:
- 它必须被恰当地标记为
auto
(而不是manual
) - 没有任何
manual
包直接或间接地依赖于该包。
有三种复杂行为让用户感到困惑。
Apt 会记住您明确安装的软件包并标记这些软件包
manual
。所有其他依赖项都标记为auto
。Ubuntu 安装程序会在全新安装时标记所有初始软件包
manual
。这是为了防止新手意外删除系统中的大量内容。由于 Ubuntu 脚本的原因,内核包的运行略有不同。
就是这样 - 两条规则和三种特殊行为。其他一切都是普通的逻辑。
让我们看几个常见的例子来了解这些规则和行为如何应用。
示例 #1:sudo apt install foo libfoo
对于人类来说,任何名为 的东西libfoo
都可能是 的依赖项,这是相当明显的foo
。但对于 apt 来说,这并不明显。我们明确告诉 apt 要安装libfoo
,因此它将被标记为manual
,并且不符合自动删除的条件。
如果我们告诉sudo apt install foo
Apt 然后让 apt 计算依赖项,它会工作得更好。libfoo
将会被(正确地)标记,并且在被删除auto
时有资格自动删除。foo
示例 #2:sudo apt remove ubuntu-desktop
如果你从最小图像,或者如果你安装了 LAMP 堆栈或新的桌面环境后初始安装,然后像 Metapackages 这样的ubuntu-desktop
就很棒了 - 一个命令就可以完成整个堆栈。但是从 apt 的角度来看:一个manual
包和几十个(几百个)auto
依赖项。当你因为尝试不同的应用程序而卸载 metapackage 时...好吧,你明白了。
解决方法是简单地将您的关键顶级应用程序标记为manual
:
sudo apt install foo // Even if foo is already installed
sudo apt-mark manual foo // Does the same thing
sudo apt-mark auto libfoo // Makes libfoo eligible for autoremoval someday when foo gets removed
sudo apt remove foo // Apt will remove foo *regardless* of apt-mark
请记住,apt-marking 只是告诉 apt 哪些包是不符合自动删除条件的顶级应用程序 - 它不能保护它们免受人为的愚蠢行为的影响。
浏览自动删除列表的简便方法对于大多数人来说,只需查找顶级关键应用程序包 - 您的电子邮件客户端、您的 Web 浏览器、您的 IDE、您最喜欢的游戏。查找foo
,忽略libfoo
。当确实有一个被遗漏并被删除时,只需重新安装它 - 请记住,告诉系统安装包会将其标记为manual
。然而,由于您编译软件并使用软件包,因此您的特定用例更加复杂-dev
。对您来说,没有神奇的解决方案(抱歉)——您必须花时间了解哪些软件包对您很重要……就像我们其他人一样。
警告:所有这些都适用于来自 Ubuntu 存储库的 deb 软件包。如果您从其他地方添加了很多奇怪的软件包,那么您必须进行更多的软件包管理。请记住,apt 不了解也无法控制 pip、snap、flatpak、appimage 软件、下载的二进制文件或脚本或编译的代码。