Подробный гайд: Настройка окружения для сборки кастомного ядра Linux

Пошаговая инструкция по подготовке системы, настройке зависимостей, конфигурации, компиляции и безопасной установке кастомного ядра Linux.

2026.04.24                  


Подробный гайд: Настройка окружения для сборки кастомного ядра LinuxПодробный гайд: Настройка окружения для сборки кастомного ядра Linux Сборка собственного ядра требует чистой, предсказуемой среды. Ниже приведён пошаговый протокол, актуальный для 2024–2026 гг., покрывающий подготовку хоста, зависимости, конфигурацию, компиляцию и безопасную установку.


1. Требования к хост-системе

Параметр Рекомендация
ОС Ubuntu/Debian, Fedora, Arch или аналог (нативная сборка)
ОЗУ ≥ 8 ГБ (для make -j$(nproc) без свопинга)
Диск ≥ 50 ГБ свободного места (исходники + объекты + несколько конфигов)
CPU Многопоточный (ускоряет сборку пропорционально ядрам)
Файловая система ext4/btrfs/xfs (избегайте ntfs/fat32 для дерева сборки)

Кросс-компиляция возможна, но для первого раза рекомендуется нативная сборка на x86_64.


2. Установка зависимостей

Debian/Ubuntu

sudo apt update
sudo apt install build-essential libncurses-dev bison flex libssl-dev \
  libelf-dev bc ccache git kmod qemu-system-x86 linux-headers-$(uname -r)

Fedora/RHEL

sudo dnf groupinstall "Development Tools"
sudo dnf install ncurses-devel bison flex elfutils-libelf-devel \
  openssl-devel bc ccache git kernel-devel qemu-system-x86

Arch/Manjaro

sudo pacman -S base-devel ncurses bison flex openssl libelf bc ccache git qemu

Что делает каждый пакет:

  • build-essential / base-devel: gcc, make, binutils, ld
  • libncurses-dev: make menuconfig
  • bison/flex: парсеры для Kconfig и сборки
  • libssl-dev/openssl-devel: криптографические модули ядра
  • libelf-dev/elfutils-libelf-devel: поддержка CONFIG_MODULE_SIG
  • bc: требуется для CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE
  • ccache: кэширование объектных файлов (ускоряет повторные сборки в 3–10×)
  • qemu: эмуляция для безопасного тестирования

3. Получение исходников ядра

Вариант A: Официальный Git (рекомендуется для разработки)

mkdir -p ~/kernel-dev && cd ~/kernel-dev
git clone --depth 1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

--depth 1 экономит ~30 ГБ. Для работы с историей уберите флаг.

Вариант B: Стабильный релиз

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 tag -l | grep '^v6\.'   # просмотр тегов
git checkout v6.6           # или v6.6-rc5, next/master и т.д.

4. Подготовка конфигурации

4.1. Базовая конфигурация

# Минимальный конфиг под текущую архитектуру
make defconfig

# Или: взять конфиг текущего ядра
cp /boot/config-$(uname -r) .config
make olddefconfig   # автоматически включает новые опции со значениями по умолчанию

4.2. Интерактивная настройка

make menuconfig
  • Навигация: ← → (меню), ↑ ↓ (список), Space (выбор [*], [M], [ ]), Esc (выход)
  • Поиск: / → введите символ (напр. SCHED, NVME, BPF)
  • Сохранение: SaveExit

4.3. Программное изменение конфига

# Включить модуль
scripts/config --enable CONFIG_DEBUG_INFO
# Выключить
scripts/config --disable CONFIG_MODULES
# Установить как модуль
scripts/config --module CONFIG_NFSD
# Применить изменения
make olddefconfig

Важно:

  • Перед серьёзными изменениями сохраните копию:
cp .config .config.backup

5. Компиляция

5.1. Настройка кэширования (опционально, но рекомендуется)

export CC="ccache gcc"   # или ccache clang
export PATH="/usr/lib/ccache:$PATH"
ccache -M 50G            # лимит кэша

5.2. Сборка

# Очистка перед сборкой (если конфиг менялся кардинально)
make mrproper   # удаляет всё, включая .config. Используйте осторожно!
# или
make clean      # оставляет .config и скомпилированные объекты

# Параллельная сборка
make -j$(nproc)
  • -j$(nproc) использует все логические ядра
  • При нехватке ОЗУ замените на -j$(nproc)/2
  • Вывод ошибок ищите по строкам Error, Failed, undefined reference

5.3. Сборка модулей (если не включено в основной процесс)

make modules

6. Установка и настройка загрузчика

sudo make modules_install
sudo make install

Эти команды:

  1. Копируют модули в /lib/modules/$(make kernelrelease)
  2. Копируют vmlinuz, System.map, config в /boot
  3. Автоматически вызывают update-grub (Debian/Ubuntu) или grub2-mkconfig (Fedora)

Инициализация initramfs (если не создался автоматически)

Дистрибутив Команда
Debian/Ubuntu sudo update-initramfs -c -k $(make kernelrelease)
Fedora/RHEL sudo dracut /boot/initramfs-$(make kernelrelease).img $(make kernelrelease)
Arch sudo mkinitcpio -k $(make kernelrelease) -c /etc/mkinitcpio.conf -g /boot/initramfs-$(make kernelrelease).img

Проверка загрузчика

grep -A 5 "menuentry" /boot/grub/grub.cfg | head -n 20

Убедитесь, что новое ядро появилось в списке и стоит не первым (чтобы можно было откатиться).


7. Тестирование в QEMU (безопасно!)

qemu-system-x86_64 \
  -kernel arch/x86/boot/bzImage \
  -initrd /boot/initramfs-$(make kernelrelease).img \
  -append "root=/dev/sda1 console=ttyS0 ro quiet" \
  -drive file=/dev/sda,format=raw,if=virtio \
  -m 4G -smp 4 -nographic

Для тестирования без реальной ФС используйте virtio-blk с образом или -cdrom с live-ISO.

После проверки выключите: Ctrl+A X

8. Лучшие практики и отладка

Задача Команда / Совет
Очистка дерева make mrproper (полная), make clean (частичная)
Просмотр опций zcat /proc/config.gz или make kernelversion
Ускорение повторных сборок ccache, make -j, CONFIG_IKCONFIG_PROC=y
Отладка модулей make modules_prepare, insmod, dmesg, modinfo
Проверка зависимостей ldd не работает с .ko, используйте modprobe --show-depends
Резервная копия Всегда имейте загрузочное ядро в GRUB с параметром systemd.unit=multi-user.target

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

Ошибка Причина Решение
fatal error: openssl/opensslv.h: No such file Нет заголовков OpenSSL libssl-dev / openssl-devel
error: flex: Command not found Нет flex flex / flex-devel
Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y Старый gcc/clang Обновите тулчейн или отключите CONFIG_UNWINDER_ORC
Ядро не грузится Неверный initramfs или параметры ядра Проверьте root=, init=, пересоберите initramfs
make зависает Нехватка ОЗУ Уменьшите -j, добавьте своп, отключите тяжёлые опции (CONFIG_DEBUG_INFO, KASAN)

Дополнительно: Secure Boot и UEFI

Если включён Secure Boot:

  1. Сгенерируйте пару ключей: scripts/sign-file требует CONFIG_MODULE_SIG_KEY
  2. Подпишите ядро и модули: sbsign --key db.key --cert db.crt --output vmlinuz.signed vmlinuz
  3. Или отключите Secure Boot на время тестирования.

Чек-лист перед перезагрузкой

  • [ ] make -j$(nproc) завершился без ошибок
  • [ ] sudo make modules_install install отработал
  • [ ] initramfs создан для новой версии
  • [ ] В /boot/grub/grub.cfg есть запись с новым ядром
  • [ ] Старое ядро осталось в меню и работает
  • [ ] Резервная копия .config сохранена