Yocto: свой образ Linux для Raspberry Pi

Моё знакомство со встраиваемыми системами началось с приобретения в 2012 году великолепного одноплатного компьютера Raspberry Pi Model B (Broadcom BCM2835 SoC). На этой плате было реализовано множество различных проектов, но со временем все они ушли на более современные Raspberry Pi 3.

Иногда я достаю из стола старенькую плату чтобы попробовать что то, но в очередной раз запуская официальный образ Raspberry Pi OS (ранее Raspbian) отметил большое количество ненужных и откровенно бесполезных сервисов и программ.

Так у меня возникло желание собрать свой собственный образ операционной системы Linux. Для этих целей существует несколько проектов Buildroot, OpenWrt, Yocto.

С использованием системы Buildroot я уже собирал несколько прошивок под различные платформы (в том числе и под Raspberry Pi), OpenWrt в большей степени "заточен" для создания прошивок к сетевым устройствам. Поэтому я решил попробовать собрать прошивку используя проект Yocto.

Yocto Project (YP) - это проект с открытым исходным кодом, который помогает разработчикам создавать собственные системы на базе Linux независимо от архитектуры оборудования.

С его помощью я соберу свой образ операционной системы Linux который будет содержать уникальный набор необходимого мне программного обеспечения, а также будет обеспечивать поддержку драйверов периферии для используемой SoC BCM2835.

Подготовка к сборке

Создаем рабочий каталог и переходим в него

mkdir ~/yocto && cd ~/yocto

Загружаем исходники системы сборки Poky (BitBake и OpenEmbedded), переходим в рабочий каталог системы сборки и загружаем дополнительные слои OpenEmbedded и Raspberry Pi.

git clone -b dunfell git://git.yoctoproject.org/poky.git
cd poky/
git clone -b dunfell git://git.openembedded.org/meta-openembedded
git clone -b dunfell git://git.yoctoproject.org/meta-raspberrypi

ВАЖНО Обратите внимание при клонировании указана конкретная ветка dunfell.

Конфигурация и сборка

Для создание каталога и базовой конфигурации сборки выполняю следующие команды

mkdir ~/yocto/rpi-build && cd ~/yocto/rpi-build
source ~/yocto/poky/oe-init-build-env ~/yocto/rpi-build

Для подключения слоев сборки вношу изменения в файл конфигурации

vi conf/bblayers.conf

Подключаю дополнительные слои OpenEmbedded и Raspberry Pi

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  ${HOME}/yocto/poky/meta \
  ${HOME}/yocto/poky/meta-poky \
  ${HOME}/yocto/poky/meta-yocto-bsp \
  ${HOME}/yocto/poky/meta-raspberrypi \
  ${HOME}/yocto/poky/meta-openembedded/meta-oe \
  ${HOME}/yocto/poky/meta-openembedded/meta-networking \
  ${HOME}/yocto/poky/meta-openembedded/meta-python \
  "

После этого прописываю конфигурацию сборки

vi conf/local.conf

В начало файла добавляю следующие параметры

MACHINE ?= "raspberrypi"
ENABLE_UART = "1"
GPU_MEM = "16"
DL_DIR ?=  "${HOME}/yocto/downloads"

MACHINE - указываю модель
ENABLE_UART - включаю отладку через UART (если необходимо)
GPU_MEM - указываю минимальное значение памяти для GPU (по умолчанию 64М)
DL_DIR - указываю каталог для хранения скачиваемых файлов (мне так удобнее)

О дополнительных опциях сборки можно почитать в документации, например для Raspberry Pi - ~/yocto/poky/meta-raspberrypi/docs/extra-build-config.md

Сборка минимальной системы для запуска Raspberry Pi

Выполняем инициализацию переменных и запускаем сборку рецепта core-image-minimal

source ~/yocto/poky/oe-init-build-env ~/yocto/rpi-build
bitbake core-image-minimal

Рецепты сборки находятся в подключаемых в конфигурации слоях.

Сборка по рецепту core-image-minimal потребует около 50Гб свободного места на системном диске. Во время рабты будут скачаны все необходимые исходники, произведено их конфигурирование, компиляция и упаковка целевой системы.

Запись образа на карту памяти

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

sudo bmaptool copy tmp/deploy/images/raspberrypi/core-image-minimal-raspberrypi.wic.bz2 /dev/mmcblk0

В некоторых инструкциях в сети интернет встречается команда записи образа при помощи команды dd

Для создания образа rpi-sdimg необходимо в файле conf/local.conf прописать опцию

IMAGE_FSTYPES_append = " rpi-sdimg"

Полученный после сборки образ записываем а карту памяти

sudo dd if=tmp/deploy/images/raspberrypi/core-image-base-raspberrypi.rpi-sdimg of=/dev/mmcblk0 status=progress

Работаем с BitBake

Команда имеет множество различных опций.

Просмотреть перечень пакетов определенных в подключенных слоях

bitbake -s

Выводится полный список пакетов с номерами версий доступных для сборки

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

bitbake -g core-image-minimal

После этого "удалив лишнее" и произведя сортировку можно получить список пакетов

cat pn-buildlist | grep -ve "native" | sort | uniq

Используя команды указанные выше можно например понять разницу для рецептов сборки core-image-minimal и core-image-base

При сборке по рецепту core-image-base будут дополнительно собраны пакеты

alsa-lib
alsa-state
alsa-topology-conf
alsa-ucm-conf
alsa-utils
apmd
avahi
bluez5
core-image-base
dosfstools
ell
flac
hdparm
iw
libdaemon
libgcrypt
libgpg-error
libical
libnss-mdns
libogg
libsamplerate0
libsndfile1
libusb1
libvorbis
mobile-broadband-provider-info
neard
ofono
packagegroup-base
pi-bluetooth
psplash
python3-dbus
python3-pycairo
python3-pygobject
quota
rpcbind
udev-rules-rpi
usbutils
wireless-regdb
wpa-supplicant

Зная перечень доступных пакетов определенных в подключенных слоях и перечень пакетов в рецепте core-image-minimal можно при помощи дополнительной опции включить в свою сборку необходимые в работе пакеты

Прописываю дополнения в конфигурацию сборки

vi conf/local.conf

Указываю дополнительные пакеты (например)

CORE_IMAGE_EXTRA_INSTALL += "dropbear htop vim curl stress-ng mosquitto"

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

Большинство ответов на вопросы возникшие во время освоения Yocto Project (YP) были найдены в официальной документации.

Опубликовано: