Когда стандартное ядро дистрибутива не видит нужное железо, тянет лишние модули или просто собирается с ненужным вам набором функций, приходит логичный вопрос: можно ли собрать 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 | Ошибка здесь даёт проблемы с загрузкой или потерю производительности |
| Storage | NVMe, SATA/AHCI, SCSI, RAID | Без этого root-раздел может не определиться |
| Файловые системы | ext4, Btrfs, XFS, F2FS и другие нужные ФС | Если отключить свою ФС, ядро не смонтирует систему |
| Device Drivers | GPU, Wi-Fi, Ethernet, USB, input-устройства | Именно здесь чаще всего теряют железо после сборки |
| Network stack | IPv4/IPv6, netfilter, bridge, VLAN, VPN | Критично для серверов, контейнеров и маршрутизаторов |
| Security | SELinux, AppArmor, module signing, lockdown | Неверные настройки могут мешать загрузке модулей |
| Debug | KASAN, 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. Он не ускоряет самую первую сборку радикально, но помогает, если вы часто меняете конфиг, патчи или отдельные драйверы.
Типичные этапы процесса
- Подготовка дерева сборки и проверка
.config. - Генерация заголовков и служебных файлов.
- Компиляция подсистем и драйверов.
- Сборка модулей.
- Линковка итогового ядра.
- Создание
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ожидает результат, которого ещё нет;- конфигурация не позволила собрать загрузочный образ.
Что делать по шагам:
- Прокрутить вывод сборки вверх и найти первую реальную ошибку, а не последнюю.
- Проверить наличие
arch/x86/boot/bzImageили соответствующего файла для вашей архитектуры. - Явно запустить
make bzImageи посмотреть, где именно процесс ломается. - Убедиться, что вы находитесь в корне дерева исходников и собираете нужную архитектуру.
Практический вывод: эта ошибка часто является не причиной, а последствием. Настоящая проблема почти всегда произошла раньше в логах.
Ошибки зависимостей
Обычные признаки — сообщения про отсутствующие библиотеки, заголовки, утилиты или невозможность запустить конфигуратор. Часто встречаются проблемы с 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 выигрывает не самый агрессивный конфиг, а самый предсказуемый.




