Назад

2025/04/21

10. Понимание двух ядер Oracle Linux: “UEK” и “RHCK”

Oracle Linux имеет два ядра: Red Hat Compatible Kernel (RHCK), которое является совместимым с RHEL ядром, и собственное ядро 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, включая ошибки, при условии, что номер версии совпадает.

В следующей таблице показаны версии RHCK и glibc для каждой основной версии Oracle Linux. Чтобы подчеркнуть совместимость в рамках одной основной версии 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

На следующей диаграмме показаны имена RPM-пакетов для ядра и glibc. Когда выпускается обновленный пакет, базовая версия остается той же, а выпуск обновляется.

Рисунок 1. Версия и выпуск ядра/glibc

Что такое Unbreakable Enterprise Kernel?

Unbreakable Enterprise Kernel (UEK) — это уникальное для Oracle Linux ядро, которое основано на более новом ядре, чем RHCK, и совместимо с RHCK. Следующее руководство предоставляет справочную информацию о его функциях.

Официальная документация: Unbreakable Enterprise Kernel

Unbreakable Enterprise Kernel (UEK) — это ядро Linux, созданное Oracle и поддерживаемое через поддержку Oracle Linux. Его акцент делается на производительность, стабильность и минимальное использование обратного переноса, максимально приближаясь к основному исходному коду.

Руководство по установке базы данных для Linux

Unbreakable Enterprise Kernel включено и активировано по умолчанию в ядрах Oracle Linux. Оно основано на недавней стабильной версии основного ядра Linux и включает оптимизации, разработанные в сотрудничестве с командами Oracle Database, Oracle Middleware и Oracle Hardware Engineering для обеспечения стабильности и оптимальной производительности для самых требовательных корпоративных рабочих нагрузок.

Основные моменты:

  • UEK — это ядро Linux, разработанное и поддерживаемое Oracle.
  • Ядро по умолчанию в Oracle Linux
  • Основано на новой стабильной версии основного ядра Linux
  • Разработано в сотрудничестве с командами Exadata и Oracle Database, с акцентом на производительность и стабильность
  • Протестировано в средах с крупномасштабными корпоративными рабочими нагрузками, включая Exadata и Oracle Cloud Infrastructure

Связь 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 × ×

В следующей таблице сравниваются версии ядер RHCK и UEK для Oracle Linux. 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 было слишком большим, и принято увеличивать a, когда b достигает примерно 20. А 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)

Связь между mainline, longterm, stable и rc

Давайте взглянем на страницу официального ядра Linux, The Linux Kernel Archives. Там перечислены несколько версий ядра Linux с метками, такими как mainline, longterm, stable и rc. Я объясню каждую из них ниже.

Рисунок 6. Архивы ядра Linux

На следующей диаграмме показаны некоторые версии ядра, взятые с kernel.org, с добавленными комментариями. Mainline — это основная разработка. Как только становится доступен rc (релиз-кандидат), он становится официальной версией, поэтому mainline и stable относятся к одному и тому же состоянию. Среди стабильных версий раз в несколько версий они становятся долгосрочными и поддерживаются в течение длительного периода.

Рисунок 7. Жизненный цикл на kernel.org

Что такое обратный перенос?

Здесь есть слово, которое стоит запомнить: обратный перенос. Обратный перенос — это применение функций или исправлений, включенных в более новую версию программного обеспечения, к более старой версии программного обеспечения.

Например, применение нового патча, введенного в версии 6.0, к версии 5.0 называется обратным переносом. Обычно, чем больше разница между двумя версиями, тем больше различий в кодовой базе, что затрудняет применение. Также бывают случаи, когда ошибка, о которой идет речь, отсутствует в старой версии, что делает обратный перенос ненужным.

Некоторые могут задаться вопросом, что является противоположностью обратного переноса. Например, это случай применения исправления ошибки из версии программного обеспечения 5.0 к более новой версии 6.0. Я провел некоторое исследование, но общего термина нет, и кажется, что используются термины обратный перенос, слияние, прямой перенос и т.д. Кажется, что многие называют это обратным переносом без особых размышлений.

Следующий текст — это часть описания UEK, представленного в начале.

Его акцент делается на производительность, стабильность и минимальное использование обратного переноса, максимально приближаясь к основному исходному коду.

Учитывая то, что мы обсудили до сих пор, Oracle делает следующие утверждения:

  • Более новые исходные коды mainline с большей вероятностью обладают лучшей производительностью и стабильностью, поскольку они включают больше новых функций и исправлений ошибок.
  • Начало с более нового исходного кода mainline означает меньшие различия в исходном коде, поэтому требуется минимальное количество обратного переноса.

Основные знания о внутренней структуре Linux

Одна из самых важных вещей, которые нужно знать о UEK, — это его совместимость с ядром RHEL (RHCK). Для понимания совместимости необходимы знания о Linux OS. Поэтому мы объясним основы внутренней структуры Linux.

Основные компоненты Linux OS

На следующей диаграмме показаны основные компоненты Linux OS и их взаимосвязи. Важно запомнить эту информацию, чтобы понять Linux OS.

  • Ядро Linux
    Ядро — это основной компонент Linux OS. Оно получает запросы от приложений и выполняет управление процессами и памятью для выполнения программ. Оно также использует драйверы устройств, которые являются модулями ядра, для управления файловой системой и контроля устройств для ввода-вывода. Роль ядра можно кратко описать следующим образом. Лучше всего понимать его как функцию, действующую на аппаратное обеспечение.
    • Управление аппаратными ресурсами для процессора, памяти, диска, сетевых карт и т.д.
    • Управление и контроль процессов для приложений, работающих на Linux
  • Модули ядра
    Модули ядра — это бинарные файлы, которые расширяют функциональность ядра. В основном это драйверы устройств, и они находятся в формате, который можно загрузить при необходимости. Это позволяет поддерживать новое оборудование, просто добавляя драйверы, а также снижает использование памяти.
  • Системные библиотеки
    Системные библиотеки (или просто библиотеки) — это наборы функций, часто используемых программами, предоставляющие большую часть функциональности, обеспечиваемой операционной системой. Наиболее известной является glibc, стандартная библиотека C, используемая в Linux. Она называется glibc, потому что изначально была разработана GNU как GNU C Library.

Рисунок 8. Внутренняя структура Linux

Понимание основ (библиотечные функции и системные вызовы)

Приложения на Рисунке 8 относятся к различным программам, включая команды и утилиты, которые включены в стандартную поставку ОС. Эти программы работают, вызывая библиотечные функции и системные вызовы. Давайте разберемся в различиях между ними.

Библиотеки устанавливаются в /lib64 и /usr/lib. Если вы отобразите символьную информацию glibc с помощью команды nm, вы увидите, что она содержит 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 до смены основной версии.

Режим ядра и пользовательский режим

Описывает режим ядра и пользовательский режим.

Программы, которые обращаются к аппаратным ресурсам, такие как ядро и драйверы устройств, работают в специальном привилегированном режиме, называемом “режим ядра”. Они работают в едином изолированном пространстве памяти, использующем функции защиты процессора, и, поскольку не требуют переключения контекста, работают очень быстро. Ядро не только запускает каждый процесс, но и предоставляет защищенный доступ к оборудованию.

В отличие от этого, обычные программы работают в пространстве памяти, называемом “пользовательский режим”. Программы, работающие в пользовательском режиме, не могут напрямую обращаться к оборудованию. Вместо этого они обращаются к функциям ядра через системные вызовы, и ядро в конечном итоге обращается к оборудованию.

Краткое резюме базовых знаний

Давайте кратко подведем итоги основ внутренней структуры Linux, которые мы рассмотрели до сих пор.

  • И ядро, и glibc являются важными компонентами Linux, но у них разные роли
  • Ядро отвечает за управление оборудованием.
  • Библиотеки предоставляют функции, используемые обычными программами. Наиболее важная библиотека — glibc.
  • Для доступа к оборудованию необходимо выполнить системный вызов.
  • Программы обращаются к оборудованию через системные вызовы или библиотечные функции.

Как работают контейнеры

Далее мы объясним контейнеры. Вы можете задаться вопросом: “Почему контейнеры?” после объяснения ядра. Это потому, что понимание того, как работают контейнеры, — это хорошая тема для понимания совместимости ядра.

Структура контейнеров

На следующей диаграмме сравнивается виртуализация на основе гипервизора и контейнерная виртуализация: виртуальная машина имеет гостевую ОС и ядро, тогда как контейнер содержит только приложения и библиотеки, но не ядро.

Рисунок 9. Разница между типом гипервизора и типом контейнера

Причина, по которой ядро не требуется в контейнере, заключается в том, что он использует ядро хостовой ОС. Хотя контейнеры используют функции Linux, такие как cgroups и Namespace, для изоляции контейнеров друг от друга, они являются всего лишь процессами, работающими на хостовой ОС. См. следующую диаграмму. Контейнер будет работать, если он содержит библиотеки и программы, необходимые для запуска приложения.

Рисунок 10. Как работают контейнеры

Совместимость ядра Linux

Здесь есть нечто важное.

Это будет работать, даже если ОС, на которой создан образ контейнера, является другой версией Linux, чем хостовая ОС.

Например, предположим, что хостовая ОС, на которой работает контейнерный движок, — это Ubuntu Server 22.04 LTS. В этом случае, даже если образ контейнера создан с Oracle Linux audiobook, он будет работать, если включены необходимые библиотеки и бинарные файлы. Хотя оба должны быть Linux, они могут работать, даже если версии ядра Linux немного отличаются.

Однако это вопрос того, работает ли это технически, и не имеет ничего общего с тем, предоставляет ли поставщик техническую поддержку.

Рисунок 11. Совместимость ядра Linux

Позвольте мне объяснить немного подробнее. Посмотрите на Рисунок 12 ниже. Интерфейс между приложениями и ядром в системных вызовах Linux называется Application Binary Interface (ABI). Ядро Linux разрабатывается с учетом совместимости, чтобы системные вызовы, существующие в предыдущих версиях, могли вызываться с теми же спецификациями. Поэтому, даже если версия ядра Linux немного отличается, приложения будут работать одинаково.

Рисунок 12. Поддержание совместимости через Application Binary Interface

Application Binary Interface (ABI)

ABI — это определение интерфейса, в частности, имя системного вызова, тип данных аргументов, количество аргументов, тип данных возвращаемого значения и его значение и т.д. Ядро Linux разрабатывается так, чтобы эти параметры не изменялись. Если ABI не изменяется, при вызове системного вызова не будет ошибок.

Однако, если версия ядра отличается, внутренняя реализация системного вызова может быть разной. Однако системный вызов — это примитивная инструкция для оборудования, такая как “записать данные на диск” или “выделить память”. Поэтому внешнее поведение также делается одинаковым. Таким образом поддерживается совместимость.

Рисунок 13. Совместимость, поддерживаемая ABI

Несовместимости, на которые следует обратить внимание

С другой стороны, каких несовместимостей следует остерегаться? Посмотрите на Рисунок 14 ниже. Это модули ядра, такие как драйверы устройств. Даже если номера версий ядра совпадают, они могут не работать, если номера выпусков в конце различаются. Некоторые модули ядра могут поглощать небольшие различия в номерах выпусков, но рекомендуется перекомпиляция.

Хотя это не связано с ядром, одна вещь, на которую следует обратить внимание, когда речь идет о совместимости приложений, — это библиотеки, используемые в языках, фреймворках и т.д. Библиотеки часто обновляются, и часто встречаются ограничения, такие как библиотека XXX версии 2.0 или выше.

Рисунок 14. Несовместимость модулей ядра

Сравнение UEK и RHCK

Теперь, когда мы рассмотрели основы, мы наконец можем перейти к основной теме сравнения: совместимости и функций.

Совместимость с RHCK

Речь идет о совместимости между UEK и RHCK. Если вы прочитали до этого момента, вы, вероятно, уже знаете. UEK разработан для поддержания совместимости ABI с RHCK. Поэтому, если это обычное приложение, работающее в пользовательском режиме, оно совместимо.

Однако есть несколько моментов, на которые следует обратить внимание.

Поддержка коммерческих программных продуктов
Первый момент — поддерживается ли коммерческий программный продукт. Даже если коммерческий программный продукт поддерживает Oracle Linux, он может поддерживать RHCK, но не UEK. На самом деле, приложения, работающие в пользовательском режиме, обычно работают без проблем, но если вы хотите приоритетно учитывать политику поддержки поставщика, используйте RHCK.

Одним из примеров коммерческого программного обеспечения, требующего внимания к совместимости, являются антивирусные продукты. Некоторые антивирусные продукты работают как модули ядра, поэтому в этом случае необходимо проверить их совместимость.

Выбор японского программного обеспечения не так велик, но вы можете проверить совместимость с Oracle Linux в каталоге ISV Oracle Linux.

При использовании сервера от известного производителя
Самое важное, на что следует обратить внимание, — это включение Oracle Linux в список поддерживаемого оборудования. Если производитель не поддерживает его, велика вероятность, что они не смогут помочь вам в случае возникновения проблем.

Кроме того, поскольку серверные машины оснащены специальным оборудованием, таким как RAID-контроллеры и сетевые карты, производители могут предоставлять собственные драйверы устройств. Если драйверы не поддерживаются, вы не сможете их использовать.

Проверьте веб-страницу производителя или список сертификации оборудования Oracle Linux для получения информации о поддержке, который также включает информацию о поддержке RHCK и UEK.

Различия в функциях

Трудно обобщить различия в функциях, поскольку они варьируются в зависимости от версии ядра, но, в целом, UEK основан на более новом основном ядре, поэтому он обладает лучшей производительностью и большим количеством функций.

Например, в Oracle Linux 9 базовая версия UEK7 — 5.15.0, а базовая версия RHCK — 5.14.0. На данный момент разница невелика. Однако, как показано в следующей таблице, UEK изменяется даже в рамках одной основной версии. Через несколько лет для Oracle Linux 9 будет выпущен UEK8, и разница в версиях ядра увеличится.

Версия 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 Database и Oracle Linux KVM и основан на более новом ядре, что означает, что он часто предлагает лучшую производительность и функции.

Однако UEK не является абсолютной необходимостью. Я считаю, что их следует использовать в зависимости от ситуации и цели. В следующих случаях 1 и 2 следует рассмотреть использование RHCK. Важно понимать разницу между UEK и RHCK и использовать их соответствующим образом. Я также представлю таблицу, суммирующую то, что я объяснил до сих пор.

  1. Если вы используете физический сервер и производитель поддерживает только RHCK
    , используйте RHCK.
  2. Если вы используете коммерческое программное обеспечение и поставщик поддерживает только RHCK
    , лучше использовать RHCK. Однако, если вы используете его в своей системе и можете терпеть риски, UEK также является вариантом.

Преимущества и недостатки UEK по сравнению с RHCK

– –>
Элемент Преимущества Недостатки
Функции и производительность В зависимости от того, какие версии UEK и RHCK вы сравниваете, UEK, вероятно, будет иметь лучшие функции и производительность, поскольку использует более новое основное ядро, а также может иметь оптимизации для Oracle Database.
Совместимость приложений, работающих в пользовательском режиме Совместимо В случае коммерческих продуктов поддержка может быть недоступна в зависимости от политики поддержки поставщика.
Модули ядра, работающие в режиме ядра Драйверы устройств и т.д., предоставляемые в виде исходного кода, вероятно, будут совместимы Антивирусное программное обеспечение и драйверы устройств, работающие в режиме ядра, как правило, несовместимы.
Другое Серверы от известных производителей могут поддерживать Oracle Linux (RHCK), но не UEK.