Сборка ядра из исходников обычно ассоциируется с энтузиастами, но на практике к ней приходят по конкретным причинам: поддержать оборудование, которое новые дистрибутивы уже не оснащают драйверами, вырезать лишние подсистемы ради скорости загрузки, внести собственную правку или получить стабильную версию для рабочей машины. Ниже — полный цикл под Debian, Ubuntu и Linux Mint: зависимости, конфигурация, компиляция в пакеты, установка, обновление загрузчика и разбор типичных ошибок.
Зависимости и исходники
Собирать удобно в домашнем каталоге: права суперпользователя нужны только на этапе установки модулей. Сначала ставим пакеты для сборки — их состав стабилен и меняется годами.
sudo apt update
sudo apt install build-essential bc kmod cpio flex bison libncurses-dev \
libssl-dev libelf-dev dwarves python3 git
dpkg -l build-essential libssl-dev libelf-dev | grep ^ii
Пакет dwarves поставляет утилиту pahole: без неё ядро соберётся, но без BTF-информации, и eBPF-инструменты вроде bpftrace работать перестанут. Пакеты libelf-dev, flex и bison нужны для генерации парсеров и отладочных секций, libssl-dev — для подписи модулей. Исходники скачиваем с kernel.org и проверяем подпись:
mkdir -p ~/src && cd ~/src
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.tar.sign
xz -cd linux-6.12.tar.xz | gpg --verify linux-6.12.tar.sign -
tar -xf linux-6.12.tar.xz && cd linux-6.12
Подпись сделана над несжатым архивом, поэтому проверять её удобнее в потоке — так не приходится распаковывать tar дважды. Если gpg отвечает «No public key», подтяните ключи разработчиков: gpg --locate-keys torvalds@kernel.org gregkh@kernel.org.
Если нужен конкретный тег или свой набор патчей, вместо тарбола берём git: git clone --depth 1 --branch v6.12 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git. Глубокая выборка сокращает загрузку с сотен мегабайт до десятков.
Конфигурация: от текущей до своей
Самый безопасный старт — копия конфигурации уже работающего ядра. Она гарантирует, что корневая файловая система, контроллер диска и сетевой интерфейс останутся рабочими.
cp /boot/config-$(uname -r) .config
make olddefconfig
grep -E "CONFIG_LOCALVERSION|CONFIG_DEBUG_INFO_BTF" .config
Команда olddefconfig заполняет новые опции значениями по умолчанию и не задаёт вопросов. Дальше определяем задачу сборки. Для точной настройки есть make menuconfig: раздел «General setup → Local version» добавляет суффикс к номеру — например -office, и в uname -r собственное ядро сразу отличается от пакетного. Если нужен доступ к конфигурации работающего ядра, включите опцию CONFIG_IKCONFIG_PROC — тогда /proc/config.gz всегда под рукой.
Когда цель — минимальное ядро, сужаем конфигурацию под реально загруженные модули:
# сначала поднимите всё нужное: док-станцию, USB-гарнитуру, принтер
lsmod > /tmp/lsmod.txt
make localmodconfig
make olddefconfig
localmodconfig оставляет только то, что загружено в момент запуска, поэтому список lsmod — это фактически спецификация сборки. Модуль, которого не было в списке, просто не попадёт в ядро: позже modprobe завершится сообщением «Module not found», и конфигурацию придётся дополнять новой сборкой. Разновидность localyesconfig встраивает те же модули в образ — загрузка становится быстрее, но файл ядра заметно тяжелее. Для рабочей станции достаточно localmodconfig.
Компиляция и упаковка
Компилируем с числом задач по числу ядер. Для Debian и Ubuntu есть родной способ получить установочные пакеты — с ним проще всего потом откатиться.
make -j$(nproc) bindeb-pkg LOCALVERSION=-office
ls -lh ../linux-image-*.deb ../linux-headers-*.deb
Команда кладёт .deb в родительский каталог, рядом с деревом исходников. Обычно сборка занимает от пяти до двадцати пяти минут: сначала строятся образы ядра и vmlinux, затем тысячи модулей. Если процесс падает от нехватки памяти, уменьшите параллелизм — make -j2 bindeb-pkg медленнее, но доходит до конца. Для ускорения повторных сборок полезен ccache: поставьте пакет, включите обёртку компилятора и повторите команду — уже скомпилированные единицы возьмутся из кэша, и повторные проходы по дереву идут заметно быстрее.
Пакетная установка — явное преимущество перед ручным make install: менеджер пакетов знает о прошлых версиях и позволяет удалить их одной командой.
sudo dpkg -i ../linux-image-6.12.0-office_*.deb ../linux-headers-6.12.0-office_*.deb
sudo update-grub
ls -l /boot/vmlinuz-* /boot/initrd.img-*
Ручная установка из дерева
Альтернативный путь универсал и работает на любых дистрибутивах, но следить за свободным местом в /boot придётся самому.
sudo make modules_install
sudo make install
# если запись в GRUB не появилась:
sudo grub-mkconfig -o /boot/grub/grub.cfg
Шаг modules_install копирует модули в /lib/modules/6.12.0-office и строит карту зависимостей, без которой modprobe ничего не найдёт. Шаг make install раскладывает образ и System.map и запускает скрипт installkernel: на Debian и Ubuntu он обычно сам обновляет initramfs и добавляет пункт в меню. Если этого не произошло — выполните обе команды вручную.
Проверка после перезагрузки
Новое ядро активно, если версия совпала с той, что указана при сборке, а модули лежат на своём месте:
uname -r
ls /lib/modules/$(uname -r) | head
zcat /proc/config.gz | grep CONFIG_LOCALVERSION
Типичные ошибки и их причины:
- «Cannot use CONFIG_STACK_VALIDATION» — не установлен
libelf-dev. - Ошибка при генерации ключа подписи модулей — нет
libssl-devилиopenssl. - Предупреждение про
paholeи пустой BTF — поставьтеdwarves. - После перезагрузки пустой экран или переход в оболочку initramfs — корневая файловая система не встроена в ядро и не попала в initramfs. Загрузитесь из старого пункта GRUB и пересоберите с
CONFIG_EXT4_FS=y. - Secure Boot отказался запускать образ,
modprobeотвечает «Required key not available» — отключите Secure Boot в прошивке или подпишите ядро своим ключом. - Меню GRUB осталось прежним после
make install— обновите его командойgrub-mkconfig.
Чек-лист перед перезагрузкой
- В
/bootпоявился свежийinitrd.imgдля новой версии. - В
/boot/grub/grub.cfgесть пункт с суффиксом вашей сборки. - Старое ядро осталось в меню — это страховка на случай неудачи.
- Свободного места в
/bootбольше ста мегабайт: старые ядра складываются туда же.
Если раздел /boot маленький (двухсот-трёхсот мегабайт на старых разметках), чистите его регулярно: пакетные ядра удаляются через sudo apt remove linux-image-старая-версия и sudo apt autoremove, а собственные сборки — удалением файлов образа и каталога /lib/modules с последующим обновлением GRUB.
Итог
Сборка ядра сводится к четырём шагам: поставить зависимости, взять конфигурацию текущего ядра, уточнить её через olddefconfig или localmodconfig и скомпилировать в пакет. Пакетный путь делает установку и откат тривиальными, ручной — универсальным, но требует внимания к initramfs и загрузчику. Главное правило: не перезагружайтесь, пока не убедились, что старое ядро осталось в меню, а новый initramfs на месте.