Приветсвую всех читателей Хабра. В этой статье я хочу поделиться с вами способами скомпилировать ядро Linux под себя, использовав лишь необходимые вам модули, либо полностью сохранив старый конфиг. Я решил не привязывать эту статью к определенному дистрибутиву, сделав ее универсальной для большинства дистрибутивов Linux.
Для чего нужно собирать ядро?
С задачами большинства пользователей отлично справляется бинарное ядро от практически любого дистрибутива. Однако сборка собственного Linux может пригодиться в некоторых случаях:
-
Требуется новейшая версия ядра
-
Необходимо вкомпилировать специфический драйвер или микрокод
-
Нужно облегчить ОС
-
Просто хочется лучше понять устройство системы
Я указал популярные причины, но существует множество других вариантов использования кастомного ядра. В этой статье, как ранее упомяналось, описывается процесс сборки десктопного ядра именно под вашу конфигурацию. Это ядро будет работать на вашем компьютере, но на других устройствах может работать некорректно или не работать вовсе. Ладно, пора скачивать архив.
Подготавливаем исходник
Для сборки ядра, взятого не из репозитория дистрибутива (как показано в этой статье), необходимо отключить Secure Boot в UEFI/BIOS, т.к он откажется запускать неподписанный vmlinuz. Для пользователей Ubuntu, Fedora и многих других бинарных дистрибутивов, необходимо отключить проверку сертификатов. Для этого, стираем пути к сертификатам дистрибутива:
scripts/config --set-str SYSTEM_TRUSTED_KEYSscripts/config --set-str SYSTEM_REVOCATION_KEYS# Для пользователей RHEL-based, отключаем BTFscripts/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 файла:
|
Способ |
Описание |
|
|
Инструменты, позволяющие вам самим выбрать необходимые параметры. Самый гибкий, но малоавтоматизированный метод, все делается вручную. |
|
|
Переносит в .config загруженные на данный момент модули ядра (вывод команды |
|
|
Лучший способ для выполнения поставленной задачи. Команда |
|
|
Вы можете поместить в распакованный архив ядра файл |
Настройка ядра с нуля нецелесообразна в нашем случае. Однако, через 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.servicesystemctl --user start modprobed-db.service
Допустим, прошла неделя с момента добавления modprobed-db store в планировщик задач. Если вы пользовались системой, то скорее всего список модулей в ~/.config/modprobed.db изменился. На всякий случай можно последний раз выполнить modprobed-db store и сконфигурировать ядро:
modprobed-db storecd ~/kernelbuild/linux-7.1.2make 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_installmake 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. Вы можете удалить бинарное ядро через пакетный менеджер или оставить и выбирать его при загрузке (если есть желание или необходимость). На этом все. Всем удачи!
ссылка на оригинал статьи https://habr.com/ru/articles/1053760/