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

Kus*_*nda 28 dependencies linux-kernel

我是 OpenBSD 用户。在OpenBSD FAQ 中,它说:

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

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

具有不同步的内核、基本系统和/或 3rd 方软件包是潜在问题的来源,并且或多或少使您无法从官方邮件列表中获得任何认真的帮助。

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

在 Linux 上感觉如何?我所知道的大多数 Linux 都没有与 BSD 相同意义上的“基本系统”,而是由分发提供商组装的一组软件包。然后由本地管理员以这样的方式添加更多软件,使得从一开始就有的软件和后来添加的软件之间的界限充其量是模糊的。

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

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

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


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

seb*_*sth 33

Linus Torvalds强烈反对内核更改导致用户空间回归(有关详细信息,请参阅问题“ Linux 内核:破坏用户空间”)。

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

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

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

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

@PeterCordes指出,如果procfssysfs 中的更改破坏了您的发行版 init 脚本使用的应用程序,您可能会遇到问题。

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

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

  • 甚至 procfs (`/proc`) 和 sysfs (`/sys`) 也尽可能保持稳定,遵循相​​同的“不要破坏用户空间”的策略/理念。此外,设备文件 https://en.wikipedia.org/wiki/Ioctl 上的 `ioctl()` 代码。它远远超出了简单的系统调用 ABI 兼容性,但正如你所说,当有充分的理由时,`/proc` 和 `/sys` 确实会发生变化。它不会直接破坏大多数程序,但如果它确实破坏了发行版的 init 脚本使用的低级用户空间程序,那么您可能会遇到问题。幸运的是,这种情况很少见。 (3认同)
  • 这里有两个方面需要考虑:升级内核和升级用户空间。由于内核的 ABI 稳定性,升级内核非常安全(即使通常更改 `/proc` 和 `/sys` - 删除需要数年时间)。但是,升级用户空间可能需要一个新内核,如果您没有足够新的内核,您最终可能会导致系统无法启动。发行版发行说明在适当的时候提到了这一点(所以不要盲目升级发行版,阅读发行说明)。 (3认同)

Fah*_*tha 12

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

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

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

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

  • @Abigail 这是吹毛求疵,但如果用户空间为缺少的内核功能实现了适当的回退(甚至降级回退),则可以*提供向前兼容性。诚然,这通常是不可取的,甚至是不值得的,但有些软件可以做到这一点(例如`glibc`)。(但是,是的,这不是内核承诺,而是用户空间承诺。) (2认同)

Dop*_*oti 8

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

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