Сборка ядра из исходников [201.2]

Рейтинг: 67.6% · 8 голосов
Курс LPIC-2 (201-450 и 202-450): емкостное планирование, ядро, хранилище и RAID/LVM, продвинутая сеть, DNS/BIND, Apache/Nginx, Samba/NFS, DHCP/LDAP, почта, безопасность и VPN.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Сборка ядра из исходников [201.2]

Сообщение Sergey_Sysadmin »

Оглавление курса (41)
  1. Введение в LPIC-2 и уровень инженера
  2. Измерение и устранение проблем с ресурсами [200.1]
  3. Прогнозирование потребности в ресурсах
  4. Компоненты ядра Linux [201.1]
  5. Сборка ядра из исходников [201.2] (вы здесь)
  6. Управление модулями ядра в рантайме [201.3]
  7. Кастомизация запуска системы [202.1]
  8. Восстановление системы [202.2]
  9. Альтернативные загрузчики [202.3]
  10. Работа с файловой системой Linux [203.1]
  11. Обслуживание файловых систем [203.2]
  12. Создание и настройка опций ФС [203.3]
  13. Программный RAID [204.1]
  14. Тюнинг доступа к устройствам хранения [204.2]
  15. Менеджер логических томов LVM [204.3]
  16. Базовая конфигурация сети [205.1]
  17. Продвинутая конфигурация сети [205.2]
  18. Диагностика сетевых проблем [205.3]
  19. Сборка и установка программ из исходников [206.1]
  20. Резервное копирование [206.2]
  21. Оповещение пользователей о событиях
  22. DNS-сервер BIND: базовая настройка [207.1]
  23. Зоны DNS: создание и сопровождение [207.2]
  24. Безопасность DNS-сервера [207.3]
  25. Веб-сервер Apache: базовая настройка [208.1]
  26. Apache и HTTPS [208.2]
  27. Кэширующий прокси Squid [208.3]
  28. Веб-сервер и обратный прокси Nginx [208.4]
  29. Файловый сервер Samba [209.1]
  30. Файловый сервер NFS [209.2]
  31. DHCP-сервер [210.1]
  32. Аутентификация PAM и SSSD [210.2]
  33. Использование LDAP-клиента
  34. Сервер OpenLDAP [210.4]
  35. Почтовый сервер Postfix [211.1]
  36. Управление доставкой почты и Sieve [211.2]
  37. Доступ к почтовым ящикам: Dovecot [211.3]
  38. Linux как маршрутизатор и фильтр [212.1]
  39. FTP-серверы [212.2]
  40. SSH углублённо [212.3]
  41. Безопасность, IDS и VPN [212.4 + 212.5]
Урок 4. Сборка ядра из исходников [201.2]

Ядро в дистрибутиве уже собрано и обновляется пакетным менеджером, поэтому в 2026 году собирать его руками нужно редко. Но ситуации остаются: нужна свежая фича из mainline, которой нет в репозитории, требуется наложить патч под специфичное железо или баг-фикс из апстрима, надо отключить лишние подсистемы для встраиваемого устройства или включить отладочные опции для воспроизведения проблемы. Экзамен 201.2 проверяет, что вы понимаете весь конвейер: где взять исходники, как сформировать .config, как собрать, установить модули и образ, сгенерировать initramfs и прописать ядро в загрузчик. Этим и займёмся.

Изображение

Как это работает

Исходники ядра - это дерево из десятков тысяч файлов на C и ассемблере плюс система сборки на базе make (Kbuild). Сердце процесса - файл .config в корне дерева. В нём для каждой опции ядра записано одно из трёх состояний: y (вкомпилировать в монолитный образ vmlinuz), m (собрать как загружаемый модуль .ko) или не задано (выключено). От этого файла зависит абсолютно всё, что соберётся.

Собрать всё подряд нереально и не нужно, поэтому .config почти всегда берут за основу готовый и правят точечно. Источников основы три: defconfig (минимальный разумный конфиг под архитектуру от мейнтейнеров), конфиг работающего ядра из /boot/config-$(uname -r) или /proc/config.gz, и старый .config, который надо привести к новой версии через oldconfig.

Сборка даёт два артефакта. Первый - сам образ ядра (на x86 это bzImage, после установки лежит как /boot/vmlinuz-ВЕРСИЯ). Второй - модули, которые ставятся в /lib/modules/ВЕРСИЯ. Но ядру при старте нужны драйверы для того, чтобы вообще добраться до корневой ФС (контроллер диска, LVM, LUKS, файловая система). Если эти драйверы собраны модулями, возникает курица и яйцо: модуль лежит на диске, который ещё не смонтирован. Решение - initramfs: маленький временный корень в оперативке, куда заранее кладут нужные модули и скрипты. Загрузчик подаёт ядру и vmlinuz, и initramfs, ядро монтирует initramfs, подгружает драйверы, находит настоящий корень и пересаживается на него.

Последний шаг - рассказать про новое ядро загрузчику (GRUB2 или systemd-boot). Современные дистрибутивы делают это автоматически через хуки kernel-install и /etc/kernel/postinst.d, поэтому при ручной сборке надо либо встроиться в эти механизмы, либо обновить конфиг загрузчика руками.

Команды и примеры

Получение исходников. Tarball с kernel.org (в 2026 актуальна ветка 6.x):

Код: Выделить всё

cd /usr/src
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.30.tar.xz
tar xf linux-6.12.30.tar.xz
cd linux-6.12.30
Дистрибутивные исходники (с патчами вендора):

Код: Выделить всё

# Debian/Ubuntu
apt install linux-source
tar xf /usr/src/linux-source-*.tar.xz -C /usr/src

# RHEL/Fedora - через пакет с исходником
dnf download --source kernel
rpm -i kernel-*.src.rpm
Подготовка .config. Самый безопасный вариант - стартовать с конфига текущего ядра:

Код: Выделить всё

# взять рабочий конфиг как основу
zcat /proc/config.gz > .config        # если включён CONFIG_IKCONFIG_PROC
# или
cp /boot/config-$(uname -r) .config

make oldconfig      # дотягивает конфиг до новой версии, спросит про новые опции
make olddefconfig   # то же, но новым опциям молча даёт значения по умолчанию
Прочие способы задать конфиг:

Код: Выделить всё

make defconfig      # разумный дефолт под архитектуру
make menuconfig     # текстовое меню (нужен пакет ncurses-devel / libncurses-dev)
make nconfig        # альтернативное меню
make localmodconfig # урезает конфиг до реально загруженных сейчас модулей (lsmod)
Сборка. Распараллеливаем по числу ядер:

Код: Выделить всё

make -j$(nproc)              # собрать образ и модули
# результат: arch/x86/boot/bzImage и куча .ko
Установка модулей и ядра:

Код: Выделить всё

make modules_install        # кладёт модули в /lib/modules/6.12.30/
make install                # копирует ядро в /boot, зовёт kernel-install
Генерация initramfs. Тут два мира:

Код: Выделить всё

# RHEL/Fedora/SUSE - dracut
dracut --force /boot/initramfs-6.12.30.img 6.12.30

# Debian/Ubuntu - initramfs-tools
update-initramfs -c -k 6.12.30
# или напрямую
mkinitramfs -o /boot/initrd.img-6.12.30 6.12.30
Заметьте: make install в современных дистрибутивах обычно уже сам дёргает kernel-install, который и initramfs соберёт, и загрузчик обновит. Ручные dracut/mkinitramfs нужны, когда вы собираете отдельно от инфраструктуры дистрибутива.

Добавление в загрузчик:

Код: Выделить всё

# GRUB2: Debian/Ubuntu
update-grub
# GRUB2: RHEL/Fedora
grub2-mkconfig -o /boot/grub2/grub.cfg

# где kernel-install и BLS - просто скинуть запись
kernel-install add 6.12.30 /boot/vmlinuz-6.12.30
Частые грабли
  • Забыли поставить заголовки и тулчейн: нет gcc, make, fl:ex, bison, libelf-dev/elfutils-libelf-devel, libssl-dev/openssl-devel. Сборка падает на ранней стадии.
  • Драйвер корневого диска или ФС собран модулем (m), но не попал в initramfs - получаете kernel panic "unable to mount root fs". Либо вкомпилируйте такие драйверы в ядро (y), либо проверьте, что dracut их включил.
  • make localmodconfig режет всё, что не загружено прямо сейчас. Не воткнут USB-адаптер - после перезагрузки он не заработает. Удобно, но коварно.
  • Отключили CONFIG_MODVERSIONS или сменили версию, а старые external-модули (DKMS, проприетарный драйвер) не пересобраны - они не загрузятся.
  • make install не перезаписывает initramfs, если вы не пересобрали его под ТУ ЖЕ версию: правите .config, но имя ядра то же - старый initramfs остаётся, изменения не применяются. Всегда явно пересобирайте initramfs.
  • Один и тот же LOCALVERSION/имя ядра у двух сборок: новая затирает модули старой в /lib/modules. Меняйте суффикс через CONFIG_LOCALVERSION или make ... LOCALVERSION=-test.
Мини-лаба
  • На виртуалке (не на проде) поставьте тулчейн: в Debian/Ubuntu build-essential, libncurses-dev, bison, flex, libssl-dev, libelf-dev; в Fedora/RHEL группу "Development Tools" плюс ncurses-devel, openssl-devel, elfutils-libelf-devel.
  • Скачайте с kernel.org свежий stable-tarball ветки 6.x, распакуйте, зайдите в каталог.
  • Скопируйте конфиг текущего ядра в .config и выполните make olddefconfig.
  • Через make menuconfig задайте свой суффикс в General setup -> Local version и сохраните.
  • Соберите ядро командой make -j$(nproc), затем make modules_install и make install.
  • Сгенерируйте initramfs нужным для вашего дистрибутива инструментом (dracut или update-initramfs) под новую версию.
  • Обновите загрузчик (update-grub или grub2-mkconfig), перезагрузитесь, выберите новое ядро и проверьте uname -r.
Контрольные вопросы
  • Чем отличаются значения y, m и пустое для опции в .config и как это влияет на артефакты сборки?
  • В чём разница между make oldconfig, make olddefconfig и make localmodconfig?
  • Зачем нужен initramfs и при каких настройках ядра без него можно обойтись?
  • Какие инструменты генерируют initramfs в семействах Debian и RHEL и чем они отличаются по подходу?
  • Что делает make modules_install и почему важно не пересекать имена/версии ядер?
  • Какие шаги выполняет make install в современном дистрибутиве и как новое ядро попадает в меню GRUB2?
👍4 ❤️2 🔥 😄 🤔1
Аватара пользователя
muhamed
Сообщения: 1
Зарегистрирован: 11 май 2026, 06:08

Re: Сборка ядра из исходников [201.2]

Сообщение muhamed »

А если make install сам зовёт kernel-install и тот уже собирает initramfs и правит grub, то ручные dracut и update-grub получаются лишними? Или лучше всё равно проверять руками?
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
ansibleaddict
Сообщения: 1
Зарегистрирован: 15 май 2026, 09:19

Re: Сборка ядра из исходников [201.2]

Сообщение ansibleaddict »

Поймал ту самую panic unable to mount root: драйвер nvme был модулем и в initramfs не залетел. Пересобрал с CONFIG_BLK_DEV_NVME=y и завелось.
👍 ❤️1 🔥1 😄 🤔
Ответить
← Предыдущая глава
Компоненты ядра Linux [201.1]
Следующая глава →
Управление модулями ядра в рантайме [201.3]

Все главы курса «LPIC-2: инженер Linux (201 + 202)»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-2: инженер Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость