Первым делом попробуем разобраться в том, зачем заново собирать ядро Linux в работающей системе. Дело в том, что ядро операционной системы Linux является монолитным, то есть состоит из одного исполняемого бинарного образа (как прошивка для микроконтроллера). Кроме того в архитектуре ядра реализована поддержка так называемых модулей ядра,- исполняемых бинарных образов, которые могут быть загружены в процессе работы. С помощью модулей ядра реализована поддержка драйверов для различного периферийного оборудования. Во время сборки ядра также производится сборка модулей ядра. Следовательно ядро нужно собирать, чтобы убрать драйвера не используемого оборудования или добавить поддержку нового оборудования.

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

На официальном сайте Raspberry Pi описана сборка ядра с помощью кросс-компиляции в операционной системе Ubuntu. Ядро можно собрать и непоcредственно на самой плате Raspberry Pi, но этот процесс может занять гораздо больше времени, чем при кросс-компиляции на большой Linux-машине.
Я буду использовать для сборки ядра компьютер с установленной операционной системой Fedora Linux.

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

Если git не установлен , то установить его можно с помощью команды :

Установку новых пакетов, естественно, можно производить только с правами root :

Вернуть себе свои права (пользователя) можно с помощью команды :

Загружаем исходники ядра :

Имейте ввиду, что исходники будут загружены в тот каталог, на котором вы будете находится в момент выполнения команды загрузки исходников из репозитория. Это может быть домашний каталог пользователя. Я создал для этой цели в своем домашнем каталоге подкаталог raspberrypi.
После выполнения команды исходный код ядра Linux будет расположен в /home/{Username}/raspberrypi/linux.

Переместимся в этот каталог и выполним конфигурирование ядра :

Для конфигурирования ядра будем использовать утилиту menuconfig , ее также нужно будет собрать. Для использования menuconfig в вашей системе Fedora Linux должен быть установлен пакет ncurses-devel :

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

Загрузить инструментальные средства можно по команде :

Теперь соберем menuconfig :

После выполнения последней команды на экране сразу же появиться запущенная утилита menuconfig. Выберите необходимые вам опции (или ничего не выбирайте, если просто хотите попробовать конфигурирование) с помощью перемещения курсора по меню. К примеру, для добавление в ядро поддержки расширителя портов GPIO через I2C-интерфейс на основе микросхемы MAX7300 необходимо выбрать пункт меню :
Device Drivers — GPIO Support — I2C GPIO expanders — Maxim MAX7300 GPIO expander

После выбора соответсвующего пункта меню (нажатием клавиши “y”) необходимо сохранить изменения в файле .config , нажав на кнопку “Save”.
Конфигурирование выполнено, теперь можно приступить к сборке :

Наверное стоит акцентировать ваше внимание на некоторых параметрах в командной строке утилиты make для лучшего понимания происходящего.

Опция -j2 указывает make выполнять одновременно 2 задания, благодаря этому процесс сборки будет происходить быстрее.
zImage — цель для сборки ядра (одноименная с названием образа ядра).
modules — цель для сборки модулей ядра.
dtbs — цель для сборки дерева устройств (дерево устройств используется для загрузки драйверов, выбранных по-умолчанию).

Теперь необходимо скопировать собранное ядро на карту памяти microSD с предварительно установленной операционной системой Raspbian, последнюю версию которой можно загрузить с официального сайта. Там же рекомендуют использовать для записи образа системы на карту памяти утилиту с графическим интрефейсом Etcher.

Просмотреть названия подключенных дисков (в том числе карты памяти microSD) можно с помощью команды :

Дальше необходимо создать точки монтирования и примонтировать разделы карты памяти к файловой системе :

Монтирование производиться с правами root, название диска microSD (sdc) в вашей системе может быть другим.
Сначала установим модули ядра (необходимы права root) с помощью команды :

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

Теперь копируем образ ядра и дерево устройств на карту памяти microSD :

Отмонтируем файловую систему карты памяти :

Наконец-то можно установить карту памяти в Raspberry Pi 3 и подать питание. Если операционная система Linux успешно загрузиться, то сборку ядра можно считать удавшейся. В противном случае придется восстанавливать рабочую копию старого образа ядра (kernel7-backup.img).

Viewed 158540 times by 19995 viewers

Last modified: 26/10/2020

Author

Comments

Привет бро! Если собирать под Raspberry Pi 4 Model B то алгоритм будет примерно тот же или там существенно сложнее? Pi3 уже нет в продаже..

Raspberry Pi 4 default build configuration
cd linux
KERNEL=kernel7l
make bcm2711_defconfig
Build sources
cd linux
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
https://www.raspberrypi.org/documentation/linux/kernel/building.md

Write a Reply or Comment