В прошлом, мой выбор пал на OpenEmbedded (OE) и по заслугам, она одна из лучших систем сборок. К выбору на тот момент не подходил осознанно и захотел исправить это, поэтому решил посмотреть на текущие решения.
Мысль не пришла в голову, если бы под руками не оказалась плата Raspberry Pi (RPi), популярность которой зашкаливает — это означает одно, что попробовать новые системы сборки должно быть как никогда просто.
Забегая вперед, хочу сказать, что мне хотелось найти систему сборки для любой платы, не важно RPi это или нет и был приятно удивлен сообществом и количеством решений, которые уже сделаны под эту плату и которые очень легко попробовать.
Мотив
Года два-три назад использовал систему сборок OpenEmbedded, так получилось, что попробовать что-то другое не было нужно и решил, что она достаточно популярна и лучше в нее вкладывать силы, нежели во что-то другое.
Мое мнение сейчас, что на тот момент момент у меня не было отладочной платы под которую были решения для других систем сборок. А таких решений как RPi не было, был BeagleBoard, который даже сейчас в 5-6 раз дороже, чем RPi.
Поэтому начиная все заново, мне захотелось попробовать подойти к выбору систем сборок более осознанно и заодно посмотреть, возможно что-то изменилось. (и правда, изменилось)
Цель же этой статьи: показать системы сборок и показать как их попробовать.
(на русской википедии написано, что это framework или по-русски «инфраструктура», но слово «система сборки», мне кажется понятнее и ближе)
(краткую выдержку о всех впечатлений дал в итогах, поэтому если вас это интересует, можете сразу перейти в эту секцию)
Зачем это нужно
Допустим вы захотели собрать свой образ для RPi и стоите перед выбором как это сделать (под образом понимается прошивка на основе GNU/Linux для отладочной платы).
Здесь вы найдете решение как это сделать, но цель статьи не показать как сделать это, а показать как сделать это 6 раз, потому что столько систем сборок было найдено и показались мне интересными.
Вы можете взять уже опробованные решения такие как OpenEmbedded или BuildRoot и с этим смериться, но почему же не попробовать другие? Разве это не интересно?
Самая основная причина не делать этого, не пробовать разные системы сборок — это простое ограничение во времени, т.к. сборка не всегда проходит гладко и на это уходит кучу времени.
И, конечно, вы всегда в праве решить нужен ли вам свой образ или нет и отказаться от этой затеи.
Кому полезна данная статья
Данная статья рассчитана на человека, разбирающегося в командной строке Linux-a, т.к. все примеры рассмотрены в ней были проверены под Arch Linux x84_64, что означает, что скорее всего у вас они тоже заработают.
Также читатель должен будет сам установить недостающие пакеты и программы, необходимые для системы сборки, которую он выберет, через менеджер приложений его системы.
В остальном статья предоставляет простые инструкции по сборке, дает перечень решений к появившимся у меня проблемам.
Но если и это покажется читателю сложным, то он может просто обратить внимание на эти сборки и просто, скачать уже готовые образы с соответствующего сайта (выбранной системы сборки) и установить их.
И конечно, не забудьте, что статья рассчитана на RPi, приобретя ее, чтение будет полезным.
Критерии
У меня несколько критериев, для системы сборок:
- Она должна мне нравится
- Она должна работать под GNU/Linux
- Она должна быть удобной
Поясню их:
Нравится, та система, которую мне захочеться использовать и год и два и 5+. И если нету поддержки моей отладочной платы, то с удовольствием ее добавлю.
Моя основная система это Arch Linux x86_64.
Удобство — это наличие документации, работоспособность, т.е. с ней удобно работать.
Список систем сборок
Я уже знал несколько систем сборок, такие как OpenEmbedded и PTXdist. Поиск дал мне еще несколько, но в последствии список систем сборок взял с этой страницы:
- OpenBricks
- LTIB
- PTXdist
- Yocto Project / OpenEmbedded
- OpenWRT / BuildRoot
Список составлен от наименее до наиболее понравившейся системе.
Наблюдения в отличии сборок
- У каждой системы сборок, свой способ или скрипт для загрузки образа
- Каждая система сборок была создана, какой-нибудь конкретной организацией, для своих нужд
Системы сборок
Основные моменты
Перед тем, как перейти к самим сборкам, здесь опишу основные моменты, которые использовались при составлении описания.
- Каждое описание системы содержит отдельную секцию с ошибками, которые возникли у меня при выполнении инструкций, чтобы оставить инструкции в простом и понятном виде
- Каждое описание содержит секцию с ссылками используемые ресурсы в статье
- Каждое описание содержит секцию с «О системе», где попытался дать свое представление о системе и поделиться впечатлением от использования. Полное описание самой системы можете найти на соответствующем сайте.
- В инструкциях присутствует переменная SANDBOX, ввел ее для упрощения записи инструкций, указывает на любую выбранную вами директорию
- Не стал рассматривать отсутствия пакетов, необходимых для сборки. (таких как gcc, git и т.п.)
OpenBricks
О системе
Это система сборки, которая используется проектом GeeXBox — дистрибутив Linux с медиа-центром.
Для меня она оказалось самой сложной в использовании, потому что инструкций по сборке как таковых нет, есть очень простое описание и оно не работает, но мне удалось разобраться и собрать образ и он запустился, но… выдал ошибку.
Но, вы можете попробовать уже собранные образы на странице проекта (см. ссылки)
Инструкции
Я пробовал собирать образ под основной (host) машиной, появлялись ошибки (см. ошибки), устал.
Скачал образ Ubuntu под VirtualBox, запустил под ним, не собралось, оказалось была проблема в понимании.
Я пытался собрать образ используя репозиторий OpenBricks, но он оказался больше тестовый, т.е. на сайте GeeXBox написано, что если там не собирается, то это нормально. Работающий, оказался репозиторий GeeXBox, но сборка через make menuconfig не увенчалась успехом, поэтому было решение использовать make *defconfig.
С помощью этих инструкций был получен образ:
export OB=$SANDBOX/ob
mkdir $OB && cd $OB
hg clone http://hg.geexbox.org/geexbox
cd geexbox
make geexbox-xbmc-bcm2708-raspberrypi_defconfig
make
#
# Установка образа
#
wget http://download.geexbox.org/snapshots/geexbox-xbmc-bcm2708-raspberrypi/latest/binaries.raspberrypi/make-sdcard
chmod +x make-sdcard
./make-sdcard /dev/mmcblk0 geexbox-3.0.raspberrypi.tar.bz2 raspberrypi
Ошибки
- Не был найден
first32k.bin
. Решение: нашел в поиске, скачал, поправил путь в packages/linux/build file not recognized: File format not recognized
. Решиние: эта ссылка и править пакеты или установить гостевую 32битную систему- Битые ссылки, например на
ecore, eina, eet, evas, libXdamage
. Решение: найти в поиске, скачать, заменить — не помогло
Ссылки
LTIB
О системе
Система сборок, которую используют в Freescale для своих BSP.
Использует perl для сборки пакетов, а сами пакеты хранятся в rpm, что само по себе непривычно.
Еще одна особенность — LTIB не компилирует Toolchain, а скачивает или использует готовый, что для меня минус.
Инструкции
export LTIB=$SANDBOX/ltib
mkdir $LTIB && cd $LTIB
cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/ltib co -P ltib
cd ltib
./ltib
#
# Ругнулся:
#
# - по поводу rpm, установил rpm-org
# - по поводу sudo, добавил их строчку в sudo
# - не нашел достающий пакет
#
#
# Недостающий пакет
#
cd $LTIB
git clone https://github.com/midnightyell/RPi-LTIB.git
cp RPi-LTIB/ltib/opt/ltib/pkgs/*.rpm /opt/ltib/pkgs/
./ltib
#
# Установка образа
#
sudo config/platform/rpi/rpi_mksdimage.sh -B rootfs/boot/ -R rootfs.ext2.gz
sudo dd if=rpi_sdcard.img of=/dev/mmcblk0
Собралось нормально, но в итоге вывод не показывался на терминал (uart или com порт), оказалось, что он просто выключен. К устройству можно было подключиться по ssh и попасть в консоль. (оказалось не очевидно)
Ошибки
- Не был найден
rpm
. Решение: установил rpm-org, (rpm от red hat, не сработал) - Не был найден недостающий пакет. Решение в инструкциях выше
Ссылки
PTXdist
О системе
Система, которую используют Pengutronix.
Данная система сборки разбита на 2 этапа, сборку компилятора (toolchain) и самого образа системы. Т.е. получается, что образ собирается за два действия, а не за одно. Возможно, это минус.
В прошлом мне эта система показалась достаточно интересной. Было удобно пользоваться, а код внутри её структурированный и читабельный.
Инструкции
При первом поиске нашел на github-e вариант данной системы сборки для RPi, но мне не удалось её собрать (компилятор собрался, образ нет). Проблема, как мне кажется, что по вероятности её собирали под debian линуксом, что скорее всего ubunta, а у меня не она.
Но мне не хотелось останавливаться и поверить, что никто не использовал эту систему сборки для RPi. И нашел вариант, который находится на главном репозитории Pengutronix.
Инструкции, которые мне позволили собрать образ (и обратите внимание на секцию с ошибками внизу):
export PTX=$SANDBOX/ptx
mkdir $PTX && cd $PTX
#
# Собираем ptxdist
#
git clone git://git.pengutronix.de/git/ptxdist.git
cd ptxdist/
./autogen.sh
mkdir out
./configure --prefix=`pwd`/out
make && make install
export PATH=`pwd`/out/bin:$PATH
cd ..
#
# Собираем toolchain
#
wget http://www.ptxdist.de/oselas/toolchain/download/OSELAS.Toolchain-2011.11.3.tar.bz2
tar -xjf OSELAS.Toolchain-2011.11.3.tar.bz2
cd OSELAS.Toolchain-2011.11.3/
ptxdist select ptxconfigs/arm-1136jfs-linux-gnueabi_gcc-4.6.2_glibc-2.14.1_binutils-2.21.1a_kernel-2.6.39-sanitized.ptxconfig
ptxdist --force menuconfig
ptxdist --force go
cd ..
#
# Собираем образ
#
git clone http://git-public.pengutronix.de/git-public/OSELAS.BSP-Pengutronix-Generic.git
cd OSELAS.BSP-Pengutronix-Generic
git clone git://git.pengutronix.de/git/platform-pengutronix-raspberrypi.git
ptxdist select configs/ptxconfig
ptxdist platform platform-pengutronix-raspberrypi/platformconfig
ptxdist toolchain /opt/OSELAS.Toolchain-2011.11.3/arm-1136jfs-linux-gnueabi/gcc-4.6.2-glibc-2.14.1-binutils-2.21.1a-kernel-2.6.39-sanitized/bin
ptxdist --force go
ptxdist --force images
#
# Заливаем образ на SD карточку
#
sudo dd if=./platform-pengutronix-raspberrypi/images/hd.img of=/dev/mmcblk0
Ошибки
configure: error: cannot compute suffix of object files: cannot compile
. После выяснения стало ясно, что она символизирует совершенно другое — ./configure просто не нашел компилятор. Если использовалась опция fake args, то ./configure не пытался даже искать компилятор, а брал название его из неё. Решение: заменить в fake args (в ptxdist menuconfig) на «gcc»@itemx must follow @item
. Она появлялась из-за того, что на моей машине стоял makeinfo версией 5.0. Решение: установитьmakeinfo
версией меньше, чем 5.0.- Битая ссылка на файлы. Решение: скачать, файлы pkg-config-0.25.tar.gz, udev-172.tar.bz2 и положить в папку
src
Ссылки
- PTXdist
- Репозитории Pengutronix — утилиты и BSP
- OSELAS.BSP-Pengutronix-Generic, там же ссылки на Quickstart-ы
Yocto Project / OpenEmbedded
О системе
OpenEmbedded это система сборок, которую используют кому не лень, она содержит очень много пакетов и сама по себе очень популярна и главное — это все работает.
Но, когда начал поиски систем сборок для RPi, то наткнулся на Yocto project о котором ничего не знал и оказалось, что он использует внутри себя OpenEmbedded.
Он появился в 2010-2011 году и оказалось, что цель достаточно хорошая — улучшить средства разработчику для работы со встраиваемыми системами и взять за основу OpenEmbedded.
Как результат, более стабильные билды, больше тестов и лучшая документация, мне удалось слабо пробежаться по этим фактам, но при компиляции образа было очень мало проблем.
Поэтому смело объединил, OpenEmbedded и Yocto project в одну секцию.
Инструкции
export YOCTO=$SANDBOX/yocto
mkdir $YOCTO && cd $YOCTO
#
# Приготовление
#
git clone git://git.yoctoproject.org/poky
cd poky
git clone https://github.com/djwillis/meta-raspberrypi.git
source oe-init-build-env build
#
# Настройка
#
emacs conf/local.conf
# Здесь придеться изменить или удалить комментарий в таких переменных
# как
#
# BB_NUMBER_THREADS = "4"
#
# PARALLEL_MAKE = "-j 4"
#
# MACHINE ?= "raspberrypi"
#
emacs conf/bblayers.conf
# Здесь придеться добавить путь к meta-raspberrypi в соответсвии с
# примером:
#
# BBLAYERS ?= "
# /home/m039/Trash/sandbox/yocto/poky/meta
# /home/m039/Trash/sandbox/yocto/poky/meta-raspberrypi
# /home/m039/Trash/sandbox/yocto/poky/meta-yocto
# /home/m039/Trash/sandbox/yocto/poky/meta-yocto-bsp
# "
#
# Для сборки может потребоваться какие-нибудь утилиты, пожалуйста,
# установите их с помощью средств своего дистрибутива.
#
#
# Сборка образа
#
bitbake rpi-basic-image
#
# Заливаем образ на SD карточку
#
sudo dd if=./tmp/deploy/images/rpi-basic-image-raspberrypi.rpi-sdimg of=/dev/mmcblk0
Ошибки
- В системе у меня по-умолчанию python3, а для сборки нужен был python2. Решение: это (использовать virtualenv)
Ссылки
BuildRoot
О системе
Данную систему сборки использует OpenWrt.
Я не использовал эту систему раньше, поэтому добавить о ней ничего не могу, но она мне понравилась. Она оказалась очень простой в использовании и заработала, практически сразу.
Но установка образа, оказалась не красивой.
Инструкции
export BR=$SANDBOX/br
mkdir $BR && cd $BR
git clone --depth 1 git://github.com/gamaral/rpi-buildroot.git
cd rpi-buildroot
make raspberrypi_defconfig
make
#
# Устанавливаем образ
#
sudo mkfs.vfat -F 16 -n boot /dev/mmcblk0p1
sudo mkdir -p mnt/boot
sudo mount /dev/mmcblk0p1 mnt/boot
sudo cp output/images/boot/* mnt/boot
sudo umount mnt/boot
sudo mkfs.ext3 -L rootfs /dev/mmcblk0p2
sudo mkdir -p mnt/rootfs
sudo mount /dev/mmcblk0p2 mnt/rootfs
sudo tar -xvpsf output/images/rootfs.tar -C mnt/rootfs
sudo umount mnt/rootfs
Ошибки
- Были битые ссылки. Решение: скачать udev-182.tar.bz2 файлы и положить в папку $BR/RaspberryPi-BuildRoot/dl
Ссылки
- BuildRoot
- rpi-buildroot там же инструкции
OpenWrt
О системе
Тоже, что и BuildRoot, но собрался без ошибок.
Инструкции
export OW=$SANDBOX/ow
mkdir $OW && cd $OW
git clone https://code.google.com/p/raspberrypi-openwrt/
make menuconfig
# выбрать bcm2835
make
#
# Устанавливаем образ
#
sudo dd if=./bin/brcm2708/openwrt-brcm2708-sdcard-vfat-ext4.img of=/dev/mmcblk0
Ссылки
Заключение
Впечатление
Я был крайне удивлен и рад, что узнал о таких проектах как Yocto project и OpenWrt, которые когда-то обошли меня стороной. Первый — прекрасное развитие OpenEmbedded, но в техническом плане ничего нового, второй проект, который мне захотелось просто попробовать, и на нем (BuildRoot) попробую сделать свою собственную сборку (свои пакеты и своя конфигурация).
Если вы следите за новостями и разбираетесь в сборках, то конечно, для вас ничего нового нет, но если вы застряли на одном месте, то RPi это очень хороший шанс, попробовать что-то новое, потому что старые проекты обновляются и начинают поддерживать что-то новое и RPi в списках у них одна из первых.
И конечно, не нужно собирать свои дистрибутивы (или образы), если можно просто попробовать уже готовые, на каждом сайте сборки есть уже готовые образы, достаточно их скачать, установить и попробовать — это тоже интересно. Но некоторым хочеться свое, для этого было мое маленькое исследование и написана эта статья.
Я для себя выбрал попробовать BuildRoot и, если что-то не устроит то перейду на Yocto project (взамен OpenEmbedded).
P.S. Вы можете заметить порядок систем сборок и наблюдать, как изменяются инструкции переходя от одной к другой, последние мне кажутся практически идеальными.
Что упустил
- Не написал список пакетов, которые предоставляет система сборки
- Есть ли команды, чтобы сразу сгенерировать конфигурацию для работы через nfs (только для удобства)
- Не указал размер получившегося образа, время его сборки и общий размер папки, после компиляции
Материал для дальнейшего исследования
- PiLFS — там есть пример как скомпилировать Quake 3 на самом RPi
- CLFS инструкции по сборке RPi (сейчас ссылка битая)
- Большой список образов под RPi
Последнее слово
Если найдете ошибку, пожалуйста, сообщите мне — поправлю.
Если пожелаете, добавлю ссылки на получившиеся у меня образы.
Если у вас есть замечания, комментария, какой-то текст кажется слишком простой и не нужный, пожалуйста, напишите лично.
Автор: m039