Установка kernel headers в Rocky Linux: полное руководство

Установка kernel headers в Rocky Linux 8/9/10: полное руководство с пояснением каждой команды. Разбираем главное: чем отличаются kernel-headers от kernel-devel, как установить точное соответствие версии ядра, почему без них не работает NVIDIA драйвер и VirtualBox. Диагностика ошибок «No match for argument», проверка через uname -r, чек-лист для DKMS. Для новичков — комментарии под каждой командой, для сисадминов — автоматизация и устранение проблем.
Для кого: новички, разработчики, сисадмины.
Что даст: понимание разницы между kernel-headers и kernel-devel, правильную установку, проверку и устранение ошибок.


1. Что такое kernel headers и зачем они нужны

Kernel headers — это заголовочные файлы ядра (файлы с расширением .h на C). Они описывают, как программы могут общаться с ядром Linux.

Зачем они нужны:

  • При компиляции программ, которые вызывают системные вызовы
  • При установке драйверов (NVIDIA, VirtualBox, ZFS)
  • При работе с DKMS (Dynamic Kernel Module Support)

Простая аналогия:
Ядро — это дом. kernel-headers — это чертежи входных дверей (чтобы знать, как войти). kernel-devel — это полный набор инструментов и материалов, чтобы построить новую комнату в доме (модуль ядра).


2. Главное: разница между kernel-headers и kernel-devel

Это самое важное в статье. Запомните раз и навсегда.

Характеристикаkernel-headerskernel-devel
Что содержитC-заголовки в /usr/include/linux/Полную инфраструктуру сборки в /usr/src/kernels/
Для чего нужноКомпиляция программ пользовательского пространстваКомпиляция модулей ядра (драйверов)
Должно ли совпадать с версией ядраНет (для ABI-совместимых программ). ДА (для сборки модулей ядра)Обязательно совпадать с uname -r
Размер~3 МБ~23 МБ + зависимости (GCC, make, perl)
Когда достаточно только егоРазработка обычных программ (без прямого доступа к ядру)Никогда — для модулей нужны оба пакета

🎯 Золотое правило

Если вы ставите NVIDIA драйвер, VirtualBox Guest Additions или любой DKMS-модуль — устанавливайте ОБА пакета: kernel-headers И kernel-devel, строго под вашу версию ядра.


3. Обновление системы перед установкой

sudo dnf upgrade --refresh -y

Что делает:

  • sudo — права администратора
  • dnf upgrade — обновляет все пакеты
  • --refresh — перечитывает метаданные репозиториев (не берёт из кэша)
  • -y — автоматическое подтверждение

Зачем: чтобы ваше ядро и репозитории были актуальны. Если ядро устарело — заголовки могут не найтись.


sudo reboot

Что делает: перезагружает систему

Зачем: если обновление установило новое ядро — нужно загрузиться именно в него, иначе версии не совпадут.


4. Проверка версии ядра

uname -r

Что делает: выводит версию текущего загруженного ядра

Зачем: именно под эту версию мы будем ставить заголовки.

Пример вывода для разных версий Rocky Linux:

ВерсияПример вывода uname -r
Rocky 84.18.0-553.89.1.el8_10.x86_64
Rocky 95.14.0-611.16.1.el9_7.x86_64
Rocky 106.12.0-124.21.1.el10_1.x86_64

Как читать:

  • 4.18.0 / 5.14.0 / 6.12.0 — версия ядра Linux
  • el8_10 / el9_7 / el10_1 — версия Rocky Linux
  • x86_64 — архитектура процессора

5. Установка kernel-headers

5.1 Простой способ (для большинства случаев)

sudo dnf install -y kernel-headers

Что делает: устанавливает последнюю доступную версию kernel-headers из репозитория

Зачем: для большинства задач (компиляция обычных программ) этого достаточно. Версия может немного отличаться от uname -r, и это нормально.


5.2 Точный способ (строго под ваше ядро)

sudo dnf install -y kernel-headers-$(uname -r)

Что делает:

  • $(uname -r) — подставляет версию вашего ядра
  • Устанавливает заголовки, которые точно соответствуют текущему ядру

Зачем: используется, когда простой способ выдал ошибку «No match for argument» или при сборке критически важных модулей.


6. Установка kernel-devel (для сборки модулей)

sudo dnf install -y kernel-headers kernel-devel

Что делает: устанавливает оба пакета сразу

Зачем: kernel-devel нужен для компиляции модулей ядра. Без него не установить NVIDIA драйвер или VirtualBox.

Что произойдёт:
DNF загрузит около 80–90 пакетов зависимостей (GCC, make, perl, binutils и др.). Это нормально.


sudo dnf install -y kernel-devel-$(uname -r)

Что делает: устанавливает kernel-devel строго под версию вашего ядра

Зачем: если у вас несколько версий ядра, эта команда гарантирует, что модули соберутся именно под текущую.


7. Проверка установки

7.1 Проверка через RPM

rpm -qa | grep -E '^kernel-headers|^kernel-devel'

Что делает:

  • rpm -qa — список всех установленных RPM-пакетов
  • grep -E '^kernel-headers|^kernel-devel' — фильтрует строки, начинающиеся с kernel-headers или kernel-devel

Зачем: убедиться, что пакеты установлены и их версии совпадают с uname -r.

Пример правильного вывода:

kernel-headers-6.12.0-124.21.1.el10_1.x86_64
kernel-devel-6.12.0-124.21.1.el10_1.x86_64

7.2 Проверка наличия заголовочных файлов

ls /usr/include/linux/ | head -10

Что делает:

  • ls /usr/include/linux/ — показывает файлы в каталоге заголовков
  • head -10 — выводит только первые 10 строк (чтобы не завалило экран)

Зачем: убедиться, что заголовки реально лежат в файловой системе.

Пример вывода:

a.out.h
acct.h
acrn.h
adb.h
adfs_fs.h
...

7.3 Проверка kernel-devel (самое важное для DKMS)

ls -d /usr/src/kernels/*/

Что делает: показывает каталоги с полными исходниками ядра

Зачем: kernel-devel создаёт каталог /usr/src/kernels/<версия>/. Если он есть — значит, всё установлено правильно.

Пример вывода:

/usr/src/kernels/6.12.0-124.21.1.el10_1.x86_64/

7.4 Команда для полной проверки (скопируйте и вставьте)

# 1. Проверяем версию ядра
uname -r

# 2. Смотрим, какие пакеты заголовков установлены
rpm -qa | grep -E 'kernel-headers|kernel-devel'

# 3. Проверяем, создан ли каталог исходников (признак работы kernel-devel)
ls -d /usr/src/kernels/*/

Что делает: выполняет три проверки подряд

Зачем: быстрая диагностика — сразу видно всё, что нужно.


8. Диагностика типичных проблем

❌ Ошибка: «No match for argument: kernel-headers-6.12.0-xxx»

dnf list kernel-headers --showduplicates

Что делает: показывает все доступные версии kernel-headers в репозитории

Зачем: убедиться, что заголовков под вашу версию ядра нет в репозитории.

Пример вывода:

Available Packages
kernel-headers.x86_64   6.12.0-124.8.1.el10_1    appstream
kernel-headers.x86_64   6.12.0-124.13.1.el10_1   appstream
kernel-headers.x86_64   6.12.0-124.21.1.el10_1   appstream

Что делать:

  • Если вашей версии нет в списке — обновите систему: sudo dnf upgrade --refresh
  • Если обновление не помогло — перезагрузитесь в более старую версию ядра (через Grub) и используйте её заголовки

❌ DKMS или драйвер не собирается с ошибкой «kernel source not found»

rpm -qa | grep -E 'kernel-headers|kernel-devel' && uname -r

Что делает: выводит установленные пакеты и текущую версию ядра рядом

Зачем: сравнить — совпадают ли версии.

Если не совпадают — исправляем:

sudo dnf install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r)

❌ Ошибка при установке: «nothing provides kernel-devel»

sudo dnf clean all
sudo dnf makecache

Что делает:

  • dnf clean all — очищает кэш DNF
  • dnf makecache — пересоздаёт кэш репозиториев

Зачем: иногда репозитории кэшируют старые данные, и свежие пакеты не видны.


9. Обновление и удаление

9.1 Обновление заголовков

sudo dnf upgrade -y kernel-headers kernel-devel

Что делает: обновляет только эти два пакета (не трогая всё остальное)

Зачем: когда вы обновили ядро, но не хотите обновлять всю систему.

После обновления ядра всегда делайте:

sudo dnf install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r)

9.2 Удаление заголовков

sudo dnf remove -y kernel-headers kernel-devel

Что делает: удаляет оба пакета и их зависимости, если они не нужны другим программам

Зачем: освободить место (около 100 МБ).

Проверка удаления:

rpm -qa | grep -E '^kernel-headers|^kernel-devel' || echo "✅ Пакеты успешно удалены"

⚠️ Предупреждение: удаление kernel-devel приведёт к тому, что DKMS-модули (например, драйвер NVIDIA) перестанут пересобираться при обновлении ядра. Удаляйте только если точно не используете.


10. Чек-лист: всё ли готово для сборки модулей

Скопируйте и выполните этот блок — он покажет, готовы ли вы к установке драйверов:

echo "=== 1. Версия ядра ==="
uname -r

echo "=== 2. Установленные пакеты заголовков ==="
rpm -qa | grep -E 'kernel-headers|kernel-devel'

echo "=== 3. Совпадение версий ==="
KERNEL_VER=$(uname -r)
HEADERS_VER=$(rpm -q --qf "%{VERSION}-%{RELEASE}.%{ARCH}" kernel-headers 2>/dev/null)
DEVEL_VER=$(rpm -q --qf "%{VERSION}-%{RELEASE}.%{ARCH}" kernel-devel 2>/dev/null)

if [[ "$KERNEL_VER" == "$HEADERS_VER" ]]; then
    echo "✅ kernel-headers совпадает с ядром"
else
    echo "❌ kernel-headers НЕ совпадает: $HEADERS_VER vs $KERNEL_VER"
fi

if [[ "$KERNEL_VER" == "$DEVEL_VER" ]]; then
    echo "✅ kernel-devel совпадает с ядром"
else
    echo "❌ kernel-devel НЕ совпадает или не установлен"
fi

echo "=== 4. Каталог исходников ==="
ls -d /usr/src/kernels/*/ 2>/dev/null || echo "❌ kernel-devel не установлен"

Идеальный результат: все пункты с ✅, и есть каталог /usr/src/kernels/....


Заключение

Теперь вы знаете:

ЧтоЗачем
kernel-headersДля компиляции обычных программ
kernel-develДля сборки модулей ядра (драйверов)
uname -rУзнать версию текущего ядра
dnf install kernel-devel-$(uname -r)Установить точное соответствие

Запомните главное правило:

Ставите драйвер NVIDIA или VirtualBox → sudo dnf install kernel-headers kernel-devel -y

Дальнейшие шаги:

  • Если вы ставили это для NVIDIA драйвера — переходите к инструкции по установке драйверов
  • Если для VirtualBox — ставьте Guest Additions
  • Если для разработки — теперь можете компилировать модули

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *