返回

2025/03/19

10. 了解 Oracle Linux 的两个内核“UEK”和“RHCK”

Oracle Linux 有两个内核:与 RHEL 兼容的 Red Hat Compatible Kernel (RHCK) 和 Oracle Linux 自有的 Unbreakable Enterprise Kernel (UEK)。

如果您从未使用过 Oracle Linux,可能会对 Unbreakable Enterprise Kernel 感到担忧。在本文中,我们将解释 Unbreakable Enterprise Kernel,以及其兼容性和判断使用时机的标准。

Red Hat Compatible Kernel 和 Unbreakable Enterprise Kernel

作为基本介绍,我们将提供 Red Hat Compatible Kernel 和 Unbreakable Enterprise Kernel 的概述。

什么是 Red Hat Compatible Kernel?

顾名思义,Red Hat Compatible Kernel (RHCK) 是与 RHEL 兼容的内核,仅仅是 RHEL 内核源代码的重建版本。由于只是重建版本,只要版本号相同,它的行为将与 RHEL 相同,包括错误。

下表显示了 Oracle Linux 每个主要版本的 RHCK 和 glibc 版本。为了强调同一 Linux 主要版本内的兼容性,内核和 glibc 等重要组件的基础版本不会改变。相反,当有更新时,发布号将按如下所述更改。

Linux 版本 RHCK 版本 glibc 版本
Oracle Linux 9 5.14.0 2.34
Oracle Linux 8 4.18.0 2.28
Oracle Linux 7 3.10.0 2.17

下图显示了内核和 glibc 的 RPM 包名称。当发布更新包时,基础版本保持不变,发布号会更新。

图 1 内核/glibc 版本和发布号

什么是 Unbreakable Enterprise Kernel?

Unbreakable Enterprise Kernel (UEK) 是 Oracle Linux 独有的内核,基于比 RHCK 更新的内核,并与 RHCK 兼容。以下手册提供了其功能的参考。

官方文档:Unbreakable Enterprise Kernel

Unbreakable Enterprise Kernel (UEK) 是由 Oracle 构建并通过 Oracle Linux 支持的 Linux 内核。其重点是性能、稳定性,并通过尽可能贴近主线源代码来减少回溯。UEK 经过充分测试,用于运行 Oracle 的工程系统、Oracle 云基础设施以及 Oracle 客户的大型企业部署。

Linux 数据库安装指南

Unbreakable Enterprise Kernel 默认包含并启用在 Oracle Linux 内核中。它基于最近的稳定主线开发 Linux 内核,并包括与 Oracle 数据库、Oracle 中间件和 Oracle 硬件工程团队合作开发的优化,以确保最苛刻的企业工作负载的稳定性和最佳性能。

主要观点如下:

  • UEK 是 Oracle 开发和支持的 Linux 内核。
  • Oracle Linux 默认内核
  • 基于主线 Linux 内核的新稳定版本
  • 与 Exadata 和 Oracle 数据库团队合作开发,注重性能和稳定性
  • 在包括 Exadata 和 Oracle 云基础设施的大型企业工作负载环境中测试

Oracle Linux 与内核版本的关系

UEK 的版本号根据其基于的内核而变化,例如命名为 UEK6 和 UEK7。此外,与 RHCK 的一个主要区别是 Oracle Linux 的主要版本与 UEK 版本并非固定的。下表显示了 UEK 与 Oracle Linux 的对应关系。从此表可以看出,Oracle Linux 8 可以使用 UEK6 和 UEK7。

UEK 版本 内核版本 Oracle Linux 7 Oracle Linux 8 Oracle Linux 9
UEK7 5.15.0 ×
UEK6 5.4.17 ×
UEK5 4.14.35 × ×
UEK4 4.1.12 × ×

下表比较了 Oracle Linux 的 RHCK 和 UEK 内核版本。Oracle Linux 9 于 2022 年发布,因此 RHCK 和 UEK 版本之间的差异很小。然而,由于 Oracle Linux 7 和 Oracle Linux 8 已发布一段时间,RHCK 和 UEK 版本之间的差异较大。

Linux 版本 RHCK UEK
Oracle Linux 9 5.14.0 5.15.0
Oracle Linux 8 4.18.0 5.4.17, 5.15.0
Oracle Linux 7 3.10.0 4.1.12, 4.14.35, 5.4.17

Linux 内核版本命名规则

现在我们已经介绍了 Linux 内核版本,让我们再次看看命名规则。事实上,没有确定的规则,因为它已经多次更改,原始 kernel.org 和 Linux 发行版之间的命名规则略有不同。

kernel.org 的命名规则

首先,让我们看看官方 Linux 内核网站 kernel.org 使用的命名规则。Linux 内核被命名为“abc”,并按以下方式命名。然而,这种命名规则并非绝对的。

a:主要发布号
b:次要发布号
c:补丁号或修订号

另外,5.19 之后的下一个版本是 6.0,但这并不是因为功能发生了重大变化。只是因为 b 的数字太大不理想,通常在 b 达到大约 20 时会递增 a。而 c 是补丁级别的修改,例如错误修复。因此,现在通常将“ab”或“abc”的组合称为发布号或版本号。

在下图中,主要发布号被划掉,因为它不再常用,但当您想明确第一个数字时仍会使用。

图 2 Linux 内核版本命名规则

看看下图。它显示了 Linux 内核的开发历史。灰色部分是开发期,经过一段时间后,开发转向下一个版本。换句话说,特定的 Linux 发布版“abc”每隔几年重复一次“开发 → 支持 → LTS(长期支持)”的生命周期。LTS 内核每年发布一次,支持大约五年。

来源:https://en.wikipedia.org/wiki/Linux_kernel_version_history

图 3 Linux 内核版本历史 6.x

图 4 Linux 内核版本历史 5.x

Linux 发行版的命名规则

Linux 发行版和 kernel.org 的命名规则略有不同。Linux 发行版内核被命名为“abc-z”,但实际上,大多数发行版的 c 为零,即“ab0-z”。这不仅适用于 RHEL,也适用于 Ubuntu,以及 UEK7 及之后的版本。

下图显示了 Linux 发行版中内核版本的命名方式。目前没有统一的理解,似乎因使用环境和个人而异。

图 5 Linux 发行版名称

“基础版本”这一术语是平台的新术语。它表示其基于的 kernel.org 版本。然而,c 被强制设为零,因此即使基础版本是 5.15.0,其基于的内核版本不一定是 5.15.0。例如,UEK7 是 5.15.0 版本,但它基于 5.15.6。

$ rpm -q --changelog  kernel-uek-5.15.0-105.125.6.2.2.el9uek | tail -n 2
- Linux 5.15.6 (Greg Kroah-Hartman)

主线、长期、稳定和 rc 的关系

让我们看看官方 Linux 内核页面 The Linux Kernel Archives。列出了多个 Linux 内核版本,带有主线、长期、稳定和 rc 等标签。我将在下文解释每一个。

图 6 The Linux Kernel Archives

下图摘录了 kernel.org 的一些内核版本并添加了注释。主线是主要开发。一旦 rc(候选发布版)可用,它就成为正式版本,因此主线和稳定指的是同一状态。在稳定版本中,每隔几个版本会成为长期版本,并获得长期支持。

图 7 kernel.org 上的生命周期

什么是回溯(backporting)?

这里有一个需要记住的词:回溯(backporting)。回溯指的是将新版本软件中包含的功能或修复应用到旧版本软件上。

例如,将 6.0 版本中引入的新补丁应用到 5.0 版本称为回溯。通常,两个版本之间的差异越大,代码库的差异越大,应用就越困难。此外,有时旧版本中不存在相关错误,使得回溯变得不必要。

有些人可能想知道回溯的反义词是什么。例如,将软件 5.0 版本的错误修复应用到较新的 6.0 版本。我做了一些研究,但没有通用的术语,似乎使用了回溯、合并、前向移植等术语。许多人似乎不加思索地称之为回溯。

以下文本是开头介绍的 UEK 描述的一部分。

其重点是性能、稳定性,并通过尽可能贴近主线源代码来减少回溯。

考虑到我们迄今讨论的内容,Oracle 提出了以下主张:

  • 较新的主线源代码基础更有可能具有更好的性能和稳定性,因为它们包含更多新功能和错误修复。
  • 从较新的主线源代码开始意味着源代码的差异较少,因此需要的回溯量最少。

Linux 内部基础知识

了解 UEK 的一个最重要的事情是它与 RHEL 内核 (RHCK) 的兼容性。要理解兼容性,Linux 操作系统的知识是必不可少的。因此,我们将解释 Linux 内部结构的基础知识。

Linux 操作系统的核心组件

下图显示了 Linux 操作系统的核心组件及其关系。在试图理解 Linux 操作系统时,记住这些信息很重要。

  • Linux 内核
    内核是 Linux 操作系统的核心组件。它接收来自应用程序的请求,并执行进程管理和内存管理以运行程序。它还使用作为内核模块的设备驱动程序来管理文件系统并控制设备以进行输入/输出。内核的作用可以总结如下。最好将其理解为作用于硬件的功能。
    • 对 CPU、内存、磁盘、网络卡等的硬件资源管理
    • 对运行在 Linux 上的应用程序的进程管理和控制
  • 内核模块
    内核模块是扩展内核功能的二进制文件。它们主要是设备驱动程序,格式为按需加载。这允许通过简单添加驱动程序来支持新硬件,并减少内存使用。
  • 系统库
    系统库(或简称库)是程序常用的函数集合,提供了操作系统提供的大部分功能。最著名的是 glibc,这是 Linux 中使用的标准 C 库。它被称为 glibc,因为它最初由 GNU 开发为 GNU C 库

图 8. Linux 的内部结构

理解基础知识(库函数和系统调用)

图 8 中的应用程序指的是各种程序,包括操作系统标准包含的命令和实用程序。这些程序通过调用库函数和系统调用运行。让我们了解它们之间的区别。

“库”安装在 /lib64/usr/lib 中。如果使用 nm 命令显示 glibc 的符号信息,您会看到它包含 printf()。符号信息指的是库或可执行程序中包含的函数和变量。

printf() 根据给定的参数操作,必要时向内核发出指令。

$ rpm -qf /lib64/libc.so.6
glibc-2.34-60.0.3.el9.x86_64

$ nm /lib64/libc.so.6 | grep "T printf"
000000000006f430 T printf
000000000006e8f0 T printf_size
000000000006f350 T printf_size_info

“系统调用”提供了操作硬件的功能,例如文件输入/输出、新进程创建、网络通信等。在图 8 中,系统调用直接从应用程序调用。然而,它也可以通过 glibc 中包含的系统调用包装函数调用。

您读到这里了吗?您可以看到像 glibc 这样的库非常重要。因此,基于 RHEL 的发行版在主要版本更改之前不会更改 glibc 版本。

内核模式和用户模式

描述 内核模式用户模式

访问硬件资源的程序,例如内核和设备驱动程序,以称为“内核模式”的特殊权限模式运行。它们在单一、隔离的内存空间中运行,利用 CPU 的保护功能,并且由于不需要上下文切换,运行速度非常快。内核不仅运行每个进程,还提供对硬件的受保护访问。

相比之下,普通程序在称为“用户模式”的内存空间中运行。在用户模式下运行的程序无法直接访问硬件。相反,它们通过系统调用访问内核功能,最终由内核访问硬件。

基础知识总结

让我们简要总结迄今为止介绍的 Linux 内部基础知识。

  • 内核和 glibc 都是 Linux 的重要组件,但它们的作用不同
  • 内核负责控制硬件。
  • 库为普通程序提供使用的函数。最重要的库是 glibc。
  • 要访问硬件,需要进行系统调用。
  • 程序通过系统调用或库函数访问硬件。

容器的工作原理

接下来,我们将解释容器。您可能在解释内核后会想,“为什么是容器?”这是因为理解容器的工作原理是理解内核兼容性的一个好主题。

容器结构

下图比较了基于虚拟机管理程序和基于容器的虚拟化:虚拟机具有客户操作系统和内核,而容器只包含应用程序和库,但没有内核。

图 9 虚拟机管理程序类型与容器类型的区别

容器不需要内核的原因是它使用主机操作系统中的内核。尽管容器使用 cgroups 和 Namespace 等 Linux 功能来隔离容器,但它们只是主机操作系统上运行的进程。参见下图。如果容器包含运行应用程序所需的库和程序,它将运行。

图 10 容器的工作原理

Linux 内核兼容性

这里有一个重要的点。

即使创建容器映像的操作系统与主机操作系统的 Linux 版本不同,它也能运行。

例如,假设运行容器引擎的主机操作系统是 Ubuntu Server 22.04 LTS。在这种情况下,即使容器映像使用 Oracle Linux 9 创建,只要包含必要的库和二进制文件,它也能运行。虽然两者都需要是 Linux,但即使 Linux 内核版本略有不同,它们也能工作。

然而,这是一个技术上是否可行的问题,与供应商是否提供技术支持无关。

图 11 Linux 内核兼容性

让我更详细地解释一下。看看下面的图 12。Linux 中应用程序与内核之间的接口称为应用程序二进制接口 (ABI)。Linux 内核在开发时考虑了兼容性,以便可以按照相同规格调用以前版本中存在的系统调用。因此,即使 Linux 内核版本略有不同,应用程序的行为也将相同。

图 12 通过应用程序二进制接口维持兼容性

应用程序二进制接口 (ABI)

ABI 是一个接口定义,具体来说是系统调用名称、参数数据类型、参数数量、返回值数据类型和值等。Linux 内核的开发确保这些不会改变。如果 ABI 不变,调用系统调用时就不会出错。

然而,如果内核版本不同,系统调用的内部实现可能不同。但是,系统调用是对硬件的原始指令,例如“将数据写入磁盘”或“分配内存”。因此,外部行为也被设计为相同的。这就是兼容性如何维持的。

图 13 通过 ABI 维持的兼容性

需要注意的不兼容性

另一方面,您应该注意哪些不兼容性?看看下面的图 14。这些是设备驱动程序等内核模块。即使内核版本号匹配,如果末尾的发布号不同,它们也可能无法工作。一些内核模块可以吸收发布号的细微差异,但建议重新编译。

虽然与内核无关,但在应用程序兼容性方面需要注意的一件事是语言、框架等使用的库。库经常更新,通常会有诸如 XXX 库 2.0 或更高版本的限制。

图 14. 内核模块不兼容性

比较 UEK 和 RHCK

现在我们已经介绍了基础知识,终于可以进入比较的主题:兼容性和功能。

与 RHCK 的兼容性

这是关于 UEK 和 RHCK 之间的兼容性。如果您读到这里,您可能已经知道。UEK 被开发为与 RHCK 保持 ABI 兼容性。因此,如果是在用户模式下运行的普通应用程序,它是兼容的。

然而,有几点需要注意。

商业软件产品的支持
第一点是商业软件产品是否受支持。即使商业软件产品支持 Oracle Linux,它可能支持 RHCK 但不支持 UEK。事实上,在用户模式下运行的应用程序通常没有问题,但如果您想优先考虑供应商的支持政策,请使用 RHCK。

需要注意兼容性的商业软件示例之一是防病毒产品。一些防病毒产品作为内核模块运行,因此在这种情况下,您需要检查它们是否兼容。

日本软件的选择不多,但您可以在 Oracle Linux ISV 目录 中检查 Oracle Linux 兼容性。

使用知名制造商的服务器时
最需要注意的是 Oracle Linux 是否包含在支持的硬件列表中。如果制造商不支持,出现问题时他们很可能无法帮助您。

此外,由于服务器机器配备了特殊硬件,例如 RAID 控制器和 NIC,制造商可能提供自己的设备驱动程序。如果驱动程序不受支持,您可能无法使用它们。

检查制造商的网页或 Oracle Linux 硬件认证列表,其中还包括有关 RHCK 和 UEK 支持的信息。

功能差异

很难概括功能的差异,因为它们因内核版本而异,但一般来说,UEK 基于较新的主线内核,因此具有更好的性能和更多功能。

例如,在 Oracle Linux 9 中,UEK7 的基础版本是 5.15.0,而 RHCK 的基础版本是 5.14.0。此时差异不大。然而,如下表所示,即使在同一主要版本内,UEK 也会发生变化。几年后,UEK8 将为 Oracle Linux 9 发布,内核版本的差异将扩大。

Linux 版本 UEK4 UEK5 UEK6 UEK7
Oracle Linux 9 × × ×
Oracle Linux 8 × ×
Oracle Linux 7 ×

UEK 独有的知名功能包括 ocfs2 和 btfs。还有其他功能,但详情请参阅“Unbreakable Enterprise Kernel 发行说明”中的“新功能和更改”。

图 15. Unbreakable Enterprise Kernel 7 版发行说明

总结:何时使用 UEK 或 RHCK?

UEK 专为大规模 Oracle 数据库和 Oracle Linux KVM 工作负载设计,基于较新的内核,这意味着它通常提供更好的性能和功能。

然而,UEK 并非绝对必要。我认为您应该根据情况和目的使用它们。在以下情况 1 和 2 中,您应该考虑使用 RHCK。重要的是理解 UEK 和 RHCK 的区别并适当使用它们。我还将介绍一个总结我迄今为止解释内容的表格。

  1. 如果您使用的是物理服务器,并且制造商仅支持 RHCK
    使用 RHCK。
  2. 如果您使用的是商业软件,并且供应商仅支持 RHCK
    最好使用 RHCK。然而,如果您在自己的系统上使用并能承受风险,UEK 也是一个选择。

UEK 与 RHCK 的优缺点

项目 优点 缺点
功能和性能 根据您比较的 UEK 和 RHCK 版本,UEK 可能具有更好的功能和性能,因为它使用较新的主线内核,并且可能对 Oracle 数据库进行了优化。
在用户模式下运行的应用程序兼容性 兼容 对于商业封装产品,根据供应商的支持政策,可能无法获得支持。
在内核模式下运行的内核模块 以源代码形式提供的设备驱动程序等可能兼容 在内核模式下运行的防病毒软件和设备驱动程序通常不兼容。
其他 知名制造商的服务器可能支持 Oracle Linux (RHCK) 但不支持 UEK。