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

3. Сборка ядра традиционным способом

• 6 min read • Linux • Обновлено 25 Nov 2025
Сборка ядра Linux из исходников
Сборка ядра Linux из исходников

Введение

Этот раздел описывает альтернативный подход к сборке ядра, который можно применить на любой системе Linux. Здесь нет ничего специфичного для CentOS, поэтому в результате вы не получите пакет RPM — вы получите готовое ядро, установленное в /boot и добавленное в конфигурацию загрузчика (GRUB).

Важно: перед началом сделайте резервную копию важных данных и текущих конфигурационных файлов (/boot, /etc/grub/menu.lst или /boot/grub/grub.cfg, /etc/modprobe.conf и т. п.). По возможности выполняйте эксперимент в виртуальной машине или на тестовом хосте.

Содержание

  • Скачивание исходников
  • Правка /etc/modprobe.conf
  • Применение патчей (опционально)
  • Конфигурация ядра
  • Сборка и установка
  • Откат и отладка
  • Чек-листы, методология и сценарии приёма

3.1 Скачивание исходников ядра

Обычно исходники помещают в /usr/src. Перейдите на https://www.kernel.org и выберите нужную версию, например linux-2.6.18.3.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.3.tar.bz2

Распакуйте исходники и создайте символьную ссылку linux на каталог с исходниками:

tar xjf linux-2.6.18.3.tar.bz2
ln -s linux-2.6.18.3 linux
cd /usr/src/linux

Совет: если у вас медленное соединение, можно использовать rsync зеркала kernel.org или предварительно скачать архив на локальную машину и перенести.

3.2 Изменение /etc/modprobe.conf

Перед сборкой рекомендуется закомментировать модули, которые могут отсутствовать в новом дереве модулей, чтобы избежать предупреждений при установке модулей. Например, закомментируем модуль mptscsi в /etc/modprobe.conf:

vi /etc/modprobe.conf

Содержимое (пример):

| alias eth0 pcnet32 alias scsi_hostadapter mptbase # alias scsi_hostadapter1 mptscsi alias scsi_hostadapter2 mptfc alias scsi_hostadapter3 mptspi alias scsi_hostadapter4 mptsas alias scsi_hostadapter5 mptscsih |

Примечание: после успешной сборки вы можете вернуть строки обратно, если модуль существует и нужен.

3.3 Применение патчей к исходникам (опционально)

Иногда необходимы драйверы или функции, которые отсутствуют в основной ветке ядра. Если доступен патч, примените его к исходникам.

Пример: патч в /usr/src/patch.bz2

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

Пример применения prepatch (псевдо-альфа): если нужен функционал из 2.6.19-rc6, но полноценных исходников ещё нет, скачайте prepatch для 2.6.19-rc6 и примените его к исходникам 2.6.18:

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 зависят от конкретной трёхчастной версии.

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

Рекомендуется начать с существующей конфигурации рабочего ядра. Скопируйте файл конфигурации в каталог исходников:

make clean && make mrproper
cp /boot/config-`uname -r` ./.config

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

make menuconfig

В меню конфигурации выберите Загрузить альтернативный файл конфигурации и укажите .config (файл с конфигурацией вашего текущего работающего ядра). Это ускорит настройку и снизит вероятность пропуска важных опций.

Меню make menuconfig — выбор альтернативного файла конфигурации

Просмотр параметров конфигурации ядра в текстовом интерфейсе

После прохождения меню и нажатия Exit вам предложат сохранить новую конфигурацию — ответьте Yes:

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

Советы по конфигурации:

  • Если не уверены, используйте опцию M (модуль) для драйверов, которые не обязательны.
  • Для дисковых контроллеров и файловых систем оставляйте поддержку, которая есть в текущем ядре, чтобы снизить риск загрузки без доступа к корневому разделу.
  • Включайте отладку только при необходимости — это увеличивает объём бинарников и время компиляции.

3.5 Сборка и установка ядра

Для сборки и установки выполните эти команды:

make all
make modules_install
make install

Стандартный цикл может занимать от нескольких минут до нескольких часов в зависимости от конфигурации и производительности процессора.

Команда make install обычно создаёт initramfs/initrd по умолчанию и обновляет конфигурацию загрузчика (в старых системах — /boot/grub/menu.lst).

Отредактируйте /boot/grub/menu.lst и убедитесь, что stanza для нового ядра стоит первой или что параметр default установлен в 0, чтобы новое ядро было загружено по умолчанию:

vi /boot/grub/menu.lst

Пример файла menu.lst (фрагмент):

| # 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 CentOS (2.6.18.3) root (hd0,0) kernel /vmlinuz-2.6.18.3 ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18.3.img title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |

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

shutdown -r now

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

uname -r

Ожидаемый вывод (пример):

2.6.18.3

Откат и отладка при неудачной загрузке

Если система не стартует с новым ядром, при появлении экрана GRUB нажмите любую клавишу для входа в меню GRUB:

Экран ожидания GRUB, нажмите любую клавишу для входа в меню

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

Выберите старое ядро и загрузитесь. После успешного старта:

  • Удалите stanza неработающего ядра из /boot/grub/menu.lst.
  • Проанализируйте причину падения: проверьте /var/log/messages, dmesg (в случае если система загрузилась в rescue), доступность модулей, initrd и параметры root= в GRUB.

Совет: храните копию старого initrd и vmlinuz перед удалением.

Чек-листы и роли

Чек-лист системного администратора

  • Создана полная резервная копия /boot и важных конфигов
  • Резервная копия системы или снимок VM
  • Текущая конфигурация ядра скопирована в /usr/src/linux/.config
  • Комментарии в /etc/modprobe.conf при необходимости
  • Проверены зависимости модулей и initramfs
  • GRUB настроен на возможность быстрого отката

Чек-лист разработчика/инженера ядра

  • Проверены патчи и их применимость к версии исходников
  • Выполнен –dry-run для всех patch команд
  • Сборка отрабатывает без ошибок на тестовой машине
  • Запущены unit/интеграционные тесты для критичных подсистем

Мини-методология сборки ядра (шаг за шагом)

  1. Подготовка окружения: обновите инструменты сборки (gcc, make, bc, ncurses-devel и т. п.).
  2. Скачивание исходников: положите их в /usr/src.
  3. (Опционально) Примените патчи с –dry-run.
  4. Скопируйте текущую конфигурацию в .config.
  5. Пройдите make menuconfig и сохраните.
  6. Соберите ядро (make all).
  7. Установите модули (make modules_install).
  8. Установите ядро (make install) и проверьте /boot и GRUB.
  9. Перезагрузите и проверьте uname -r.
  10. При проблемах — используйте старое ядро, исправьте конфигурацию и повторите.

Decision tree для решения, стоит ли собирать ядро вручную

flowchart TD
  A[Нужна ли функция/драйвер в текущем ядре?] -->|Нет| B[Не требуется сборка]
  A -->|Да| C[Есть ли собранный пакет/модуль от дистрибутива?]
  C -->|Да| D[Установить готовый пакет]
  C -->|Нет| E[Соответствует ли upstream kernel требуемой версии?]
  E -->|Да| F[Скачать исходники и собрать]
  E -->|Нет — нужен prepatch| G[Применить prepatch к предыдущей полной версии и собрать]
  F --> H[Тестировать в VM/тестовой среде]
  G --> H
  H --> I{Загрузка успешна?}
  I -->|Да| J[Внедрить в прод]
  I -->|Нет| K[Откат и анализ ошибок]

Быстрый шпаргалка (cheat sheet)

  • Скачивание: wget http://www.kernel.org/pub/linux/kernel/vX.Y/linux-X.Y.Z.tar.bz2
  • Распаковка: tar xjf linux-X.Y.Z.tar.bz2
  • Применение патча: bzip2 -dc patch.bz2 | patch -p1
  • Конфигурация: make menuconfig
  • Сборка: make all
  • Установка модулей: make modules_install
  • Установка ядра: make install
  • Проверка: uname -r

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

  • Система успешно загружается с новым ядром на тестовом хосте.
  • Все критичные сервисы (SSH, сеть, файловые системы) работают после загрузки.
  • Нет ошибок в логах, указывающих на отсутствующие драйвера для корневого тома.
  • Если использовался модульный драйвер — он загружается автоматически или присутствует в /lib/modules/uname -r.

Примеры, когда подход не подходит

  • Если вам нужен управляемый пакет для централизированного развертывания (RPM/Deb), лучше собрать пакет вместо «голой» сборки.
  • На системах с нестандартным загрузчиком (systemd-boot, UEFI с shim/secure boot) процесс установки и подписи ядра требует дополнительных шагов.

Альтернативные подходы

  • Сборка пакета (.rpm, .deb) для удобного развёртывания и отката.
  • Использование дистрибутивных backport-паков и готовых модулей.
  • Использование живых образов/контейнеров для тестирования новых ядер без установки в /boot.

Безопасность и резервное копирование

  • Подписывайте ядра на системах с Secure Boot или отключайте Secure Boot на время тестирования.
  • Всегда сохраняйте старую конфигурацию GRUB и файлы vmlinuz/initrd.
  • Ограничьте доступ к процессу сборки (права root) и проверяйте целостность исходников (GPG-подписи на kernel.org).

Краткая инструкция по откату (runbook)

  1. Если загрузка с новым ядром не проходит — перезагрузите и войдите в меню GRUB.
  2. Выберите предыдущую запись ядра и загрузитесь.
  3. Проверьте логи и исправьте ошибки конфигурации.
  4. Удалите проблемную запись из /boot/grub/menu.lst или обновите GRUB.
  5. Повторите сборку после исправлений.

Быстрый глоссарий (1 строка)

  • initrd/initramfs — временная файловая система, загружаемая ядром для инициализации до монтирования корня;
  • .config — файл конфигурации ядра;
  • make menuconfig — текстовый интерфейс настройки опций ядра;
  • patch/prepatch — изменения к исходникам ядра, иногда требуемые для новых функций.

Суммарные рекомендации

  • Всегда тестируйте сборку в безопасной среде перед внедрением в прод.
  • Используйте существующую конфигурацию как основу и применяйте опцию модулей для непроверенных драйверов.
  • Храните резервные копии и план отката.

Ссылки

Важно: этот материал даёт практический пошаговый план — адаптируйте параметры под вашу архитектуру и версию дистрибутива.

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