Компиляция ядра Linux из исходников: полное руководство

Ошибка Kernel panic - not syncing: VFS: Unable to mount root fs после самостоятельной сборки ядра почти всегда означает одно: в образ initramfs не попал драйвер корневой файловой системы или контроллера диска. Это самый частый итог первой попытки компиляции ядра Linux из исходников — и именно поэтому к процессу стоит подходить методично: от получения проверенных исходников до корректного обновления загрузчика.

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

Зачем собирать ядро из исходников

Дистрибутивное ядро собрано «на все случаи жизни»: в него включены тысячи модулей для оборудования, которого у вас никогда не будет. Собственная сборка решает конкретные задачи, и перед началом стоит чётко понимать, какая из них ваша.

  • 🔧 Поддержка нового оборудования — драйвер появился в свежем ядре, а дистрибутив ещё не обновился.
  • 🛡️ Патчи безопасности — применение исправлений до официального релиза пакета.
  • Оптимизация — отключение ненужных подсистем, выбор планировщика, тонкая настройка под конкретный процессор.
  • 🧪 Тестирование и разработка — проверка модулей, отладка, участие в разработке ядра.

Есть и обратная сторона: собранное вручную ядро не обновляется автоматически пакетным менеджером. За безопасностью такой системы придётся следить самостоятельно и пересобирать ядро при выходе критических исправлений.

Подготовка системы и установка зависимостей

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

Для Debian и Ubuntu базовый набор устанавливается так:

sudo apt update

sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc rsync

Для Fedora и родственных систем команда отличается:

sudo dnf groupinstall "Development Tools"

sudo dnf install ncurses-devel openssl-devel elfutils-libelf-devel bison flex bc

Также понадобится свободное место на диске — распакованное дерево исходников вместе с объектными файлами занимает заметный объём, ориентировочно несколько гигабайт. Проверить свободное место можно командой df -h.

⚠️ Внимание: не собирайте ядро от имени root. Сборка выполняется под обычным пользователем, а права суперпользователя требуются только на этапе установки модулей и самого ядра.

Загрузка и проверка исходного кода

Единственный источник, которому стоит доверять, — официальный архив kernel.org. Там публикуются стабильные (stable), долгосрочные (longterm) и основные (mainline) версии. Скачать архив можно через браузер или командой wget:

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz

tar -xf linux-6.6.tar.xz

cd linux-6.6

Рядом с архивом на kernel.org лежит файл подписи .sign. Проверка подписи через GPG — необязательный, но правильный шаг: он подтверждает, что архив не был изменён при передаче. Подробная процедура верификации описана на сайте kernel.org.

Чем отличаются ветки ядра

Mainline — самая свежая версия с новейшими функциями, но меньшей стабильностью. Stable получает только исправления ошибок. Longterm поддерживается годами и подходит для серверов. Дистрибутивы обычно используют longterm-ядра с собственными патчами.

Настройка конфигурации ядра

Это самый ответственный этап. Файл .config определяет, что войдёт в ядро: какие драйверы будут встроены, какие собраны модулями, а какие отключены. Начинать с нуля не нужно — возьмите за основу конфигурацию текущего работающего ядра:

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

make olddefconfig

Команда make olddefconfig подставит значения по умолчанию для новых параметров, появившихся в свежей версии. Дальше можно открыть текстовый конфигуратор и внести свои изменения:

make menuconfig

В menuconfig навигация ведётся стрелками, пробел переключает состояние опции: [*] — встроено в ядро, [M] — собирается модулем, [ ] — отключено. Клавиша / открывает поиск по названию параметра.

📊 Зачем вам понадобилась сборка ядра из исходников?
Поддержка нового оборудования
Оптимизация и уменьшение размера
Применение патчей
Обучение и эксперименты
  • 💾 Драйверы дисков и ФС (SATA, NVMe, ext4, XFS) лучше встраивать прямо в ядро, чтобы не зависеть от initramfs.
  • 🖥️ Драйверы сетевых карт — минимум тот, что обслуживает ваш адаптер.
  • 🔇 Ненужные подсистемы (например, поддержка экзотического железа) можно безопасно отключать.
  • 🧩 Экспериментальные опции, помеченные как EXPERIMENTAL, включайте только осознанно.
⚠️ Внимание: не отключайте параметры, назначения которых вы не понимаете. Ошибочно выключенная опция может сделать систему незагружаемой. Когда сомневаетесь — оставляйте значение из конфигурации дистрибутива.

Компиляция ядра и модулей

Когда конфигурация готова, запускается сборка. Ключ -j задаёт число параллельных потоков — обычно его ставят равным количеству ядер процессора:

make -j$(nproc)

Процесс занимает от десятков минут до нескольких часов в зависимости от мощности машины и объёма включённых опций. Прервать сборку можно сочетанием Ctrl+C — повторный запуск make продолжит с места остановки, так как система сборки отслеживает изменённые файлы.

Об успешном завершении говорит отсутствие ошибок и наличие файла arch/x86/boot/bzImage (для архитектуры x86-64). Если сборка упала с ошибкой, читайте первые строки сообщения — обычно там указано, какого пакета или заголовочного файла не хватает.

Установка модулей, ядра и обновление загрузчика

Установка выполняется уже с правами суперпользователя и состоит из двух шагов:

sudo make modules_install

sudo make install

Первая команда копирует модули в /lib/modules/версия-ядра/, вторая — помещает образ ядра в /boot и в большинстве дистрибутивов автоматически вызывает обновление конфигурации GRUB. Если автоматического обновления не произошло, выполните его вручную (команда зависит от дистрибутива):

sudo update-grub

или

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

☑️ Проверка перед перезагрузкой на новое ядро

Выполнено: 0 / 5

Старое рабочее ядро удалять нельзя до тех пор, пока новое не проверено в работе — это ваш единственный путь отката без LiveUSB. GRUB сохраняет несколько записей в меню загрузки, и выбрать прежнюю версию можно в разделе «Advanced options».

Типичные ошибки и их решение

Большинство проблем после сборки сводится к небольшому списку. Таблица поможет быстро сориентироваться:

СимптомВероятная причинаРешение
Kernel panic: unable to mount root fsДрайвер ФС или диска не включён в ядро/initramfsВстроить драйвер в ядро или пересоздать initramfs
Ошибка сборки: missing headerНе установлены dev-пакетыДоустановить зависимости из раздела подготовки
Нет сети после загрузкиДрайвер сетевой карты не собранВключить соответствующий модуль в menuconfig
Новое ядро не появилось в меню GRUBКонфигурация загрузчика не обновленаВыполнить update-grub вручную
Сборка занимает часыВключены тысячи ненужных модулейИспользовать make localmodconfig для урезания конфигурации

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

⚠️ Внимание: если система не загружается с новым ядром, не переустанавливайте ОС. Перезагрузитесь, выберите в GRUB предыдущую версию ядра и разбирайтесь с конфигурацией уже из рабочей системы.

Частые вопросы о сборке ядра

Можно ли собрать ядро одного дистрибутива для другого?

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

Сколько времени занимает компиляция?

Это зависит от процессора, числа потоков сборки и объёма конфигурации. На современном многоядерном ПК полная сборка обычно занимает десятки минут; на слабом железе — значительно дольше. Урезание конфигурации через localmodconfig заметно ускоряет процесс.

Обновляется ли самосборное ядро автоматически?

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

Что делать, если make install не обновил GRUB?

Выполните обновление конфигурации вручную: sudo update-grub в Debian/Ubuntu или sudo grub2-mkconfig -o /boot/grub2/grub.cfg в Fedora-подобных системах. Точная команда зависит от дистрибутива — сверяйтесь с его документацией.

Можно ли собрать ядро в виртуальной машине?

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