Как скомпилировать ванильное ядро 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, а также удаляет резервные копии редактора и файлы патчей