Гид по технологиям

Как скомпилировать ядро — способ Fedora

• 8 min read • Linux • Обновлено 22 Nov 2025
Сборка ядра на Fedora — инструкция
Сборка ядра на Fedora — инструкция

Version 1.0
Author: Falko Timme

Краткое введение

Каждая дистрибуция предоставляет свои инструменты для сборки кастомного ядра из исходников. В этой статье показан способ сборки ядра на системах Fedora. Мы используем «ванильные» исходники с www.kernel.org, чтобы не зависеть от поставляемых дистрибутивом ядер. Также показано, как применять патчи к исходникам.

Протестировано на Fedora Core 6. Это не единственный возможный подход — существует много других. Автор не даёт гарантий, что всё сработает в вашей среде.

Важно: большинство команд можно запускать от root. Если вы предпочитаете работать как непривилегированный пользователь, добавьте своего пользователя в /etc/sudoers (см. далее).

Содержание

  • Предварительная заметка
  • Сборка RPM-пакета ядра (Fedora-way)
    • Создание rpmbuild каталога
    • Загрузка и установка src.rpm Fedora
    • Применение патчей и правки spec-файла
    • Прописание идентификатора ядра
    • Конфигурация
    • Сборка RPM
    • Установка и initrd
  • Отладка и откат
  • Чек-листы и методология
  • Критерии приёмки
  • Роль-based чек-листы
  • Глоссарий и часто встречающиеся ошибки
  • Сводка

1 Предварительная заметка

Я опишу два способа сборки ядра для Fedora. Первый — специфичный для Fedora: в результате вы получите RPM-пакет, который можно установить или передать коллегам. Второй способ — универсальный для любых дистрибутивов, но не создаёт RPM.

Если вы хотите запускать команды без постоянного входа под root, добавьте вашего пользователя (например tom) в /etc/sudoers. Отредактируйте sudoers с помощью безопасной утилиты:

visudo

Добавьте строку:

tom  ALL=(ALL) ALL

После этого команды, требующие прав root, нужно будет запускать с sudo, например:

sudo yum install fedora-rpmdevtools unifdef

Важно: если вы выполняете все команды как root, sudo не нужен.

2 Сборка RPM-пакета ядра

Этот раздел показывает, как собрать ядро и получить RPM-пакет для установки и распространения.

2.1 Создаём rpmbuild каталог

Выполните следующие команды, чтобы подготовить среду rpmbuild в домашнем каталоге:

cd ~
cp -a /usr/src/redhat/ rpmbuild
echo '%_topdir %(echo $HOME)/rpmbuild' >> .rpmmacros

Установите пакеты, необходимые для сборки RPM:

yum install fedora-rpmdevtools unifdef

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

fedora-buildrpmtree

2.2 Загрузка и установка src.rpm ядра Fedora

Найдите src.rpm для вашей версии Fedora в каталоге исходников. Для Fedora Core 6 это, например, каталог:

http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/

Пример (для FC6):

cd /usr/src
wget http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/kernel-2.6.18-1.2798.fc6.src.rpm
rpm -ivh kernel-2.6.18-1.2798.fc6.src.rpm

Вы можете увидеть предупреждения вида:

warning: user brewbuilder does not exist - using root
warning: group brewbuilder does not exist - using root

— их можно игнорировать.

Этот src.rpm включает исходники ядра 2.6.18 и множество патчей Fedora, в том числе патч для 2.6.18.1. Если вы продолжите без изменений, собранный пакет будет соответствовать версии 2.6.18.1.

2.3 Применение патчей к ядру

Если вы хотите, например, собрать ядро 2.6.18.2, замените в исходном наборе соответствующий патч.

cd ~/rpmbuild/SOURCES/
wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.18.2.bz2

Примечание: можно использовать prepatch (например testing/patch-2.6.19-rc5.bz2), но prepatch следует применять к предыдущему полноценному релизу (см. документацию kernel.org про prepatches).

Теперь отредактируйте spec-файл, чтобы он ссылался на ваш новый файл патча:

cd ~/rpmbuild/SPECS/
vi kernel-2.6.spec

Найдите строку:

Patch1: patch-2.6.18.1.bz2

и замените её на:

Patch1: patch-2.6.18.2.bz2

Сохраните и выполните подготовительный шаг rpmbuild:

rpmbuild -bp kernel-2.6.spec

Если нужно целевую архитектуру, укажите –target, например:

rpmbuild -bp --target=i686 kernel-2.6.spec

Что делать, если Fedora-патчи не применяются

Код Fedora содержит много доп. патчей. Некоторые из них не совместимы с выбранным вами патчем ядра. В выводе сборки вы увидите сообщения вроде:

+ echo 'Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):'
Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):
+ patch -p1 -s
Reversed (or previously applied) patch detected! Assume -R? [n]
Apply anyway? [n]
1 out of 1 hunk ignored -- saving rejects to file drivers/block/DAC960.c.rej
error: Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)

RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)

В этом случае откройте kernel-2.6.spec и закомментируйте соответствующий патч, например:

vi kernel-2.6.spec

Найдите и измените фрагмент на:

[...]
#Patch300: linux-2.6-ppc-dac960-ipr-clash.patch
[...]
#%patch300 -p1
[...]

Запустите rpmbuild снова. Повторяйте этот процесс до тех пор, пока все применяемые патчи не пройдут успешно.

Важно: комментировать патчи следует осознанно — отключение патча может убрать исправление специфичной для Fedora функциональности. Если патч важный, изучите его содержимое и решите, как интегрировать изменения вручную.

2.4 Указание строки идентификации ядра

Чтобы впоследствии отличать своё ядро, пропишите EXTRAVERSION в Makefile:

cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i386
vi Makefile

В строке EXTRAVERSION добавьте описатель, например:

EXTRAVERSION = -custom-2.6.18.2

Это добавит ваш идентификатор в имя собранного ядра и в вывод uname -r.

2.5 Конфигурация ядра

Запустите меню конфигурации:

make menuconfig

В меню выберите Load an Alternate Configuration File и укажите .config как файл конфигурации. После этого пройдитесь по разделам и внесите нужные изменения. При выходе сохраните конфигурацию (ответьте Yes на вопрос «Do you wish to save your new kernel configuration?»).

Экран меню конфигурации ядра: выбор альтернативного файла конфигурации

Навигация по меню config и сохранение

Подтверждение сохранения файла конфигурации

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

2.6 Сборка RPM

Запустите сборку RPM-ов ядра:

make rpm

После успешной сборки пакеты появятся в каталоге ~/rpmbuild/SRPMS/ (src.rpm) и в ~/rpmbuild/RPMS// (бинарные RPM). Например:

  • ~/rpmbuild/SRPMS/kernel-2.6.18custom2.6.18.2-1.src.rpm
  • ~/rpmbuild/RPMS/i386/kernel-2.6.18custom2.6.18.2-1.i386.rpm

2.7 Установка нового ядра

Перейдите в каталог с собранным RPM и установите пакет:

cd ~/rpmbuild/RPMS/i386
rpm -ivh kernel-2.6.18custom2.6.18.2-1.i386.rpm

Создайте initrd (ramdisk), чтобы система могла загрузиться с новым ядром:

mkinitrd /boot/initrd-2.6.18-custom-2.6.18.2.img 2.6.18-custom-2.6.18.2

Отредактируйте /boot/grub/menu.lst. Скопируйте рабочий stanza и замените kernel и initrd на новые. Добавьте новый stanza выше других, чтобы он был по умолчанию.

vi /boot/grub/menu.lst

Пример старого stanza (до изменений):

| # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Fedora Core (2.6.18-1.2798.fc6) root (hd0,0) kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-1.2798.fc6.img |

И пример после добавления нового stanza:

| # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Fedora Core (2.6.18-custom-2.6.18.2) root (hd0,0) kernel /vmlinuz-2.6.18-custom-2.6.18.2 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-custom-2.6.18.2.img title Fedora Core (2.6.18-1.2798.fc6) root (hd0,0) kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18-1.2798.fc6.img |

Узнать точные имена vmlinuz и initrd можно командой:

ls -l /boot

Перезагрузите систему:

shutdown -r now

Проверьте версию ядра после загрузки:

uname -r

Ожидаемый вывод, например:

2.6.18-custom-2.6.18.2

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

Сообщение об ошибке загрузки или пауза в GRUB, откуда можно войти в меню

Меню GRUB: выбор ядра для загрузки

После успешной загрузки с рабочим ядром удалите stanza с нерабочим ядром из /boot/grub/menu.lst.

Отладка и распространённые ошибки

  • Проблема: что-то не применяется при %prep (Reversed patch detected).
    Решение: закомментируйте проблемный PatchN в spec-файле или вручную интегрируйте изменения.

  • Проблема: при загрузке новый initrd не найден.
    Решение: проверьте правильность имени файла и путь в menu.lst; проверьте содержимое /boot.

  • Проблема: отсутствует драйвер доступа к диску и система не монтирует корневой раздел.
    Решение: убедитесь, что нужные драйверы встроены в ядро (built-in) или включены в initrd.

  • Проблема: ядро компилируется, но модуль не загружается.
    Решение: проверьте dmesg и /var/log/messages для ошибок и несовместимости модулей.

Важно: всегда держите рабочее ядро в GRUB, пока не убедитесь, что новое ядро стабильно загружается и корректно работает.

Мини-методология: как системно подойти к сборке

  1. Определите цель сборки: плоский патч, новый драйвер, отказ от проприетарных патчей или тестирование prepatch.
  2. Подготовьте среду (rpmbuild, зависимости, исходники).
  3. Скопируйте рабочую .config, внесите минимальные необходимые изменения.
  4. Соберите и тестируйте локально (виртуальная машина предпочтительна).
  5. Сделайте резервную копию /boot и списка GRUB.
  6. Установите пакет и проверьте загрузку; при проблемах используйте откат.

Эта упрощённая методология снижает риск выхода системы из строя и ускоряет итерации.

Роль-based чек-листы

Чек-лист для root/engineer:

  • Установлены fedora-rpmdevtools, unifdef и прочие зависимости.
  • Подготовлен rpmbuild (копия /usr/src/redhat/).
  • Загружен и установлен корректный src.rpm.
  • Применён/заменён патч на нужную версию.
  • Отредактирован kernel-2.6.spec, закомментированы конфликтные патчи.
  • В Makefile прописан EXTRAVERSION.
  • Сконфигурировано ядро (make menuconfig) и сохранено .config.
  • Собран RPM (make rpm) и проверено наличие пакетов в ~/rpmbuild.
  • Создан initrd и обновлён /boot/grub/menu.lst.
  • Выполнена перезагрузка и проверка uname -r.

Чек-лист для оператора/менеджера релиза:

  • Получен и проверен RPM от инженера.
  • Проверено соответствие версии и EXTRAVERSION.
  • Подтверждена совместимость с оборудованием/виртуальной средой.
  • План отката протестирован и задокументирован.

Критерии приёмки

  • Ядро успешно загружается в требуемой среде (физически/виртуально).
  • Команды uname -r и lsmod показывают ожидаемое имя и модули.
  • Все критичные сервисы стартуют и функционируют (например, сеть, хранилище, мониторинг).
  • Нет критичных ошибок в dmesg и системных логах в течение тестовой фазы (например, 10–30 минут под нагрузкой).
  • Существует работоспособный план отката и доступ к предыдущему kernel stanza в GRUB.

Короткий план отката / инцидентный руктбук

  1. При неудачной загрузке — войдите в GRUB, выберите старое рабочее ядро.
  2. Если вы уже загрузились, но система нестабильна — немедленно откатите RPM:
rpm -e --nodeps kernel-2.6.18custom2.6.18.2-1

(Убедитесь, что у вас есть другой установленный рабочий kernel в системе.)

  1. Удалите нерабочий stanza из /boot/grub/menu.lst и обновите конфигурацию загрузчика, если требуется.
  2. Проанализируйте логи (/var/log/messages, dmesg) и воспроизведите проблему в тестовой среде.
  3. Внесите исправления в конфигурацию/патчи и повторите цикл сборки.

Частые ошибки и способы их устранения (Edge-case gallery)

  • Ошибка: «Bad exit status from /var/tmp/rpm-tmp…»
    Устранение: найдите, какой патч завершился с ошибкой, и либо закомментируйте его в spec, либо адаптируйте вручную.

  • Ошибка: отсутствуют необходимые заголовки/библиотеки для сборки.
    Устранение: установите пакеты devel (например kernel-devel, gcc, make, ncurses-devel и пр.).

  • Ошибка: initrd не содержит нужных модулей.
    Устранение: пересоздайте initrd, убедитесь, что нужные модули либо встроены в ядро, либо добавлены в initrd.

  • Ошибка: несовместимость архитектур (собираете i386 на x86_64 или наоборот).
    Устранение: укажите –target при rpmbuild или настройте окружение сборки правильно.

Краткие определения (1-line glossary)

  • rpmbuild: утилита для сборки RPM-пакетов из spec-файлов.
  • src.rpm: пакет исходников RPM, содержит spec-файл и исходники/патчи.
  • EXTRAVERSION: поле Makefile ядра, добавляющее суффикс к версии ядра.
  • initrd (initramfs): начальный ramdisk, используемый загрузчиком для инициализации до монтирования корня.

Контрольные тесты / критерии приёмки (тест-кейсы)

  • Тест 1: сборка прошла без ошибок и в каталоге rpmbuild появились RPM.
    Критерий приёмки: exit-code 0 у make rpm; пакеты видны в ~/rpmbuild/RPMS.

  • Тест 2: установка RPM и создание initrd.
    Критерий приёмки: файл initrd создан, rpm установлен без конфликтов.

  • Тест 3: загрузка и проверка uname -r.
    Критерий приёмки: uname -r показывает EXTRAVERSION.

  • Тест 4: проверка основных сервисов.
    Критерий приёмки: сеть, файловые системы и критичные демоны запускаются корректно.

Decision tree (простая схема выбора подхода)

flowchart TD
  A[Нужно собрать ядро?] --> B{Цель}
  B -->|Создать RPM и распространить| C[Следовать Fedora-way 'rpmbuild']
  B -->|Тестировать локально, без RPM| D[Собрать напрямую из исходников 'make && make modules_install']
  C --> E{Есть конфликтные Fedora-патчи?}
  E -->|Да| F[Закомментировать патчи или интегрировать вручную]
  E -->|Нет| G[Собрать RPM]
  D --> H[Собрать и загрузить в VM]
  F --> G
  G --> I[Установить RPM и протестировать]
  I --> J{Успешно загрузилось?}
  J -->|Да| K[Выполнить нагрузочное тестирование]
  J -->|Нет| L[Откат в GRUB и анализ логов]

Советы по безопасности и приватности

  • Не публикуйте содержимое /boot/ и конфигурации с секретными путями.
  • При работе с патчами избегайте включения приватного кода в общие исходники без проверки лицензий.

Сводка

Сборка собственного ядра на Fedora позволяет вам контролировать версию, добавлять или убирать патчи и распространять готовые RPM. Процесс включает подготовку rpmbuild, замену или добавление нужных патчей, конфигурацию ядра, сборку RPM, создание initrd и обновление конфигурации загрузчика. Всегда держите рабочее ядро в GRUB и имейте план отката.

Важно: тестируйте в виртуальной среде перед разворачиванием в проде и фиксируйте изменения в spec/Makefile для повторяемости.


Ключевые команды (шпаргалка):

visudo
cp -a /usr/src/redhat/ rpmbuild
echo '%_topdir %(echo $HOME)/rpmbuild' >> .rpmmacros
yum install fedora-rpmdevtools unifdef
fedora-buildrpmtree
rpm -ivh kernel-.src.rpm
rpmbuild -bp kernel-2.6.spec
make menuconfig
make rpm
rpm -ivh ~/rpmbuild/RPMS//kernel-*.rpm
mkinitrd /boot/initrd-.img 
shutdown -r now
uname -r

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро