从源安装新版本时是否应该卸载以前的版本?不这样做会带来问题吗?

从源安装新版本时是否应该卸载以前的版本?不这样做会带来问题吗?

我想安装一个软件,该软件在(最新)Debian 存储库中只有一个非常过时的版本(并且没有其他存储库可添加)。为此,我需要从源代码编译/安装它。

我应该先卸载旧版本吗?它可以在不这样做的情况下工作,但我想知道推荐的程序是什么,以及如果不这样做(以及哪些问题)是否会出现任何问题。

例如,依赖关系是否存在任何问题,或者安装是否以某种方式与另一个安装正确隔离?

答案1

当您从源安装(使用sudo make install)时,负责选择安装位置。

如果从源安装,许多软件包将默认安装在下面/usr/local,但您应该在构建软件之后但安装之前检查源包的构建说明和/或运行试运行安装(通常是make -n install,但请参阅构建说明)这是真的。

当安装在 下时/usr/local,该软件通常不应干扰发行版提供的打包版本,并且由于普通用户的 PATH 环境变量通常包含/usr/local/binbefore/usr/bin/bin,因此本地构建的版本将通常优先于打包版本。

所以安装后一切都应该没问题。但是,当发行版升级并且本地构建的安装比发行版打包的安装旧时,这可能会成为以后的问题。如果您使用 来安装本地构建的软件sudo make install,则源包可能包含也可能不包含相应的sudo make uninstall过程 - 如果您删除了构建目录,则Makefile可能包含正确卸载步骤的自动生成的目录可能会消失。

因此,如果您使用sudo make install,您应该记录安装过程的输出,或者确保您会记下安装阶段添加了哪些文件,以便您稍后可以手动删除它们。未雨绸缪。 (如果相关系统是单一用途服务器,它可能是唯一从源代码构建的软件,因此/usr/local/层次结构中的所有文件可能都是由该安装生成的 - 因此可能只需删除所有文件即可从/usr/local主要版本升级后的目录中。)

如果源包恰好包含该debian/rules文件,则源代码已经包含构建实际 Debian 包所需的配置。在这种情况下,您可以使用dpkg-source -b通用源构建指令来代替,并且结果应该是.deb您可以使用包管理器安装的一个或多个包。

如果包的命名与发行版相应的标准版本相同,但本地构建的包的版本较高,则本地构建的包将自动用于替换发行版的版本。就像安装发行版提供的更新一样,包管理器将自动删除旧版本的包并将其替换为新版本。

(除非您采取额外的步骤对您构建的包进行加密签名,否则您可能会收到来自包管理器的警告,具体取决于您使用的包管理工具,但由于您刚刚自己构建了包,因此您可能信任它们。)

在这种情况下,一旦发行版的软件包存储库中的软件版本号高于本地构建的软件包,软件包管理器将自动建议升级,就像升级标准软件包时一样。

具有通用源代码构建指令和 Debian 特定的指令dpkg-source -b,如果您正在构建的软件包依赖于某些库,您不仅需要安装这些库的兼容版本(构建指令通常会列出所需的所需库的最低版本)以及开发包对于这些库,以便编译器知道如何使用这些库。

开发包的名称通常与对应的库包名称相同并-dev添加后缀,但有时库包名称可能包含一些开发包名称中省略的版本号。 (在这些情况下,可能有多个版本的库可用于向后兼容,但开发包要么涵盖这两个版本,要么只涵盖最新版本。)

听起来您已经成功编译了新版本,因此这可能与您无关...但是当从源代码构建更新版本的软件时,您可能会发现它需要某些库或其他库的更新版本在发行版中可用...并且该库的较新版本需要其他一些库的较新版本才能编译...等等。虽然可以遍历依赖关系链并构建所需库的本地版本(如果所需库的数量不是太多),但重要的是不要走得太远。提供一两个专用库的新版本可能没问题,但如果您开始构建由多个系统组件使用的库的升级版本,您可能应该考虑切换到更新的发行版。本地编译新版本glibc并将其安装以供系统范围使用是理所当然的。

答案2

TL;DR 的答案是,如果一切都按预期工作,“永远不要碰正在运行的系统”,除非你知道自己在做什么或感觉很冒险:)但是使用apt remove <software>(或类似)相对安全,并且版本冲突或损坏通过此途径的依赖关系很少(对于也通过 apt 安装的软件)。

作为第一步,您可以手动检查软件的依赖关系

ldd --verbose <program>

但这很快就会变得复杂 - 我的建议是,永远不要仅仅因为旧软件安装了某个库就盲目地删除它。它也可以被其他程序使用。

不同版本的库通常通过适当的命名约定很好地“隔离”。不幸的是,安装损坏的共享库总是会带来问题。在这种情况下,您必须重新安装该库或完全依赖软件。您可以通过仔细考虑首先安装的软件(也许设置一个镜像您的虚拟系统并在那里进行测试)来减轻后续问题。

当然,以上仅适用于共享文件。可以相对放心地删除安装到 /home/ 中的文件和目录。 Gems、Shards 或 python 包等可能是例外,但这些可以相对容易地重新安装。此外,如果您生成了访问密钥或解锁代码,请在删除之前先进行备份。

当然,关于该主题的答案可以从“就这样做”到“永远不要碰它”,并且围绕该主题肯定存在许多意见。

希望有点帮助。

答案3

Linux 中的标准做法是将新软件从源安装到/usr/local或 ,/opt这意味着无需卸载已安装的软件。

相关内容