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

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

• 6 min read • Linux • Обновлено 28 Nov 2025
Как скомпилировать ядро SuSE
Как скомпилировать ядро 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 menuconfig

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

На SuSE принято собирать ядро в RPM-пакет. Для этого в большинстве случаев используется make rpm-pkg или соответствующий spec-файл. Общая последовательность:

  1. Убедитесь, что установлены инструменты разработки (gcc, make, rpm-build).
  2. В каталоге исходников выполните сборку и создание 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.

Поделиться: 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 быстро