返回

2025/03/25

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 95.14.02.34
Oracle Linux 84.18.02.28
Oracle Linux 73.10.02.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 核心。其重點在於性能、穩定性和盡可能少的回溯(backports),方法是盡可能緊密地追蹤主線原始碼。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 7Oracle Linux 8Oracle Linux 9
UEK75.15.0×
UEK65.4.17×
UEK54.14.35××
UEK44.1.12××

下表比較了 Oracle Linux 的 RHCK 和 UEK 核心版本。Oracle Linux 9 於 2022 年發布,因此 RHCK 和 UEK 版本之間的差異很小。然而,由於 Oracle Linux 7 和 Oracle Linux 8 已發布一段時間,RHCK 和 UEK 版本之間的差異較大。

Linux 版本RHCKUEK
Oracle Linux 95.14.05.15.0
Oracle Linux 84.18.05.4.17, 5.15.0
Oracle Linux 73.10.04.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」,但實際上,大多數發行版是「ab0-z」,其中 c 是零。這不僅適用於 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 核心頁面,Linux 核心檔案。列出了多個 Linux 核心版本,標籤包括主線(mainline)、長期(longterm)、穩定(stable)和 rc。我將在下文解釋每一個。

圖 6 Linux 核心檔案

下圖顯示了從 kernel.org 摘錄的一些核心版本並添加了評論。主線是主要開發。一旦 rc(釋出版本候選)可用,它就成為正式版本,因此主線和穩定指的是同一狀態。在穩定版本中,每隔幾個版本會成為長期版本,並長期支援。

圖 7 kernel.org 上的生命週期

什麼是回溯(backporting)?

這裡有一個需要記住的詞:回溯(backporting)。回溯指的是將新版本軟體中包含的功能或修復應用到舊版本軟體上。

例如,將版本 6.0 中引入的新補丁應用到版本 5.0 稱為回溯。通常,兩個版本之間的差異越大,程式碼基礎的差異越大,應用起來就越困難。此外,有時舊版本中不存在該錯誤,因此回溯並不必要。

有些人可能想知道回溯的反義詞是什麼。例如,將軟體版本 5.0 的錯誤修復應用到較新的軟體版本 6.0 的情況。我做了一些研究,但沒有普遍的術語,似乎使用了回溯、合併、前移(forward-porting)等詞。許多人似乎不假思索地稱之為回溯。

以下文字是開頭介紹的 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 虛擬化管理程式型與容器型的區別

容器不需要核心的原因是它使用主機作業系統中的核心。雖然容器使用 Linux 功能(如 cgroups 和 Namespace)來隔離彼此,但它們只是運行在主機作業系統上的進程。請看下圖。只要容器包含運行應用程式所需的庫和程式,它就能運行。

圖 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 也會改變。幾年後,Oracle Linux 9 將發布 UEK8,核心版本的差異將擴大。

Linux 版本UEK4UEK5UEK6UEK7
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。