Сборка мини-ядра#

Что такое "мини-ядро"?#

Ядро Linux на внешнем носителе представлено из двух частей: "остов" ядра или его базовый образ называемый vmlinuz и множество модулей, располагающихся в /usr/lib/modules и загружаемых по требованию. Как правило модули ядра представляют собой различные драйверы, файловые системы и вспомогательные объекты, все они по соглашению носят суффикс .ko (kernel object). Стоит отметить, что некоторые модули могут являться обязательными к загрузке и быть "встроенными" как часть базового образа. В этом случае такие модули нельзя выгрузить во время работы системы.

Мини-ядро - это условное понятие, которое обозначает ядро собранное с минимальным количеством модулей, оставляя лишь реально необходимые для работы системы на конкретной машине. Смысл в использовании такого ядра состоит преимущественно в ускорении процесса самой сборки и экономии пространства на диске. Также уменьшение количества модулей потенциально может улучшить безопасность системы, уменьшив поверхность для атаки.

Как понять какие модули нужны системе?#

Так как мини-ядро можно получить только путём пересборки ядра с соответствующей для системы конфигурацией, то крайне важно заранее понять какие модули нужны для её работы. В классическом варианте система сборки ядра Kbuild имеет "пресет", называемый localmodcfg, который просто берёт список загруженных на данный момент модулей сборочной машины и использует его при конфигурации ядра. Такой способ не является достаточно надёжным для использования в большинстве случаев, так как некоторые модули могут быть просто не загружены на момент сборки, но все ещё быть необходимыми для правильной работы системы, например модули, являющиеся частью образа начального окружения initramfs, используемые только при загрузке системы и выгружаемые после её завершения.

modprobed-db#

По этой причине был создан специальный индексатор модулей - modprobed-db, который делает снимок списка используемых модулей с некоторым интервалом (по умолчанию раз в час) и аккумулирует их в отдельном файле по пути ~/.config/modprobed.db, который затем указывается при сборке мини-ядра.

Его можно установить вручную или из AUR. Если ваш дистрибутив Arch Linux или основанный на нём, то рекомендуется использовать второй способ:

git clone https://aur.archlinux.org/modprobed-db.git
cd modprobed-db
makepkg -sricCf

После установки необходимо включить службу-таймер, которая и будет собирать информацию об используемых модулях в фоновом режиме:

systemctl --user enable --now modprobed-db.service modprobed-db.timer

Далее следует активно пользоваться всеми возможностями вашей системы, использовать USB-порты для подключения различной периферии, CD-носители (если имеются) и т. д. Чтобы все редко используемые драйверы устройств были проиндексированы в списке модулей и вам не пришлось повторно пересобирать ядро для их добавления.

Готовые списки#

Проект linux-tkg ведет готовый список модулей, который позволяет получить наиболее часто используемые в "среднем по больнице" модули для простых ПК: Frogging-Family/linux-tkg

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

Сборка#

После того как список модулей был составлен, можно переходить непосредственно к сборке ядра с его использованием. При классической "ручной" сборке ядра он указывается как значение переменной LSMOD:

make LSMOD=$HOME/.config/modprobed.db localmodconfig

Однако такой способ не следует использовать, если у вас есть возможность собрать правильно оформленный пакет для ядра. В Arch Linux большинство версий ядер, устанавливаемых из AUR имеют соответствующую переменную в своих PKGBUILD скриптах, которая позволяет использовать базу модулей от modprobed-db. Как правило она называется _localmodcfg, значение для которой указывается либо внутри самого PKGBUILD файла, либо как одноименная переменная окружения.

Рассмотрим сборку мини-версии на примере ядра linux-cachyos:

git clone https://github.com/CachyOS/linux-cachyos
cd linux-cachyos/linux-cachyos
_makenconfig=yes _localmodcfg=yes makepkg -sricCf

Как можно видеть, здесь _localmodcfg передаётся как простая переменная окружения, так что редактировать сборочный скрипт PKGBUILD нет необходимости. _makenconfig используется для включения ручной настройки конфига в случае, если вы хотите выключить или включить сборку тех или иных модулей самостоятельно через интерактивное меню.