Установка 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-headers | kernel-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 8 | 4.18.0-553.89.1.el8_10.x86_64 |
| Rocky 9 | 5.14.0-611.16.1.el9_7.x86_64 |
| Rocky 10 | 6.12.0-124.21.1.el10_1.x86_64 |
Как читать:
4.18.0/5.14.0/6.12.0— версия ядра Linuxel8_10/el9_7/el10_1— версия Rocky Linuxx86_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— очищает кэш DNFdnf 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
- Если для разработки — теперь можете компилировать модули