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) были найдены в официальной документации.