Как скомпилировать ядро — способ SuSE
Версия 1.0
Автор: Falko Timme
Важно: это не единственный способ собрать ядро. Описанный подход даёт вам RPM-пакет ядра, что удобно для установки и распространения, но не гарантирует успешной сборки во всех средах.
1 Предварительная заметка
Цель этого руководства — собрать RPM-пакет ядра из не изменённых исходников с www.kernel.org (так называемое vanilla kernel), чтобы вы были независимы от ядер, поставляемых вашей дистрибуцией. Также показано, как применять патчи к исходникам, если вам нужны функции, отсутствующие в официальном релизе.
Я тестировал процесс на SuSE 10.1. Если у вас другая версия SuSE, некоторые пути и скрипты могут отличаться.
Важно: сохраните резервные копии конфигураций и текущего загружаемого ядра перед началом. Если система критична, проводите сборку и тестирование на отдельной машине или VM.
2 Установка пакетов, необходимых для сборки ядра
Для работы меню конфигурации ядра требуется ncurses-devel. Установите пакет так:
yast -i ncurses-develДалее нужно модифицировать несколько скриптов RPM, иначе при сборке вы можете получить ошибку типа:
/usr/lib/rpm/find-requires.ksyms: line 12: /usr/bin/nm: Argument list too longЕсли это произойдёт, RPM не сможет корректно определить зависимости, и установка собранного RPM завершится неудачей.
Сначала создайте резервные копии скриптов:
cp /usr/lib/rpm/find-provides.ksyms /usr/lib/rpm/find-provides.ksyms_orig
cp /usr/lib/rpm/find-requires.ksyms /usr/lib/rpm/find-requires.ksyms_orig
cp /usr/lib/rpm/find-supplements.ksyms /usr/lib/rpm/find-supplements.ksyms_origОткройте каждый из этих скриптов и замените строку с шаблоном package name kernel-) на kernel). То есть замените строку
#kernel-*) is_kernel_package=1 ;;на
kernel*) is_kernel_package=1 ;;Пример редактирования:
vi /usr/lib/rpm/find-provides.ksymsСодержимое (фрагмент):
[...]
#kernel-*) is_kernel_package=1 ;;
kernel*) is_kernel_package=1 ;;
[...]Аналогично для остальных двух файлов:
vi /usr/lib/rpm/find-requires.ksyms[...]
#kernel-*) is_kernel_package=1 ;;
kernel*) is_kernel_package=1 ;;
[...]vi /usr/lib/rpm/find-supplements.ksyms[...]
#kernel-*) is_kernel_package=1 ;;
kernel*) is_kernel_package=1 ;;
[...]Примечание: комментарий «#kernel-)» мог быть закомментирован в оригинальном скрипте; замена на «kernel)» делает правило более общим и предотвращает проблему с очень длинным списком символов при вызове nm.
3 Скачивание исходников ядра
Загрузите желаемую версию ядра в /usr/src. Перейдите на www.kernel.org и выберите нужный tarball, например linux-2.6.18.2.tar.bz2 (все 2.6-ядра доступны в каталоге http://www.kernel.org/pub/linux/kernel/v2.6/).
Пример загрузки в /usr/src:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.2.tar.bz2Распаковка и создание символической ссылки:
tar xjf linux-2.6.18.2.tar.bz2
ln -s linux-2.6.18.2 linux
cd /usr/src/linuxСовет: используйте симлинк linux, чтобы в дальнейшем вносить изменения по одному и тому же пути, независимо от точной версии.
4 Применение патчей к исходникам ядра (опционально)
Иногда требуется поддержка драйверов или экспериментальных функций, которые ещё не включены в официальный релиз. В этом случае вы можете применить патч к исходникам. Предположим, патч скачан в /usr/src и называется patch.bz2. Перейдите в каталог исходников (/usr/src/linux) и выполните тестовую команду, затем реальную.
Тест (не изменяет файлы):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-runЕсли тест не показывает ошибок — примените патч:
bzip2 -dc /usr/src/patch.bz2 | patch -p1Если патч в формате gzip (.gz), используйте:
gunzip -c /usr/src/patch.gz | patch -p1 --dry-run
gunzip -c /usr/src/patch.gz | patch -p1Перед применением патча всегда делайте dry-run. Если появились конфликты, разберитесь в них вручную: иногда необходимо подправить контекст или убедиться в соответствии версий.
Пример: применение prepatch (rc) к предыдущему релизу
Если вам нужна функция из ядра 2.6.19-rc6, но полного исходника ещё нет, скачайте prepatch patch-2.6.19-rc6.bz2 и примените его к исходникам 2.6.18 (не к 2.6.18.1 или 2.6.18.2). Пример:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1Пояснение: prepatch — это аналог альфа-релизов. Их следует применять к исходникам предыдущего полного релиза с трёхчастным номером версии.
5 Конфигурирование ядра
После распаковки или применения патчей вам нужно настроить конфигурацию ядра. Используйте make menuconfig для интерактивной настройки (ncurses должен быть установлен):
make menuconfigСоветы по конфигурированию:
- Сохраните конфигурацию в .config в корне исходников.
- Если вы хотите использовать текущую конфигурацию установленного ядра как базу, скопируйте её: /boot/config-$(uname -r) -> /usr/src/linux/.config, затем выполните make oldconfig или make menuconfig.
- Выберите модульную загрузку драйверов (M) там, где это уместно — это уменьшит размер встроенного ядра и упростит отладку.
Примеры команд для использования текущей конфигурации:
cp /boot/config-$(uname -r) /usr/src/linux/.config
cd /usr/src/linux
make oldconfig
make menuconfig6 Сборка RPM-пакета ядра
На SuSE принято собирать ядро в RPM-пакет. Для этого в большинстве случаев используется make rpm-pkg или соответствующий spec-файл. Общая последовательность:
- Убедитесь, что установлены инструменты разработки (gcc, make, rpm-build).
- В каталоге исходников выполните сборку и создание RPM:
make rpm-pkg(В зависимости от версии исходников и присутствия соответствующих правил в Makefile может потребоваться другой таргет — изучите Makefile и документацию в /usr/src/linux/README или в корне исходников.)
После успешной сборки RPM-пакеты окажутся в /usr/src/linux или в директории, указанной в Makefile (например, /usr/src/redhat/RPMS/).
Установка собранного RPM:
rpm -Uvh /path/to/kernel-.rpm После установки обновите конфигурацию загрузчика (GRUB/LILO) при необходимости и перезагрузите систему.
7 Отладка и распространённые ошибки
- Ошибка “Argument list too long” при вызове nm: см. раздел 2 — правка скриптов в /usr/lib/rpm.
- Конфликт патчей: применяйте patch –dry-run, исправляйте вручную или используйте quilt для управления набором патчей.
- Повреждённая конфигурация .config: используйте make mrproper, затем восстановите .config из /boot и выполните make oldconfig.
Если система не загружается после установки нового ядра, загрузитесь в старом ядре через меню загрузчика и откатите RPM:
rpm -qa | grep kernel
rpm -Uvh --oldpackage /path/to/old-kernel.rpm(или удалите проблемный пакет и установите старый)
Когда этот подход не сработает
- Если дистрибуция сильно модифицирует структуру RPM или использует собственные скрипты сборки, простая правка /usr/lib/rpm/* может быть недостаточной.
- На новых версиях SuSE пути и имена скриптов могут отличаться — адаптируйте команды.
- Если у вас защищённая система (например, строгий SELinux, кастомные политики), сборка и установка ядра могут требовать дополнительных шагов по безопасности.
Альтернативные подходы
- Использовать готовые kernel-source пакеты от производителя дистрибуции и собирать на их основе.
- Применять DKMS для сборки модулей отдельно от ядра.
- Использовать инструмент obs (Open Build Service) для сборки RPM в контролируемом окружении и кросс-репозиториях.
Контрольный список по ролям
Администратор:
- Сделал полный бэкап /boot и /etc/grub.conf
- Сохранил старый RPM ядра
- Убедился в наличии инструментов разработки
Разработчик драйверов:
- Выполнил dry-run патчей
- Протестировал сборку в VM
- Проверил загрузку и логи dmesg
Тестировщик:
- Проверил загрузку на разных аппаратных конфигурациях
- Проверил функциональность критичных сервисов
Критерии приёмки
- Собранный RPM успешно устанавливается без ошибок зависимостей.
- Система загружается с новым ядром и основные сервисы запускаются.
- Наличие логов dmesg без критических ошибок драйверов, необходимых для эксплуатации.
Краткий глоссарий (1 строка)
- vanilla kernel — исходный, не модифицированный релиз ядра с kernel.org.
- prepatch/rc — предварительный (релиз-кандидат) патч для тестирования новых функций.
- RPM — менеджер пакетов Red Hat, используемый в SuSE для установки пакетов.
Совместимость и советы по миграции
- Для перехода между версиями ядра проверяйте совместимость модулей сторонних производителей — иногда требуется перекомпиляция модулей.
- Если вы используете проприетарные драйверы (например, видеокарты), убедитесь, что они поддерживают target kernel API/ABI, или будьте готовы пересобирать/обновлять драйверы.
Полезные эвристики и модель принятия решений
- Если нужна только один-две экспериментальные функции — попробуйте собрать модуль отдельно.
- Если требуется стабильность в продакшене — используйте ядро дистрибуции или LTS-релизы.
- Если цель — контроль и переносимость между машинами SuSE — соберите RPM и храните его в локальном репозитории.
Резюме
- Установите ncurses-devel и нужные инструменты.
- Сделайте резервные копии содержимого /usr/lib/rpm и исправьте шаблон для kernel*.
- Скачайте нужный tarball ядра в /usr/src, распакуйте и настройте симлинк linux.
- При необходимости применяйте патчи двумя шагами: dry-run и реальное применение.
- Сконфигурируйте ядро (make menuconfig), соберите RPM и установите его.
Важно: всегда тестируйте новое ядро в безопасной среде и сохраняйте возможность отката. Если вы собираете ядро для нескольких машин, используйте RPM и репозиторий для упрощения распространения.
Дополнительные ресурсы: www.kernel.org — официальный источник исходников и описаний типов патчей.
Wichtig: если что-то пойдёт не так, загрузитесь в старое ядро через загрузчик и исправьте или удалите проблемный RPM.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента