Как скомпилировать ядро — способ 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-buildrpmtree2.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?»).



Совет: если вы уже используете рабочую конфигурацию, начните с неё — это уберёт множество потенциальных проблем с отсутствующими драйверами.
2.6 Сборка RPM
Запустите сборку RPM-ов ядра:
make rpmПосле успешной сборки пакеты появятся в каталоге ~/rpmbuild/SRPMS/ (src.rpm) и в ~/rpmbuild/RPMS/
- ~/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 и выбрать старое рабочее ядро.


После успешной загрузки с рабочим ядром удалите stanza с нерабочим ядром из /boot/grub/menu.lst.
Отладка и распространённые ошибки
Проблема: что-то не применяется при %prep (Reversed patch detected).
Решение: закомментируйте проблемный PatchN в spec-файле или вручную интегрируйте изменения.Проблема: при загрузке новый initrd не найден.
Решение: проверьте правильность имени файла и путь в menu.lst; проверьте содержимое /boot.Проблема: отсутствует драйвер доступа к диску и система не монтирует корневой раздел.
Решение: убедитесь, что нужные драйверы встроены в ядро (built-in) или включены в initrd.Проблема: ядро компилируется, но модуль не загружается.
Решение: проверьте dmesg и /var/log/messages для ошибок и несовместимости модулей.
Важно: всегда держите рабочее ядро в GRUB, пока не убедитесь, что новое ядро стабильно загружается и корректно работает.
Мини-методология: как системно подойти к сборке
- Определите цель сборки: плоский патч, новый драйвер, отказ от проприетарных патчей или тестирование prepatch.
- Подготовьте среду (rpmbuild, зависимости, исходники).
- Скопируйте рабочую .config, внесите минимальные необходимые изменения.
- Соберите и тестируйте локально (виртуальная машина предпочтительна).
- Сделайте резервную копию /boot и списка GRUB.
- Установите пакет и проверьте загрузку; при проблемах используйте откат.
Эта упрощённая методология снижает риск выхода системы из строя и ускоряет итерации.
Роль-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.
Короткий план отката / инцидентный руктбук
- При неудачной загрузке — войдите в GRUB, выберите старое рабочее ядро.
- Если вы уже загрузились, но система нестабильна — немедленно откатите RPM:
rpm -e --nodeps kernel-2.6.18custom2.6.18.2-1(Убедитесь, что у вас есть другой установленный рабочий kernel в системе.)
- Удалите нерабочий stanza из /boot/grub/menu.lst и обновите конфигурацию загрузчика, если требуется.
- Проанализируйте логи (/var/log/messages, dmesg) и воспроизведите проблему в тестовой среде.
- Внесите исправления в конфигурацию/патчи и повторите цикл сборки.
Частые ошибки и способы их устранения (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 Важно: если вы работаете в корпоративной инфраструктуре, предварительно согласуйте сборку кастомного ядра с командой поддержки.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента