Исходники ядра Linux: загрузка, структура и сборка

Команда apt-get source linux или прямая загрузка архива с kernel.org — два основных способа получить исходники ядра Linux, и выбор между ними зависит от того, нужен ли вам ванильный код от разработчиков ядра или версия с патчами конкретного дистрибутива. Исходный код ядра распространяется свободно под лицензией GPLv2, поэтому любой пользователь может не только изучить его, но и собрать собственное ядро с нужными настройками.

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

Что представляют собой исходники ядра Linux

Исходники ядра — это полный набор файлов на языке C (с небольшими вставками на ассемблере), из которых компилируется бинарный образ ядра vmlinuz, модули и связанные компоненты. Ядро отвечает за управление памятью, процессами, драйверами устройств, сетевым стеком и файловыми системами — всё это присутствует в дереве исходников в виде отдельных подсистем.

Существует два основных вида исходников. Ванильное ядро (vanilla) — код в том виде, в каком его выпускают разработчики с kernel.org, без сторонних изменений. Ядро дистрибутива — те же исходники, но с патчами от мейнтейнеров Ubuntu, Debian, Fedora и других систем: исправления безопасности, дополнительные драйверы и специфические настройки.

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

Где скачать исходники ядра

Официальный источник — сайт kernel.org, где публикуются все релизы в виде архивов .tar.xz и Git-репозиториев. Там же доступны стабильные ветки (stable) и версии с длительной поддержкой (LTS).

Основные способы получения кода:

  • 📦 Скачать архив релиза с kernel.org и распаковать его командой tar -xf.
  • 🌿 Клонировать Git-репозиторий: git clone с указанием нужной ветки или тега версии.
  • 🐧 Установить пакет исходников дистрибутива, например apt-get source linux-image-$(uname -r) в Debian и Ubuntu.
  • 💾 Поставить заголовочные файлы linux-headers, если требуется только сборка внешних модулей, а не всего ядра.
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

Обратите внимание: полный Git-репозиторий занимает значительный объём на диске из-за всей истории изменений. Если история не нужна, используйте неглубокое клонирование с параметром --depth 1 или скачивайте готовый архив.

Структура дерева исходного кода

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

КаталогСодержимое
arch/Код, специфичный для архитектур процессоров (x86, ARM и др.)
drivers/Драйверы устройств — самая объёмная часть ядра
fs/Реализации файловых систем (ext4, Btrfs, XFS и других)
kernel/Ядро планировщика, управление процессами и прерываниями
net/Сетевой стек: TCP/IP, сокеты, сетевые протоколы

Кроме того, в корне дерева лежат системы сборки Kbuild и конфигурации Kconfig, а также файл Makefile верхнего уровня, через который запускается весь процесс компиляции. Документация по подсистемам собрана в каталоге Documentation/ — это первый источник, куда стоит смотреть при изучении конкретной части ядра.

📊 Зачем вам исходники ядра Linux?
Собрать ядро под своё железо
Скомпилировать внешний модуль или драйвер
Изучить устройство ядра
Внести патч или заняться разработкой

Инструменты, необходимые для сборки

Прежде чем приступать к компиляции, убедитесь, что в системе установлены нужные пакеты. Минимальный набор: компилятор gcc, утилита make, библиотека libncurses-dev для текстового меню конфигурации, а также flex, bison и libssl-dev. Точные имена пакетов зависят от дистрибутива, поэтому сверяйтесь с его документацией.

В Debian-подобных системах зависимости обычно ставятся одной командой:

sudo apt install build-essential libncurses-dev flex bison libssl-dev libelf-dev bc
⚠️ Внимание: сборка ядра требует заметного объёма свободного места на диске и оперативной памяти. Перед началом убедитесь, что на разделе достаточно пространства, иначе компиляция прервётся с ошибкой на середине процесса.

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

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

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

make oldconfig

Для ручной настройки доступны несколько интерфейсов:

  • 🖥️ make menuconfig — текстовое меню на основе ncurses, самый популярный вариант.
  • 🪟 make xconfig или make gconfig — графические интерфейсы для Qt и GTK.
  • ⚙️ make defconfig — конфигурация по умолчанию для вашей архитектуры.
  • 🔧 make localmodconfig — оставляет только модули, реально загруженные в системе, что ускоряет сборку.

☑️ Подготовка к сборке ядра

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

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

Компиляция и установка ядра

Сама сборка запускается командой make. Для ускорения используйте параллельную компиляцию с параметром -j, где число соответствует количеству доступных потоков процессора:

make -j$(nproc)

sudo make modules_install

sudo make install

Команда make modules_install копирует модули в /lib/modules/, а make install устанавливает образ ядра в /boot и в большинстве дистрибутивов автоматически обновляет конфигурацию загрузчика GRUB. Если этого не произошло, обновите загрузчик вручную командой sudo update-grub (в системах, где она предусмотрена).

⚠️ Внимание: если после установки нового ядра система не загружается, выберите предыдущее ядро в меню GRUB (пункт «Дополнительные параметры»). Именно поэтому старое ядро нужно сохранять до полной проверки нового.

Типичные ошибки при работе с исходниками

Одна из частых проблем — конфликт версий: модуль, собранный под одну версию ядра, не загрузится в ядро другой версии. Всегда проверяйте соответствие через uname -r и каталог исходников, с которым работаете.

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

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

Чем отличаются ветки stable, LTS и mainline

Mainline — самая свежая разрабатываемая версия, может содержать ошибки. Stable — стабилизированные релизы с исправлениями. LTS (Long Term Support) — версии с длительной поддержкой, которые получают исправления безопасности годами. Для рабочих систем обычно выбирают LTS.

Часто задаваемые вопросы

Где официально скачать исходники ядра Linux?

На сайте kernel.org — там публикуются все релизы в виде архивов и Git-репозиториев. Для ядра с патчами дистрибутива используйте пакетный менеджер вашей системы.

Чем отличаются linux-source и linux-headers?

linux-source — полное дерево исходников для сборки всего ядра. linux-headers — только заголовочные файлы и конфигурация, достаточные для компиляции внешних модулей и драйверов.

Сколько времени занимает сборка ядра?

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

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

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

Нужно ли быть программистом, чтобы собрать ядро?

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