build linux kernel

Сборка и компиляция Linux Kernel: пошаговое руководство

Когда стандартное ядро дистрибутива не видит нужное железо, тянет лишние модули или просто собирается с ненужным вам набором функций, приходит логичный вопрос: можно ли собрать Linux kernel вручную и получить ровно то, что нужно? Да, можно. Но важно понимать не только команды, а весь процесс: от выбора исходников и настройки .config до установки bzImage, модулей и проверки загрузки.

Это руководство рассчитано на тех, кто хочет понять, как собрать ядро Linux осознанно, а не просто бездумно выполнить набор команд. Ниже разберём, что такое kernel compilation, какие инструменты нужны, как работает linux kernel config, где искать kernel image после сборки и что делать при типичных ошибках вроде could not find kernel image linux.


Что такое сборка Linux Kernel и зачем она нужна

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

Актуально это не всегда. В большинстве случаев ядра из Ubuntu, Debian, Fedora, Arch или openSUSE уже покрывают обычные сценарии. Ручная сборка нужна тогда, когда стандартный пакет мешает, а не помогает.

Когда нужно собирать ядро вручную

Ручная сборка ядра имеет смысл в четырёх типичных сценариях:

  • нужно включить поддержку нового или редкого оборудования до того, как она появится в ядре дистрибутива;
  • нужно убрать лишние драйверы и подсистемы, чтобы получить более компактное ядро;
  • требуется кастомная конфигурация для сервера, embedded-устройства, лабораторной машины или VM-хоста;
  • нужны конкретные патчи, экспериментальные опции, отладочные функции или собственный драйвер.

Например, если вы следите за изменениями в новых ветках ядра, полезно параллельно смотреть, что именно добавляют свежие релизы Linux, как это видно на примере разбора изменений Linux 6.18. А если задача связана с графикой AMD, логично учитывать и специфику драйверного стека, о которой отдельно написано в материале про AMDGPU в Linux.

Преимущества и недостатки custom kernel

Что даёт custom kernelКакие есть ограничения
Точный контроль над драйверами, файловыми системами и сетевыми функциямиВысокий риск ошибиться в конфигурации
Возможность уменьшить размер ядра и набор модулейСборка и отладка занимают время
Более ранний доступ к новым функциям ядраОбновлять и сопровождать такое ядро придётся вручную
Гибкость для серверов, embedded и нестандартного железаПосле ошибки система может не загрузиться

Краткий вывод: вручную собирать ядро стоит тогда, когда у вас есть конкретная цель. Если цели нет, стандартное ядро дистрибутива почти всегда практичнее.

Подготовка к сборке Linux Kernel

Подготовка — это этап, на котором ломается больше сборок, чем на самой компиляции. Причина простая: человек скачивает исходники, запускает make menuconfig или make, а потом выясняется, что не хватает зависимостей, места на диске или базового понимания, что именно он собирает.

На этом этапе важно понять три вещи: какие пакеты нужны, откуда брать исходники и хватит ли текущей системе ресурсов.

Необходимые инструменты и зависимости

Минимальный набор зависит от дистрибутива, но обычно нужны:

  • gcc или clang как компилятор;
  • make;
  • binutils;
  • bc;
  • bison и flex;
  • заголовки и библиотеки для OpenSSL;
  • libelf;
  • ncurses для menuconfig;
  • dwarves / pahole для некоторых вариантов сборки с BTF;
  • cpio, если вы будете отдельно собирать initramfs.

Для Debian/Ubuntu типичный набор выглядит так:

sudo apt update
sudo apt install build-essential bc bison flex libssl-dev libelf-dev \
ncurses-dev dwarves cpio fakeroot

Для Fedora:

sudo dnf install gcc make bc bison flex openssl-devel elfutils-libelf-devel \
ncurses-devel dwarves cpio

Для Arch Linux:

sudo pacman -S base-devel bc bison flex openssl libelf ncurses pahole cpio

Часть ошибок при сборке не связана с исходниками вообще. Они возникают просто потому, что отсутствует одна библиотека или утилита, без которой конфигурация или линковка не завершается.

Где взять исходники

Базовый и самый надёжный вариант — официальный архив исходников Linux kernel на kernel.org. Обычно используют либо стабильный релиз, либо LTS-ветку, если важнее предсказуемость, чем новизна.

Типовой сценарий:

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.x.y.tar.xz
tar -xf linux-6.x.y.tar.xz
cd linux-6.x.y

Также можно использовать исходники из репозитория дистрибутива, но для ручной сборки чаще удобнее официальный tarball: меньше сторонних патчей, понятнее структура, проще повторять инструкцию на любой системе.

Требования к системе

Сборка ядра не требует суперкомпьютера, но и на слабой машине процесс может оказаться неприятно долгим. Практический минимум — несколько гигабайт свободного места, 2–4 ГБ RAM и достаточно времени.

РесурсМинимальноКомфортно
Свободное место3–5 ГБ8–15 ГБ
Оперативная память2–4 ГБ8 ГБ и выше
Процессор2 ядра4+ ядер
Время сборкиот десятков минут до часовобычно заметно быстрее

Если у вас ноутбук, VM или мини-ПК, учитывайте не только CPU, но и нагрев, троттлинг и объём swap. Сборка легко превращается в тест системы охлаждения.

Практический сценарий выбора: если вы собираете ядро ради одного драйвера или одной опции, безопаснее начать с конфигурации текущего ядра и изменить минимум параметров. Полная сборка «с нуля» нужна реже, чем кажется.

Конфигурация ядра (linux kernel config)

Конфигурация ядра — это набор параметров, который определяет, какие драйверы, подсистемы и возможности будут встроены в ядро, а какие соберутся как модули или не войдут вовсе. Именно этот этап решает, загрузится ли система после установки.

Фактически linux kernel config — это ответ на вопрос: что именно вы хотите получить на выходе.

Что такое конфигурация ядра

Главный файл конфигурации называется .config. В нём для тысяч опций задаётся одно из трёх состояний:

  • y — функция встроена прямо в ядро;
  • m — функция собрана как модуль;
  • n — функция отключена.

Это критично для драйверов диска, файловой системы root-раздела, поддержки NVMe, SATA, USB-клавиатуры на раннем этапе загрузки и сетевых функций. Если отключить не ту вещь, ядро соберётся, но система не стартует.

Основные способы настройки (menuconfig и др.)

У ядра есть несколько типовых способов подготовки конфигурации:

  • make defconfig — создаёт базовую конфигурацию по умолчанию для архитектуры;
  • make menuconfig — удобный текстовый интерфейс на базе ncurses;
  • make oldconfig — обновляет существующий .config, задавая вопросы только по новым опциям;
  • make localmodconfig — пытается оставить только то, что нужно для уже загруженных модулей текущей системы;
  • make xconfig или make nconfig — графические и более удобные альтернативы, если они доступны.

Самая безопасная стартовая точка для обычного ПК — взять конфигурацию текущего ядра:

cp /boot/config-$(uname -r) .config
make oldconfig

Это лучше, чем начинать с пустого энтузиазма и defconfig, потому что вы сохраняете уже рабочий набор драйверов для своей системы.

Важные опции (linux kernel options)

Ключевые linux kernel options зависят от сценария использования, но вот что проверяют чаще всего:

Группа опцийЧто проверятьПочему это важно
CPU и архитектураПравильная архитектура, семейство процессора, NUMA/SMPОшибка здесь даёт проблемы с загрузкой или потерю производительности
StorageNVMe, SATA/AHCI, SCSI, RAIDБез этого root-раздел может не определиться
Файловые системыext4, Btrfs, XFS, F2FS и другие нужные ФСЕсли отключить свою ФС, ядро не смонтирует систему
Device DriversGPU, Wi-Fi, Ethernet, USB, input-устройстваИменно здесь чаще всего теряют железо после сборки
Network stackIPv4/IPv6, netfilter, bridge, VLAN, VPNКритично для серверов, контейнеров и маршрутизаторов
SecuritySELinux, AppArmor, module signing, lockdownНеверные настройки могут мешать загрузке модулей
DebugKASAN, debug symbols, tracingПолезно для отладки, но сильно утяжеляет сборку и ядро

Риск, который часто недооценивают: слишком агрессивная «оптимизация» ядра ради размера. На обычном десктопе экономия в мегабайтах легко оборачивается потерей Wi-Fi, сна, Bluetooth или GPU-драйвера.

Что подтверждено, а что миф:

  • Подтверждено: отключение ненужных подсистем действительно может уменьшить размер ядра и число модулей.
  • Подтверждено: неправильно выбранные драйверы storage и файловой системы часто ломают загрузку.
  • Скорее миф: custom kernel почти всегда даёт заметный прирост скорости на обычном домашнем ПК. На практике выигрыш часто минимален, если речь не идёт о специализированной нагрузке.

Сборка Linux Kernel (build / make)

После подготовки .config начинается сама компиляция. Это этап, где исходники превращаются в объектные файлы, модули и итоговый образ ядра.

Если коротко, make читает правила сборки, проверяет конфигурацию, компилирует нужные части и потом линкует всё в готовый kernel image.

Основные команды (make)

Базовый набор команд выглядит так:

make oldconfig
make -j$(nproc)
sudo make modules_install
sudo make install

Что делает каждая команда:

  • make oldconfig — актуализирует конфигурацию под текущие исходники;
  • make -j$(nproc) — собирает ядро и модули в несколько потоков;
  • make modules_install — устанавливает модули в /lib/modules/<version>/;
  • make install — устанавливает ядро, System.map и часто обновляет загрузочную конфигурацию.

Также полезно понимать разницу между командами:

КомандаЧто делаетКогда использовать
makeПолная сборка ядра и модулейОбычный сценарий
make modulesСобирает только модулиКогда ядро уже собрано, а нужны модули
make bzImageСобирает только образ ядраДля диагностики или кастомного процесса
make modules_installУстанавливает модулиПосле успешной сборки
make installУстанавливает ядро в системуФинальный этап перед перезагрузкой

Параллельная сборка

Ключ -jN задаёт количество параллельных задач. Обычно используют -j$(nproc), чтобы занять все логические потоки CPU.

Но есть нюанс. На машине с малым объёмом RAM слишком агрессивный параллелизм способен замедлить процесс из-за swap и троттлинга. На ноутбуке с 4 ГБ памяти разумнее попробовать -j2 или -j4, чем сразу выкручивать максимум.

Для ускорения повторных сборок полезен и ccache. Он не ускоряет самую первую сборку радикально, но помогает, если вы часто меняете конфиг, патчи или отдельные драйверы.

Типичные этапы процесса

  1. Подготовка дерева сборки и проверка .config.
  2. Генерация заголовков и служебных файлов.
  3. Компиляция подсистем и драйверов.
  4. Сборка модулей.
  5. Линковка итогового ядра.
  6. Создание bzImage и сопутствующих файлов.

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

Если вам интересно, как развивается само ядро и какие изменения потом попадают в релизы, уместно держать рядом и обзор по ядру Linux 6.18, чтобы лучше понимать, какие подсистемы вообще стоит включать или тестировать вручную.


Kernel image и выходные файлы

После компиляции важно не просто увидеть слово make, а понимать, какой именно файл является результатом и что с ним делать дальше. Здесь путаница возникает особенно часто: пользователи смешивают bzImage, vmlinuz, initramfs и модули, хотя это разные части процесса.

Что такое linux kernel image

Linux kernel image — это итоговый бинарный образ ядра, который загрузчик передаёт системе при старте. На x86-системах после сборки чаще всего речь идёт о файле bzImage.

bzImage — это сжатый загрузочный образ, создаваемый в дереве исходников. vmlinuz — обычно установленная в /boot версия образа ядра, уже подготовленная для загрузки системой. Проще говоря, bzImage чаще видят во время сборки, а vmlinuz — уже после установки.

Где находится результат сборки

Типовые выходные файлы находятся здесь:

  • arch/x86/boot/bzImage — образ ядра для x86/x86_64;
  • System.map — таблица символов ядра;
  • .config — использованная конфигурация;
  • /lib/modules/<version>/ — установленные модули после make modules_install;
  • /boot/ — установленный образ ядра, initramfs и файлы загрузчика после make install.

Для других архитектур путь к итоговому образу отличается. Это особенно важно при cross-compilation, где результат лежит не там, где его ждут пользователи, привыкшие к x86.

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

Типовой сценарий установки:

sudo make modules_install
sudo make install

После этого обычно нужно убедиться, что:

  • в /boot появился новый образ ядра;
  • создан или обновлён initramfs;
  • загрузчик GRUB или systemd-boot увидел новую запись.

Что такое initramfs и нужен ли он: initramfs — это ранняя файловая система в памяти, которая помогает ядру получить доступ к корневому разделу, модулям и нужным драйверам ещё до монтирования основной системы. На большинстве современных дистрибутивов он нужен, особенно если root находится на NVMe, RAID, LVM, LUKS или Btrfs с нестандартной схемой загрузки.

Риск: даже идеально собранное ядро не загрузится, если вы забыли про initramfs или отключили критичный драйвер storage, надеясь догрузить его позже как модуль.


Ошибки при сборке и их решение

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

could not find kernel image linux

Ошибка could not find kernel image linux обычно означает не мистическую поломку, а одну из вполне приземлённых причин:

  • сборка завершилась с ошибкой раньше, чем был создан образ;
  • вы ищете не тот файл или не в том каталоге;
  • для вашей архитектуры итоговый путь отличается;
  • make install ожидает результат, которого ещё нет;
  • конфигурация не позволила собрать загрузочный образ.

Что делать по шагам:

  1. Прокрутить вывод сборки вверх и найти первую реальную ошибку, а не последнюю.
  2. Проверить наличие arch/x86/boot/bzImage или соответствующего файла для вашей архитектуры.
  3. Явно запустить make bzImage и посмотреть, где именно процесс ломается.
  4. Убедиться, что вы находитесь в корне дерева исходников и собираете нужную архитектуру.

Практический вывод: эта ошибка часто является не причиной, а последствием. Настоящая проблема почти всегда произошла раньше в логах.

Ошибки зависимостей

Обычные признаки — сообщения про отсутствующие библиотеки, заголовки, утилиты или невозможность запустить конфигуратор. Часто встречаются проблемы с ncurses, libelf, OpenSSL, bison, flex и pahole.

Решение почти всегда одно и то же:

  • проверить, какие пакеты отсутствуют;
  • установить зависимости через пакетный менеджер;
  • перезапустить сборку;
  • при сомнениях начать с make clean или использовать отдельный каталог сборки.

Если ошибка возникла после обновления компилятора или системных библиотек, полезно пересобрать всё заново, а не пытаться лечить частично сломанное дерево сборки.

Проблемы конфигурации

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

  • отключены драйверы дисковой подсистемы;
  • не включена нужная файловая система root-раздела;
  • критичный драйвер собран как модуль, но без корректного initramfs;
  • ошибочно отключена поддержка конкретной архитектуры или платформы;
  • слишком агрессивно вырезаны «ненужные» драйверы.

Надёжные способы восстановления:

cp /boot/config-$(uname -r) .config
make oldconfig

или, если нужно быстро получить рабочую базу:

make defconfig

Но здесь есть важная оговорка: defconfig — это не магическая кнопка «сделать как у моего дистрибутива». Это просто базовый конфиг для архитектуры. Для реальной машины почти всегда безопаснее стартовать с конфига текущего рабочего ядра.


FAQ по сборке Linux Kernel

Чем отличается make от make modules?

make обычно запускает полную сборку ядра и модулей, а make modules собирает только модули. На практике обычному пользователю чаще нужен именно полный цикл.

Как уменьшить размер kernel image?

Отключить неиспользуемые драйверы, debug-опции, лишние файловые системы и редкие подсистемы. Но сокращать ядро нужно осторожно: минимизация без понимания зависимостей чаще ломает систему, чем помогает.

Как ускорить сборку?

Использовать -j$(nproc) или разумное количество потоков, включить ccache, собирать только нужную архитектуру и не держать включёнными тяжёлые debug-опции без необходимости.

Можно ли собрать kernel для другой архитектуры?

Да, это называется cross-compilation. Для этого нужны кросс-компилятор, правильные переменные вроде ARCH и CROSS_COMPILE, а также понимание, где именно будет лежать итоговый образ для целевой архитектуры.

Как подключить свой драйвер в kernel?

Либо встроить его в дерево исходников и добавить в конфигурацию как встроенный компонент или модуль, либо собрать отдельно как внешний модуль. Второй вариант обычно безопаснее для первых экспериментов.


Итоги: стоит ли собирать Linux kernel вручную

Если вам нужен просто рабочий Linux на домашнем ПК, стандартное ядро дистрибутива почти всегда лучше: меньше риска, меньше ручной поддержки, проще обновления. Но если нужна точная настройка, поддержка нового железа, отладка драйверов, оптимизация под сервер или лабораторная работа с подсистемами ядра, ручная сборка полностью оправдана.

Лучший практический путь такой: взять конфиг текущего ядра, изменить только то, что действительно нужно, собрать образ, установить модули, проверить initramfs и только потом перезагружаться. Именно этот сценарий даёт наименьший шанс получить нерабочую систему.

Финальная рекомендация: не пытайтесь выиграть всё сразу — и размер, и скорость, и минимализм. В сборке Linux kernel выигрывает не самый агрессивный конфиг, а самый предсказуемый.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x