- PVSM.RU - https://www.pvsm.ru -
В прошлом, мой выбор пал на OpenEmbedded (OE) и по заслугам, она одна из лучших систем сборок. К выбору на тот момент не подходил осознанно и захотел исправить это, поэтому решил посмотреть на текущие решения.
Мысль не пришла в голову, если бы под руками не оказалась плата Raspberry Pi (RPi), популярность которой зашкаливает — это означает одно, что попробовать новые системы сборки должно быть как никогда просто.
Забегая вперед, хочу сказать, что мне хотелось найти систему сборки для любой платы, не важно RPi это или нет и был приятно удивлен сообществом и количеством решений, которые уже сделаны под эту плату и которые очень легко попробовать.
Года два-три назад использовал систему сборок OpenEmbedded [1], так получилось, что попробовать что-то другое не было нужно и решил, что она достаточно популярна и лучше в нее вкладывать силы, нежели во что-то другое.
Мое мнение сейчас, что на тот момент момент у меня не было отладочной платы под которую были решения для других систем сборок. А таких решений как RPi [2] не было, был BeagleBoard [3], который даже сейчас в 5-6 раз дороже, чем RPi.
Поэтому начиная все заново, мне захотелось попробовать подойти к выбору систем сборок более осознанно и заодно посмотреть, возможно что-то изменилось. (и правда, изменилось)
Цель же этой статьи: показать системы сборок и показать как их попробовать.
(на русской википедии написано, что это framework или по-русски «инфраструктура», но слово «система сборки», мне кажется понятнее и ближе)
(краткую выдержку о всех впечатлений дал в итогах, поэтому если вас это интересует, можете сразу перейти в эту секцию)
Допустим вы захотели собрать свой образ для RPi и стоите перед выбором как это сделать (под образом понимается прошивка на основе GNU/Linux для отладочной платы).
Здесь вы найдете решение как это сделать, но цель статьи не показать как сделать это, а показать как сделать это 6 раз, потому что столько систем сборок было найдено и показались мне интересными.
Вы можете взять уже опробованные решения такие как OpenEmbedded или BuildRoot и с этим смериться, но почему же не попробовать другие? Разве это не интересно?
Самая основная причина не делать этого, не пробовать разные системы сборок — это простое ограничение во времени, т.к. сборка не всегда проходит гладко и на это уходит кучу времени.
И, конечно, вы всегда в праве решить нужен ли вам свой образ или нет и отказаться от этой затеи.
Данная статья рассчитана на человека, разбирающегося в командной строке Linux-a, т.к. все примеры рассмотрены в ней были проверены под Arch Linux x84_64, что означает, что скорее всего у вас они тоже заработают.
Также читатель должен будет сам установить недостающие пакеты и программы, необходимые для системы сборки, которую он выберет, через менеджер приложений его системы.
В остальном статья предоставляет простые инструкции по сборке, дает перечень решений к появившимся у меня проблемам.
Но если и это покажется читателю сложным, то он может просто обратить внимание на эти сборки и просто, скачать уже готовые образы с соответствующего сайта (выбранной системы сборки) и установить их.
И конечно, не забудьте, что статья рассчитана на RPi, приобретя ее, чтение будет полезным.
У меня несколько критериев, для системы сборок:
Поясню их:
Нравится, та система, которую мне захочеться использовать и год и два и 5+. И если нету поддержки моей отладочной платы, то с удовольствием ее добавлю.
Моя основная система это Arch Linux x86_64.
Удобство — это наличие документации, работоспособность, т.е. с ней удобно работать.
Я уже знал несколько систем сборок, такие как OpenEmbedded и PTXdist. Поиск дал мне еще несколько, но в последствии список систем сборок взял с этой [4] страницы:
Список составлен от наименее до наиболее понравившейся системе.
Перед тем, как перейти к самим сборкам, здесь опишу основные моменты, которые использовались при составлении описания.
Это система сборки, которая используется проектом GeeXBox [5] — дистрибутив 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/buildfile not recognized: File format not recognized. Решиние: эта ссылка и править пакеты [6] или установить гостевую 32битную систему [7]ecore, eina, eet, evas, libXdamage. Решение: найти в поиске, скачать, заменить — не помоглоСистема сборок, которую используют в Freescale [11] для своих 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, не сработал)Система, которую используют Pengutronix [14].
Данная система сборки разбита на 2 этапа, сборку компилятора (toolchain) и самого образа системы. Т.е. получается, что образ собирается за два действия, а не за одно. Возможно, это минус.
В прошлом мне эта система показалась достаточно интересной. Было удобно пользоваться, а код внутри её структурированный и читабельный.
При первом поиске нашел на github-e [15] вариант данной системы сборки для 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.srcOpenEmbedded [1] это система сборок, которую используют кому не лень, она содержит очень много пакетов и сама по себе очень популярна и главное — это все работает.
Но, когда начал поиски систем сборок для RPi, то наткнулся на Yocto project [22] о котором ничего не знал и оказалось, что он использует внутри себя 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
Данную систему сборки использует OpenWrt [27].
Я не использовал эту систему раньше, поэтому добавить о ней ничего не могу, но она мне понравилась. Она оказалась очень простой в использовании и заработала, практически сразу.
Но установка образа, оказалась не красивой.
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
Тоже, что и 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. Вы можете заметить порядок систем сборок и наблюдать, как изменяются инструкции переходя от одной к другой, последние мне кажутся практически идеальными.
Если найдете ошибку, пожалуйста, сообщите мне — поправлю.
Если пожелаете, добавлю ссылки на получившиеся у меня образы.
Если у вас есть замечания, комментария, какой-то текст кажется слишком простой и не нужный, пожалуйста, напишите лично.
Автор: m039
Источник [35]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/29148
Ссылки в тексте:
[1] OpenEmbedded: http://www.openembedded.org/wiki/Main_Page
[2] RPi: http://en.wikipedia.org/wiki/Raspberry_Pi
[3] BeagleBoard: http://en.wikipedia.org/wiki/BeagleBoard
[4] этой: http://elinux.org/Build_Systems
[5] GeeXBox: http://www.geexbox.org/
[6] эта ссылка и править пакеты: http://lists.gnu.org/archive/html/libtool/2010-02/msg00002.html
[7] установить гостевую 32битную систему: http://virtualboxes.org/images/ubuntu/
[8] образы: http://www.geexbox.org/download/
[9] OpenBricks: http://www.openbricks.org/development-source-tree/
[10] Инструкции на OpenBricks: http://www.openbricks.org/build-instructions/
[11] Freescale: http://www.freescale.com/
[12] LTIB: http://ltib.org/home-intro
[13] Странного вида инструкция: http://midnightyell.wordpress.com/2012/10/08/ltib-for-raspberry-pi/#
[14] Pengutronix: http://www.pengutronix.de/index_de.html
[15] github-e: https://github.com/fabricega/OSELAS.BSP-RaspberryPi
[16] pkg-config-0.25.tar.gz: http://pkgs.fedoraproject.org/repo/pkgs/pkgconfig/pkg-config-0.25.tar.gz/a3270bab3f4b69b7dc6dbdacbcae9745/pkg-config-0.25.tar.gz
[17] udev-172.tar.bz2: http://pkgs.fedoraproject.org/lookaside/pkgs/udev/udev-172.tar.bz2/bd122d04cf758441f498aad0169a454f/udev-172.tar.bz2
[18] PTXdist: http://www.ptxdist.org/software/index_en.html
[19] утилиты: http://git.pengutronix.de/
[20] BSP: http://git-public.pengutronix.de/
[21] OSELAS.BSP-Pengutronix-Generic, там же ссылки на Quickstart-ы: http://git-public.pengutronix.de/?p%3DOSELAS.BSP-Pengutronix-Generic.git%3Ba%3Dsummary%20
[22] Yocto project: https://www.yoctoproject.org/
[23] это: http://stackoverflow.com/questions/7237415/python-2-instead-of-python-3-as-the-temporary-default-python
[24] virtualenv: https://pypi.python.org/pypi/virtualenv
[25] Yocto project: https://www.yoctoproject.org
[26] Инструкции: http://www.pimpmypi.com/blog/blogPost.php?blogPostID%3D7
[27] OpenWrt: http://en.wikipedia.org/wiki/OpenWrt
[28] udev-182.tar.bz2: http://mirror.anl.gov/pub/linux/utils/kernel/hotplug/udev-182.tar.bz2
[29] BuildRoot: http://buildroot.uclibc.org
[30] rpi-buildroot: https://github.com/gamaral/rpi-buildroot
[31] raspberry-pi-openwrt: http://code.google.com/p/raspberrypi-openwrt/
[32] PiLFS: http://www.intestinate.com/pilfs/
[33] CLFS инструкции по сборке: http://www.jayway.com/2013/01/20/linux-from-scratch-on-raspberry-pi/
[34] Большой список образов: http://elinux.org/RPi_Distributions
[35] Источник: http://habrahabr.ru/post/172349/
Нажмите здесь для печати.