Ошибка 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
☑️ Проверка перед перезагрузкой на новое ядро
Старое рабочее ядро удалять нельзя до тех пор, пока новое не проверено в работе — это ваш единственный путь отката без 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-подобных системах. Точная команда зависит от дистрибутива — сверяйтесь с его документацией.
Можно ли собрать ядро в виртуальной машине?
Да, и это хороший способ потренироваться без риска для основной системы. Выделите виртуальной машине достаточно ядер процессора и памяти — сборка ресурсоёмкая. Скомпилированное ядро можно затем перенести на реальное оборудование, если конфигурация учитывает его устройства.