Подробный гайд: Настройка окружения для сборки кастомного ядра 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,ldlibncurses-dev:make menuconfigbison/flex: парсеры для Kconfig и сборкиlibssl-dev/openssl-devel: криптографические модули ядраlibelf-dev/elfutils-libelf-devel: поддержкаCONFIG_MODULE_SIGbc: требуется дляCONFIG_CC_OPTIMIZE_FOR_PERFORMANCEccache: кэширование объектных файлов (ускоряет повторные сборки в 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) - Сохранение:
Save→Exit
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
Эти команды:
- Копируют модули в
/lib/modules/$(make kernelrelease) - Копируют
vmlinuz,System.map,configв/boot - Автоматически вызывают
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:
- Сгенерируйте пару ключей:
scripts/sign-fileтребуетCONFIG_MODULE_SIG_KEY - Подпишите ядро и модули:
sbsign --key db.key --cert db.crt --output vmlinuz.signed vmlinuz - Или отключите Secure Boot на время тестирования.
Чек-лист перед перезагрузкой
- [ ]
make -j$(nproc)завершился без ошибок - [ ]
sudo make modules_install installотработал - [ ] initramfs создан для новой версии
- [ ] В
/boot/grub/grub.cfgесть запись с новым ядром - [ ] Старое ядро осталось в меню и работает
- [ ] Резервная копия
.configсохранена