Сборка ядра из исходников обычно ассоциируется с энтузиастами, но на практике к ней приходят по конкретным причинам: поддержать оборудование, которое новые дистрибутивы уже не оснащают драйверами, вырезать лишние подсистемы ради скорости загрузки, внести собственную правку или получить стабильную версию для рабочей машины. Ниже — полный цикл под 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.

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

  1. В /boot появился свежий initrd.img для новой версии.
  2. В /boot/grub/grub.cfg есть пункт с суффиксом вашей сборки.
  3. Старое ядро осталось в меню — это страховка на случай неудачи.
  4. Свободного места в /boot больше ста мегабайт: старые ядра складываются туда же.

Если раздел /boot маленький (двухсот-трёхсот мегабайт на старых разметках), чистите его регулярно: пакетные ядра удаляются через sudo apt remove linux-image-старая-версия и sudo apt autoremove, а собственные сборки — удалением файлов образа и каталога /lib/modules с последующим обновлением GRUB.

Итог

Сборка ядра сводится к четырём шагам: поставить зависимости, взять конфигурацию текущего ядра, уточнить её через olddefconfig или localmodconfig и скомпилировать в пакет. Пакетный путь делает установку и откат тривиальными, ручной — универсальным, но требует внимания к initramfs и загрузчику. Главное правило: не перезагружайтесь, пока не убедились, что старое ядро осталось в меню, а новый initramfs на месте.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте