Компиляция собственного ядра Linux

Компиляция собственного ядра — частый шаг энтузиастов и системных администраторов, особенно при установке Gentoo или других дистрибутивов, где ожидается высокая степень кастомизации. Ниже — объяснение основных понятий и подробная инструкция, как получить рабочий, минимальный и безопасный образ ядра.
О чём эта статья
- Что такое ядро и почему его иногда компилируют вручную
- Как получить исходные коды ядра (через пакет дистрибутива и с официального сайта)
- Какие пакеты и инструменты нужны
- Как правильно настроить .config и собрать ядро
- Как установить ядро, сделать откат через GRUB и проверить работоспособность
- Практические чек-листы, критерии приёмки, сценарии тестирования и план отката
Что такое ядро
Ядро — центральный компонент операционной системы, который управляет доступом процессов к оборудованию: CPU, памяти, дискам, сетевым интерфейсам и драйверам. Ядро выполняет планирование задач, управление памятью, обработку прерываний и обеспечивает интерфейс между программами и железом.
Краткое определение: ядро — это программный слой, который делает оборудование доступным для приложений и системных сервисов.
Почему Linux-ядро уникально: исходники Linux доступны и модульны, поэтому вы можете собрать ядро, включив только те драйверы и опции, которые нужны для вашего оборудования. Это отличается от большинства коммерческих ОС, где ядро поставляется в бинарном виде и одинаково для всех систем.
Что такое компиляция
Компиляция — это процесс преобразования исходного кода (обычно на языке C для ядра Linux) в машинный код, понятный CPU. Для этого используют компилятор (например, GCC), который переводит, оптимизирует и связывает объектные файлы.
В одной строке: компиляция превращает текст исходников в исполняемый образ и модули, которые можно загрузить как ядро в систему.
Получение исходников ядра
Вы не сможете компилировать ядро без исходников. Есть два основных пути: использовать пакет исходников, предоставляемый вашим дистрибутивом, или скачать исходники с официального сайта kernel.org.
Через пакет дистрибутива (пример для Debian/Ubuntu)
На Debian-основанных системах удобно установить пакет исходников из репозитория:
sudo apt-get update
sudo apt-get install linux-sourceПосле установки исходники обычно находятся в /usr/src/. Перейдите в эту папку и посмотрите содержимое:
cd /usr/src/
ls -laНайдёте файл с расширением .tar.bz2, например linux-source-4.4.0.tar.bz2 — распакуйте его:
sudo tar xjvf linux-source-4.4.0.tar.bz2Учтите: имена файлов и версии будут отличаться в зависимости от дистрибутива и пакета.
Официальный сайт (kernel.org)
Если ваш дистрибутив не предоставляет исходники или вы хотите другую версию, загрузите tarball с kernel.org. Скачайте в отдельную пустую папку, чтобы удобно хранить разные версии.
Распаковка xz-архива:
tar xJvf linux-4.9.11.tar.xzСовет: храните каждую версию ядра в отдельном каталоге вида ~/kernel/linux-4.xx/ — так проще управлять несколькими сборками.
Настройка ядра
Настройка — ключевой шаг. Здесь вы выбираете, какие драйверы и подсистемы будут включены. Можно собрать «полный» универсальный образ или минимальное ядро, поддерживающее только ваше железо.
Зачем кастомизировать
- Уменьшение размера initramfs/ядра
- Исключение неиспользуемых драйверов (лучше безопасность и чуть меньшая поверхность атаки)
- Оптимизация производительности и времени загрузки
- Поддержка специфичного оборудования или новых функций
Предварительные пакеты и зависимости
Перед началом убедитесь, что установлены инструменты сборки. На Debian/Ubuntu набор выглядит так:
sudo apt-get install build-essential gcc libncurses5-dev libssl-devПояснение: build-essential устанавливает GCC, make и другие инструменты; libncurses5-dev нужен для консольных конфигураторов (menuconfig). На других дистрибутивах пакеты могут называться иначе (например, ncurses-devel на Fedora).
Если вы распаковали исходники в домашнюю директорию, sudo не нужен для большинства операций, но при установке в /boot и обновлении grub привилегии потребуются.
Создание базовой конфигурации
Первая удобная команда — make localmodconfig. Она создаёт файл .config на основе модулей, загруженных в текущей системе. Это полезно для быстрого получения конфигурации, соответствующей текущему работающему ядру:
cd /path/to/linux-source-4.x
sudo make localmodconfigЕсли исходники в вашем домашнем каталоге, sudo не обязателен.
Важно: make localmodconfig не идеален — он определяет только те модули, которые загружены в данный момент. Устройство, которое не задействовано сейчас, может не быть обнаружено. Поэтому после запуска localmodconfig обязательно проверьте конфигурацию вручную.
Если вы хотите начать с чистой сборки или возвратить всё в исходное состояние:
sudo make cleanИнтерфейсы конфигурации
Редактировать .config вручную не рекомендуется; вместо этого используйте консольные интерфейсы make:
- make menuconfig — текстовый интерфейс на базе ncurses
- make nconfig — улучшенный ncurses-интерфейс с подсказками
- make xconfig — GUI на Qt (требуются библиотеки)
Пример запуска nconfig:
sudo make nconfigНавигация: стрелки, Enter для входа в подменю, пробел для переключения опций между встроенным (обычно ‘*’), модулем (‘M’) и выключено (пусто). Нажмите F2 для справки по выбранной опции, F9 — сохранить и выйти.
Статусы опций:
- <> или [] — встроено в ядро
или [M] — собран как модуль, будет загружаться по требованию - — опция отключена
Совет: если вы собираете драйвер для устройств хранения (SATA, NVMe) и хотите загрузиться без initramfs, соберите эти драйверы встроенными (не в виде модулей).
Сохранение конфигурации
После правок сохраните .config (F9 в nconfig) и при необходимости проверьте его консистентность:
make oldconfigmake oldconfig задаст вопросы о новых опциях, добавленных в версии ядра, базируясь на текущем .config.
Сборка и установка
После настройки можно перейти к сборке. Рекомендуется запустить сборку с параллельными потоками по количеству ядер процессора для ускорения:
sudo make -j$(nproc --all)Если сборка идёт в вашем домашнем каталоге, sudo не требуется. Параметр -j ускоряет процесс за счёт параллельной компиляции, но загружает систему — при недостатке ресурсов можно указать меньший номер, например -j2.
Время сборки сильно зависит от конфигурации, количества модулей и мощности железа — от нескольких минут (минимальное ядро) до часов (полный набор модулей и оптимизаций).
После успешной компиляции установите модули и сам образ:
sudo make modules_install
sudo make installКоманда make install обычно:
- копирует скомпилированный vmlinuz и System.map в /boot
- создаёт соответствующий initramfs (если конфигурация/дистрибутив поддерживает)
- обновляет записи загрузчика (иногда это делается отдельной командой)
Проверьте, что в /boot появились файлы с именем, отражающим вашу версию ядра.
Переключение и откат через GRUB
После установки нового ядра есть риск, что система не загрузится (например, отсутствует поддержка контроллера диска). Чтобы иметь возможность откатиться, откройте конфигурацию GRUB и отключите скрытую паузу загрузчика:
sudo nano /etc/default/grubНайдите строки GRUB_HIDDEN_TIMEOUT и GRUB_HIDDEN_TIMEOUT_QUIET и закомментируйте их, поставив # в начале. Это позволит при загрузке увидеть меню GRUB и выбрать пункт Advanced options для загрузки старого ядра.
После правки перегенерируйте конфигурацию GRUB:
sudo grub-mkconfig -o /boot/grub/grub.cfgПри следующей перезагрузке выберите Advanced options и нужный образ ядра.
Если система не загружается и вы не можете использовать GRUB, загрузитесь с Live-USB и восстановите прежний /boot или верните конфигурацию grub.
Тестирование и критерии приёмки
Критерии приёмки для нового ядра — минимальный набор тестов, которые необходимо пройти прежде, чем считать сборку успешной:
- Система успешно загружается в графический/текстовый режим
- Сеть (Ethernet/Wi‑Fi) работает как ожидается
- Доступ к дискам/файловым системам корректен, тома монтируются
- USB/внешние устройства функционируют
- Ожидаемые модули загружаются (lsmod показывает необходимые модули)
- Нет критических сообщений в dmesg, связанных с драйверами хранения или rootfs
Если вы используете LVM/RAID/шифрованные тома, проверьте процедуру расшифровки и монтирования — при неправильной конфигурации ядра загрузка может остановиться на этапе initramfs.
Тестовые сценарии
- Полная перезагрузка и вход в систему под обычным пользователем
- Проверка сетевого интерфейса: ping, dhclient (если DHCP)
- Проверка работы дисковых операций: чтение/запись на системный диск
- Тест USB-устройств: подключение флешки, проверка dmesg
- Проверка модулей: lsmod | grep
- Просмотр системных логов: journalctl -b
Откат и аварийный план
Если новое ядро не загружается:
- Загрузитесь в GRUB и выберите предыдущую (рабочую) версию ядра в Advanced options
- Если GRUB не доступен, загрузитесь с Live-USB, смонтируйте /boot и восстановите старые файлы ядра
- При необходимости удалите проблемную версию из /boot и обновите grub: sudo update-grub или sudo grub-mkconfig -o /boot/grub/grub.cfg
Храните в /boot не только последний образ, но и несколько предыдущих — это здоровая практика.
Частые ошибки и когда не стоит компилировать ядро
Когда компиляция не оправдана:
- Вы используете сервер критичного времени простоя, и нет возможности протестировать откат
- Ваш дистрибутив предлагает готовые, оптимизированные ядра с поддержкой всех нужных устройств
- Вы не уверены в зависимости модулей (например, пропатченные драйверы сторонних вендоров)
Типичные ошибки:
- Отключение драйверов контроллера диска, из‑за чего rootfs недоступен
- Неправильная конфигурация initramfs: забыли включить необходимые модули
- Отсутствие поддержки криптования дисков в собранном ядре
- Неправильная процедура установки в /boot на системах с UEFI — убедитесь, что /boot/efi не пострадал
Безопасность и приватность
- Компилируя ядро, вы уменьшаете поверхность атаки, исключая ненужные подсистемы.
- С другой стороны, кастомные сборки требуют обновлений безопасности; не забудьте регулярно подтягивать патчи безопасности и пересобирать ядро по мере выхода исправлений.
- Личные данные не участвуют в процессе компиляции ядра напрямую, но при тестировании следует избегать выполнения ненадёжных модулей из непроверенных источников.
Чек-лист перед сборкой (роль: системный администратор)
- Сделан полный бэкап /boot и списка установленных пакетов
- Сохранён текущий образ ядра и System.map
- Установлены инструменты сборки (gcc, make, ncurses)
- Подготовлена live-микропрограмма для восстановления (Live-USB)
- Составлен список критичных драйверов (диск, сеть, графика)
- План отката документирован и доступен
Мини‑методология сборки
- Подготовка окружения: обновление системы, установка зависимостей
- Скачивание/распаковка исходников в отдельный каталог
- Создание конфигурации (localmodconfig или копия текущего .config)
- Ручная проверка и донастройка через make nconfig
- Сборка ядра и модулей (make -jN; make modules_install; make install)
- Обновление конфигурации загрузчика и тестовая загрузка
- Тестирование по чек-листу и мониторинг логов
Роль‑ориентированный краткий план
- Системный администратор: подготовка бэкапов, управление GRUB, тестирование кластерной доступности
- Девопс-инженер: автоматизация сборки, CI/CD для ядра (опционально), проверка совместимости с инфраструктурой
- Пользователь/энтузиаст: выбор опций, минимизация образа, тестирование на персональном оборудовании
Когда компиляция даёт преимущество
- Встраиваемые системы и окружения с жёсткими ограничениями по объёму
- Требование специфичных патчей или экспериментальных драйверов
- Оптимизация производительности под конкретный набор железа
Альтернативы компиляции вручную
- Использовать ядры, собранные дистрибутивом или сторонним репозиторием (например, Ubuntu Mainline, Debian backports)
- Использовать утилиты управления ядром (например, ukko, ukuu на Ubuntu — менеджеры версий)
- Использовать готовые дистрибутивы с минимальными ядрами (для встраиваемых систем)
Факт‑бокс
- Необходимые пакеты: gcc, make, libncurses5-dev, libssl-dev (названия зависят от дистрибутива)
- Основные команды: make localmodconfig, make nconfig, make -jN, make modules_install, make install
- Место исходников: /usr/src/ при установке из пакета или любой каталог при скачивании с kernel.org
Критерии приёмки
- Система загружается и работает без аварийных сообщений в логах
- Все критичные сервисы стартуют и функционируют корректно
- Нет потерянных данных после перезагрузки
- Производительность в пределах ожидаемой (встроенные тесты при необходимости)
Сценарии тестирования/качества
- Smoke-test: быстрая перезагрузка, вход в систему, простые операции IO
- Полный тест: сетевые задачи, нагрузочное тестирование дисковой подсистемы, стресс CPU
- Ручное тестирование периферии: Bluetooth, Wi‑Fi, USB-периферия, графический драйвер
Рекомендации по версии и обновлениям
- Используйте LTS‑версии ядра для серверов и критичных систем
- На десктопах можно пробовать более новые релизы, но тестируйте откат
- Поддерживайте репозиторий исходников и автоматизируйте патчинг безопасности
Итог и дальнейшие шаги
Компиляция ядра — мощный инструмент: с его помощью вы получите контроль над тем, что запускается в системе. Однако это также ответственность: вы сами отвечаете за совместимость и безопасность. Начните с тестовой машины или виртуальной среды, следуйте чек‑листам и сохраняйте резервные образы для быстрого отката.
Хотите шаблон playbook для автоматической сборки и тестирования ядра в CI? Нужен пример конфигурации .config для ноутбука с NVMe и Wi‑Fi Intel? Напишите, и я подготовлю примеры.
Image Credits: chombosan/Shutterstock
Похожие материалы
Слои в Canva: руководство по позиционированию
Лучшие уроки по анимации в Blender
Whistle Phone на iPad — бесплатные звонки
Создать электронную книгу в Pages на Mac
Как вставлять текст без форматирования