更新Linux内核,同时保留系统的其余部分


25

我是OpenBSD用户。在OpenBSD常见问题中,它说:

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

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

内核,基本系统和/或第三方软件包不同步是潜在的问题根源,或多或少会使您失去从官方邮件列表中获得任何严重帮助的资格。

我对此很好。实际上,这是我使用OpenBSD的原因之一。它使系统成为一个一致的单元,并使我很容易就可以轻松地对其进行概述。

在Linux上是什么感觉?我知道的大多数Linux都没有与BSD相同的“基本系统”,而是由分发提供商组装的软件包的集合。然后,本地管理员以这种方式添加了其他软件,使得从一开始就存在的内容与后来添加的内容之间的界限充其量是模糊的。

Linux(通常)是否没有强大的内核与用户空间耦合? 据我所知,内核已像任何其他软件包一样进行了更新,这使我有些困惑,这完全有可能。除此之外,有些甚至编译自定义内核(在OpenBSD上不建议使用),并且在其启动菜单中列出了许多不同的内核版本。

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

我问的原因是因为该站点上的另一个用户问是否可以用较新的版本替换Linux系统中的内核。从OpenBSD的角度来看,我不能说是的,这可以保证不会破坏系统。


我将上面的“ Linux”用作“ Linux发行版”,内核和实用程序的简写。


换句话说,OpenBSD仅具有一个发行版。常规Linux系统上的多个grub菜单条目用于回退到较早的内核,以防(通常)最新的内核由于某种原因无法启动。
托尔比约恩Ravn的安徒生

Answers:


29

Linus Torvalds 对导致用户空间退化的内核更改持非常强烈的看法(有关详细信息,请参见“ Linux内核:破坏用户空间 ”问题)。

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

如果无法在不破坏用户空间的情况下更改现有界面,则添加了其他提供扩展功能的系统调用。这就是为什么存在三个dup版本的umount系统调用和两个版本的系统调用的原因。

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

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

@PeterCordes指出,如果 procfs sysfs的更改破坏了发行版初始化脚本使用的应用程序,则可能会出现问题。

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

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


1
从长远来看,用内核-用户界面(也称为系统调用)的摘要来扩展此解释将是有用的,因为它解释了不同配置的内核不会破坏应用程序的机制。
wallyk

3
遵循相同的“请勿破坏用户空间”策略/理念,即使procfs(/proc)和sysfs(/sys)也尽可能保持稳定。另外,ioctl()设备文件上的代码为en.wikipedia.org/wiki/Ioctl。它远远超出了简单的系统调用ABI兼容性,但是正如您所说的,当有充分的理由时,/proc和中确实会发生变化/sys。它不会直接破坏大多数程序,但是如果确实破坏了发行版的init脚本使用的低级用户空间程序,则可能会出现问题。幸运的是,这种情况很少见。
彼得·科德斯

实际上,某些文件(如IIRC rfkill开关)在某些内核升级中已更改了位置。因此/proc/sys其稳定性远低于syscall接口。幸运的是,发行版通常不包括此类内核升级,除非它是主要的发行版升级。
Ruslan

3
这里有两个方面需要考虑:升级内核和升级用户空间。由于内核的ABI稳定性,升级内核是相当安全的(即使/proc/sys变化通常-清除需要数年时间)。但是,升级用户空间可能需要新的内核,如果没有足够新的内核,最终可能会导致系统无法启动。发行版发行说明在适当的时候提到了这一点(因此,不要盲目升级发行版,请阅读发行说明)。
斯蒂芬·基特

1
关于/ proc和/ sys文件以及用户空间应如何读取它们的准则,以便允许在较新的内核中添加更多字段。例如/ proc / stat或/ proc / meminfo。预期用户空间将忽略添加的字段。
Zan Lynx

11

Linux内核和Linux发行版的用户空间(过去一直由GNU项目开发的用户工具控制)是松散耦合的。这部分是设计使然,部分是必要。

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

@sebasth也很好地说明了Linux内核项目的主要策略是它不能破坏用户空间。当然,哪个是强制松散耦合的因素。

但是,仍然存在一定程度的耦合。足够老的Linux内核不适用于现代发行版。


2
@Abigail这是吹毛求疵,但向前兼容性可以提供,如果用户空间的工具适当的回退(甚至退化回退)缺少内核特性。诚然,这通常是不理想的,甚至不值得,但是某些软件可以做到这一点(glibc例如)。(但是,这不是内核承诺,而是用户空间承诺。)
Stephen Kitt

7

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

在系统上安装两个内核软件包套件是很常见的-当前使用的软件包和以前安装的软件包。升级时,在确保新版本正常工作之后,可以删除最旧的版本,并且仍具有已知安全的备用。例如,红帽(及其表亲)必须package-cleanup --oldkernels --count 2自动执行此操作。


甚至kmod之类的东西(您认为需要将其与内核版本绑定在一起)在使用哪个版本时也有一些余地。
伊格纳西奥·巴斯克斯

4

除了这里所有好的论点,我还可以补充一些要点。

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

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

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

因此,社区是谁,然后是通用方法是什么,我们需要软件协同工作而不破坏系统,这就是为什么我们尝试遵循一些标准,例如Filesystem Hierarchy Standard

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.