Приветсвую всех читателей Хабра. В этой статье я хочу поделиться с вами способами скомпилировать ядро Linux под себя, использовав лишь необходимые вам модули, либо полностью сохранив старый конфиг. Я решил не привязывать эту статью к определенному дистрибутиву, сделав ее универсальной для большинства дистрибутивов Linux.

Для чего нужно собирать ядро?

С задачами большинства пользователей отлично справляется бинарное ядро от практически любого дистрибутива. Однако сборка собственного Linux может пригодиться в некоторых случаях:

  • Требуется новейшая версия ядра

  • Необходимо вкомпилировать специфический драйвер или микрокод

  • Нужно облегчить ОС

  • Просто хочется лучше понять устройство системы

Я указал популярные причины, но существует множество других вариантов использования кастомного ядра. В этой статье, как ранее упомяналось, описывается процесс сборки десктопного ядра именно под вашу конфигурацию. Это ядро будет работать на вашем компьютере, но на других устройствах может работать некорректно или не работать вовсе. Ладно, пора скачивать архив.

Подготавливаем исходник

Для сборки ядра, взятого не из репозитория дистрибутива (как показано в этой статье), необходимо отключить Secure Boot в UEFI/BIOS, т.к он откажется запускать неподписанный vmlinuz. Для пользователей Ubuntu, Fedora и многих других бинарных дистрибутивов, необходимо отключить проверку сертификатов. Для этого, стираем пути к сертификатам дистрибутива:

scripts/config --set-str SYSTEM_TRUSTED_KEYS
scripts/config --set-str SYSTEM_REVOCATION_KEYS
# Для пользователей RHEL-based, отключаем BTF
scripts/config --disable DEBUG_INFO_BTF

Теперь проверьте зависимости, всего ли вам хватает для компиляции, достаточо ли свежий ваш софт (компиляторы, инструменты сборки). Я не буду долго расписывать процесс подготовки ядра, т.к. он подробно задокументирован на Arch Wiki.

Можно использовать любой каталог для компиляции, но для удобства создадим директорию сборки и перейдем в нее:

mkdir ~/kernelbuild && cd ~/kernelbuild

За основу я возьму "ванильное" ядро с сайта kernel.org. Пусть этим исходником будет свежий linux-7.1.2:

wget https://www.kernel.org/pub/linux/kernel/v7.x/linux-7.1.2.tar.xz

Теперь, распаковываем архив и переходим в него:

tar -xf linux-7.1.1.tar.xz && cd linux-7.1.2

Выполняем глубокую отчистку ядра Linux от объектных файлов:

make mrproper

Все, теперь исходник готов к сборке. А сейчас, немного теории.


Конфигурируем новое ядро

Существуют разные способы конфигурирования Linux. В этой таблице представлено 4 способа создания .config файла:

Способ

Описание

make menuconfig или make nconfig

Инструменты, позволяющие вам самим выбрать необходимые параметры. Самый гибкий, но малоавтоматизированный метод, все делается вручную.

make localmodconfig

Переносит в .config загруженные на данный момент модули ядра (вывод команды lsmod). Если модуль не загружен в системе в момент выполнения, он не окажется в новом ядре. Этот способ может убрать важные модули, поэтому советую использовать третий способ.

make localmodconfig в связке с modprobed-db

Лучший способ для выполнения поставленной задачи. Команда modprobed-db store записывает используемые в момент выполнения модули в ~/.config/modprobed.db -- далее их можно передать в make localmodconfig через переменную $LSMOD. Можно прописать выполнение modprobed-db store в планировщик задач.

make oldconfig и make olddefconfig

Вы можете поместить в распакованный архив ядра файл .config.old (конфиг от старого ядра или с GitHub) и собрать ядро по ним. Команда make oldconfig дает вам выбор в выборе новых параметров, а make olddefconfig выставляет значения по умолчанию, не задавая вопросов.

Настройка ядра с нуля нецелесообразна в нашем случае. Однако, через make nconfig/make menuconfig можно добавить в ядро то, что нельзя вшить модулем. Иногда это бывает очень полезным, но наша цель -- собрать десктопное ядро, без каких либо экспериментальных фич, редких файловых систем, поддержки старых платформ и т.д. Поэтому, я описал остальные способы из этой таблицы, ведь все они подходят для нашей цели.

make localmodconfig

Если вас устраивают модули, показанные командой lsmod, вы можете воспользоваться этим способом. Для переноса загруженных на данный момент модулей в новую систему, просто введите это, находясь в ~/kernelbuild/linux-7.1.2:

make localmodconfig

make localmodconfig + modprobed-db store

Если вас не устраивают модули, выведенные на экран через lsmod (не хватает нужного модуля), воспользуйтесь этим методом. В отличии от make localmodconfig, modprobed-db store сохраняет в своем конфиге ранее использованные модули, а при повторном выполнении дописывает новые (если они появились), не трогая уже записанные модули. Однако этот способ требует времени на сборку информации о используемых вами модулях и при единоразовом выполнении не имеет смысла. Установить modprobed-db можно из AUR (для Arch-based) и с GitHub. В репозиториях Gentoo пакет находится в sys-kernel/modprobed-db.

Cледует добавить автоматическое выполнение modprobed-db store в свой планировщик задач, например cron или Systemd Timers. Если вы используете cron, воспользуйтесь crontab -e и пропишите эту строку (выполнение каждые 6 часов):

0 */6 * * *     /usr/bin/modpobed-db store &> /dev/null

Примечание: в Gentoo Handbook есть ошибка. В этом руководстве сказано вставить приведенную выше строку в файл /etc/crontab, однако в ней не указано имя пользователя. Это противоречит синтаксису системного crontab, т.к. cron будет принимать /usr/bin/modprobed-db как пользователя. Скорее всего, cron просто проигнорирует эту строку из-за неизвестного пользователя, а нахождение ошибки усложняет &> /dev/null.

Если вы используете дистрибутив с системой инициализации Systemd, вам достаточно добавить service в автозагрузку (даже необязательно использовать modprobed-db.timer):

systemctl --user enable modprobed-db.service
systemctl --user start modprobed-db.service

Допустим, прошла неделя с момента добавления modprobed-db store в планировщик задач. Если вы пользовались системой, то скорее всего список модулей в ~/.config/modprobed.db изменился. На всякий случай можно последний раз выполнить modprobed-db store и сконфигурировать ядро:

modprobed-db store
cd ~/kernelbuild/linux-7.1.2
make LSMOD=~/.config/modprobed.db localmodconfig

make oldconfig

Если вы хотите использовать готовый конфигурационный файл, этот способ поможет вам применить его к новому ядру. Вам нужно перенести ваш рабочий .config в ~/kernelbuild/linux-7.1.1 и выполнить одну из команд. Если хотите, чтобы конфигуратор выставил значения по умолчанию для новых параметров, введите:

make olddefconfig

Если вы хотите выставить свои значения, воспользуйтесь командой:

make oldconfig

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


Компиляция и установка

В директории ~/kernelbuild/linux-7.1.2 , скомпилируем ядро:

make -j $(nproc)

$(nproc) указыает компилятору задействовать все потоки процессора. Вы можете использовать меньшее количество ядер, передав -j свое число, например -j8 .

Во многих дистрибутивах (Debian, Fedora, Ubuntu) в make install "завернут" скрипт, генерирующий Initramfs. В некоторых системах (например Gentoo) Initramfs не используюестя. После окончания компиляции Linux, выполняем сборку модулей и установку:

make modules_install
make install

ВНИМАНИЕ: если вы собираете ядро на Arch-based дистрибутиве с использованием make localmodconfig, вам необходимо сгенерировать Initramfs вручную, т.к. make install в вашем дистрибутиве гораздо минималистичнее. Процесс расписан на Arch Wiki.


Обновлеям загрузчик

Наше ядро собрано. Оно лежит в каталоге /boot и ждет своего первого запуска. Осталось лишь обновить GRUB и пользоваться новой системой. Для обновления загрузчика в разных дистрибутивах, используются разные команды:

  • Debian-based/Ubuntu-based: update-grub

  • Arch-based/Gentoo: grub-mkconfig -o /boot/grub/grub.cfg

  • RHEL-based: grub2-mkconfig -o /boot/grub2/grub.cfg

Загрузчик обновлен. Теперь можно перезагружаться, выбирать новое ядро и пользоваться системой.

Итоги

Ядро сконфигурировано одним из способов, собрано, загрузчик обновлен. Система полностью готова к работе на новом Linux. Вы можете удалить бинарное ядро через пакетный менеджер или оставить и выбирать его при загрузке (если есть желание или необходимость). На этом все. Всем удачи!