Поиск по сайту:

Как скомпилировать ванильное ядро Linux из исходников на Fedora


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

Linux является монолитным ядром: хотя его функциональные возможности могут быть включены статически или собраны и загружены как отдельные модули, он всегда работает как «единая часть» в одном и том же адресном пространстве. В этом руководстве мы увидим, как скачать, скомпилировать и установить ванильное ядро Linux. Предоставленные инструкции должны работать на всех дистрибутивах Linux, однако это руководство сосредоточено на компиляции ядра в системе Fedora.

В этом уроке вы узнаете:

  • Как настроить, скомпилировать и установить ванильное ядро Linux
  • Как упаковать скомпилированное ядро и его модули

Конфигурационное меню на основе ncurses для ядра Linux

Требования к программному обеспечению и используемые условные обозначения

Установка зависимостей

Чтобы иметь возможность скомпилировать ядро Linux из исходников, нам необходимо установить некоторые пакеты в нашу систему:

sudo dnf install gcc flex make bison openssl-devel elfutils-libelf-devel

Те, что выше, являются только «основными» пакетами, которые нам нужны. Для вызова определенных конфигурационных целей необходимо установить некоторые дополнительные пакеты: пакеты ncurses-devel и qt-devel, например, необходимы для настройки ядра, использующего, соответственно, графический интерфейс на основе ncurses и Qt, в то время как пакет rpm-build необходим для сборки rpm, содержащего скомпилированное ядро.

Скачивание архива с исходным кодом

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

curl https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.1.5.tar.xz|tar -xJ

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

cd linux-5.1.5

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

Настройка ядра

Существуют различные способы настройки ядра, и они соответствуют различным целям конфигурации. При вызове цели конфигурации, если в каталоге sources найден файл с именем .config, содержащий действительную конфигурацию ядра, он используется в качестве отправной точки для установки. Это дает возможность обновить или изменить уже существующую конфигурацию, возможно, ту, которая поставляется с ядром, установленным по умолчанию в нашем дистрибутиве (его можно найти в каталоге /boot, названном в честь используемого ядра).

Если файл не найден, конфигурация начнется с нуля, а файл .config будет сгенерирован после сохранения настроек. Давайте рассмотрим некоторые из целей конфигурации, которые мы можем использовать:

Конфигурация

Если эта цель вызывается, пользователю предлагается настроить ядро, ответив на ряд вопросов следующим образом:

*
* Linux/x86 5.1.5 Kernel Configuration
*
*
* Compiler: gcc (GCC) 9.1.1 20190503 (Red Hat 9.1.1-1)
*
*
* General setup
*
Compile also drivers which will not load (COMPILE_TEST) [N/y/?]

менюконфигурации

Эта цель использует приятный и удобный интерфейс ncurses, позволяющий нам создавать или обновлять конфигурацию ядра. Как было сказано ранее, для использования этого интерфейса в системе должен быть установлен пакет ncurses-devel.

Конфигурация на основе ncurses inteface

Используя этот интерфейс, мы можем нажимать клавишу h при выделении конкретного варианта для получения информации и предложений по ней:

Чтобы получить информацию о варианте, достаточно выбрать его и нажать клавишу h Нажатие Y на опцию включит ее в <span style="font-size: inherit; ">kernel статически (вариант будет помечен *), нажав N исключит его, и нажатие клавиши M включит it в качестве модуля (опция будет помечена M style="font-size: inherit;">). Для поиска для конкретного варианта мы можем использовать ключ / и предоставить строку или регулярное выражение для поиска:

Интерфейс ncurses для поиска определенного варианта

xconfig

С помощью этой цели make можно настроить ядро через графический интерфейс, основанный на инструментарии Qt, если пакет qt-devel установлен в системе.

Конфигурационный интерфейс на основе Qt

Олдконфиг

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

локальнаяконфигурация

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

локальный конфиг

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

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

Как только мы закончим настройку ядра, мы сможем скомпилировать исходный код. Все, что нам нужно сделать, это запустить:

make

Операция может занять некоторое время, в зависимости от функций, которые мы решили включить в ядро. Чтобы ускорить процесс, мы можем запустить make с опцией -j и указать количество заданий для одновременного выполнения: часто используемое значение для этой опции - количество логических ядер процессора + 1. Таким образом, на машине с 4 логическими ядрами мы выполним:

make -j5

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

sudo make install

Файлы ядра будут скопированы в каталог /boot. Чтобы скомпилировать и установить модули ядра, вместо этого мы можем выполнить:

sudo make modules_install

Модули ядра будут установлены в каталог /lib/modules, названный в соответствии с версией ядра. Наконец, чтобы новое ядро было доступно и его можно было выбрать при загрузке, мы должны повторно сгенерировать конфигурацию grub:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Упаковка ядра

Вместо того, чтобы устанавливать скомпилированное ядро напрямую, как мы делали выше, чтобы иметь возможность управлять его установкой и удалением через менеджер системных пакетов, мы можем создать пакет rpm. Для выполнения задачи мы должны использовать одну из целей rpm-pkg и binrpm-pkg. Первый будет собирать как исходный, так и двоичный RPM-пакеты, второй — только двоичный. Чтобы эта цель работала правильно, должен быть установлен пакет rpm-build. Чтобы собрать только двоичный пакет rpm, мы выполним:

make binrpm-pkg

Если операции будут выполнены без ошибок, то в нашем домашнем каталоге будет создано дерево каталогов rpmbuild. Собранный пакет rpm будет доступен в подкаталоге ~/rpmbuild/RPMS, названном в соответствии с архитектурой системы.

Другой вариант — упаковать ядро и его модули в сжатый tar-архив, используя один между целевыми targz-pkg, tarbz2-pkg и tarxz-pkg, в зависимости от сжатия, которое мы хотим использовать. Архив будет создан внутри каталога с исходным кодом ядра.

Выводы

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

  • clean: Удаляет большинство сгенерированных файлов, но сохраняет конфигурацию и достаточную поддержку сборки для сборки внешних модулей
  • mrproper: Удаляет все сгенерированные файлы + конфигурация + различные файлы резервных копий
  • distclean: Выполняет mrcorrect, а также удаляет резервные копии редактора и файлы патчей

Статьи по данной тематике: