更新 Linux 内核,同时保持系统其余部分不变

更新 Linux 内核,同时保持系统其余部分不变

我是 OpenBSD 用户。在OpenBSD 常见问题解答它说:

OpenBSD 是一个完整的系统,旨在保持同步。它不是一个内核加上可以相互单独升级的实用程序。

当您升级系统时,您可以一次性完成;内核和基本系统被替换。然后你去更新你的第 3 方包。如果从源代码编译,您重新编译内核并启动它。然后重建基本系统,然后重建已安装的软件包。如果自上次重建所有内容以来已经过去了几周/几个月,您首先安装快照并从那里重建(如果您遵循最新的 CVS 分支)。

不同步的内核、基础系统和/或第 3 方软件包是潜在的问题来源,并且或多或少会使您失去从官方邮件列表获得任何认真帮助的资格。

我对此很满意。事实上,这也是我使用OpenBSD的原因之一。它使系统成为一个一致的单元,并且使我很容易对其形成一个心理概述。

在 Linux 上是什么样子的?据我所知,大多数 Linux 并不具有与 BSD 相同意义上的“基本系统”,而是由发行提供商组装的软件包集合。然后,本地管理员会添加更多软件,这样一来,从一开始就存在的软件和后来添加的软件之间的界限充其量是模糊的。

Linux(一般来说)是否没有强大的内核与用户空间耦合? 据我所知,内核已更新,就像任何其他软件包一样,这让我有点困惑,这是可能的。除此之外,有些甚至编译自定义内核(在 OpenBSD 上不鼓励这样做),并且在启动菜单中列出了多种不同的内核版本。

谁或什么保证Linux系统的各个子系统能够相互协作,即使它们彼此独立更新?

我问的原因是因为该网站上的另一个用户问用更新版本替换 Linux 系统中的内核是否“可行”。从 OpenBSD 方面来看,我不能说是的,这将是保证以免破坏系统。


我在上面使用“Linux”作为“Linux 发行版”、内核+实用程序的简写。

答案1

莱纳斯·托瓦兹(Linus Torvalds)有一个非常强的反对内核更改导致用户空间回归的意见(请参阅问题“Linux 内核:破坏用户空间”了解详情)。

用户空间和内核之间的接口由系统调用提供。较新的内核可以有更多的系统调用,并且可以对现有的系统调用进行更改,前提是这些更改不会破坏现有应用程序。当系统调用接口具有标志参数时,新内核通常会使用新位标志公开新功能。这样内核就可以保持对旧应用程序的向后兼容性。

当无法在不破坏用户空间的情况下更改现有界面时,会添加额外的系统调用来提供扩展功能。这就是为什么有三个版本dup和两个版本umount系统调用。

拥有稳定的用户空间的策略是内核更新很少导致用户空间应用程序出现问题的原因,并且通常不会在升级内核后出现问题。

但是,不能保证相同的 API 稳定性核心接口和其他实现细节系统文件系统(上/sys)和进程文件系统(上/proc/)公开低级应用程序使用的运行时配置、硬件、网络、进程等的内核实现细节。如果有充分的理由,这些接口可能会在内核版本之间以不兼容的方式进行更改。如果可能的话,更改仍然会尝试最大程度地减少不兼容性,并且有规则了解应用程序如何以最不可能引起问题的方式使用接口。影响也是有限的,因为非低级应用程序不应使用这些接口。

@彼得科德斯指出如果发生变化进程文件系统或者系统文件系统破坏了您的发行版初始化脚本所使用的应用程序,您可能会遇到问题。

这在某种程度上取决于您的发行版更新内核的方式(长期支持或主线),即使这样,问题也相对较少,因为发行版通常同时发布更新的工具。

@斯蒂芬基特补充说,升级后的用户空间可能需要更新版本的内核,在这种情况下,系统可能无法使用旧内核启动,并且发行版说明在适当的时候提到了这一点。

答案2

Linux 内核和 Linux 发行版的用户空间(历史上由 GNU 项目开发的用户工具主导)是松散耦合的。这部分是设计使然,部分是必然。

与 BSD 不同,BSD 的内核和基本用户空间是一起设计和维护的,Linux 内核和它的用户空间是由不同的人开发和维护的。因此,即使社区希望如此,让它们紧密结合在一起也是很困难的,但我认为事实并非如此。

@sebasth 还提出了一个很好的观点,即 Linux 内核项目的一个主要政策是它不能破坏用户空间。这当然是强制松散耦合的另一个因素。

然而,仍然存在一定程度的耦合。足够旧的 Linux 内核无法在现代发行版上运行。

答案3

我的理解是Linux核心,其他一切都是辅助的。您绝对可以独立于(许多)已安装的软件包来升级内核,因为它们通常与图书馆而不是内核本身。您通常只会看到内核版本和硬件驱动程序(例如 GPU 驱动程序)之间的这种耦合。 一些软件仅与某些版本的内核兼容,但应在这些程序的单独文档中指定。

在系统上安装两个内核软件包套件是很常见的——当前使用的软件包和以前安装的软件包。升级时,在确保新版本正常运行后,可以删除最旧的软件包,这样您仍然可以使用已知安全的后备软件包。例如,Red Hat(及其同类产品)必须package-cleanup --oldkernels --count 2自动执行此操作。

答案4

除了这里所有好的论据之外,我还可以添加一些有帮助的观点。

我们已经了解内核团队的政策,并且作为 Linux 发行版,我们尽力保持内核源代码尽可能纯净。这意味着,每当出现漏洞或需要修补程序时,我们都会通知内核团队并尝试帮助修补,但最终的决定由内核团队做出。

有些发行版比其他发行版添加更多补丁,但其想法是保留来自上游开发人员的补丁。显然,有些程序需要特殊的内核配置,特别是虚拟化和第三方驱动程序,通常,它们都用于与特定的内核版本或至少不太旧的版本一起工作......原因是它们尝试使用最新的内核功能,因此,如果您尝试使用旧内核运行它们,它们可能无法正常运行。

需要记住的一个额外因素是所有 Linux 发行版都有一个维护团队,他们确保所有软件都与系统兼容。这就是为什么几乎每个发行版都有稳定版本和不稳定版本的原因。开发人员使用“不稳定”的软件,当所有的软件都经过测试后,他们将其标记为稳定,只有在此之后,普通用户才能升级软件包,因此,如果询问您的人是普通用户,那么该软件有 90% 的安全性,表明该软件经过了良好的测试。

那么谁是谁,社区,然后通用方法应该是什么,我们需要软件协同工作,而不是破坏系统,这就是为什么我们尝试遵循一些标准,例如文件系统层次结构标准

相关内容