Skip to Content

OpenEmbedded: Часть 1. Установка

openembedded logoЭтим материалом я хочу начать цикл статей посвященный работе с OpenEmbedded.

OpenEmbedded, это фреймворк для сборки Embedded Linux. Как утверждают на официальном веб-сайте, OpenEmbedded обеспечивает лучшее в своем классе окружение для кросс-компиляции. Фреймворк позволяет создавать завершенные Linux дистрибутивы для встраиваемых систем.

Работать я буду на компьютере в следующей конфигурации:

  • AMD Athlon 64 X2 4000+
  • 1G RAM
  • 30G HDD
  • Debian 5.0.8 (lenny) частично SID и даже Testing
  • Linux Kernel 2.6.32-5-686
  • XFCE Desktop

Для начала желательно проверить наличие необходимых пакетов и установить отсутствующие http://openembedded.org/index.php/Required_software. Если все пакеты на месте, то можно приступать. Я буду ставить OpenEmbedded в каталог отличный от того что описан в руководстве, просто мне больше нравится другое название для этого каталога.

mkdir -p ~/my-distr/build/conf
cd my-distr/

Установка bitbake

Далее нам необходимо установить главную утилиту bitbake, с помощью которой производится сборка дистрибутива или отдельных пакетов. Скачиваем с официального сайта последнюю версию и распаковываем ее в каталог который мы создали ранее и где будет производиться наша сборка. На момент написания я использовал bitbake-1.10.2.

После распаковки нужно переименовать каталог bitbake-1.10.2 в bitbake.

Получение openembedded из репозитория

Затем нам нужно скачать openembedded

git clone git://git.openembedded.net/openembedded

Но тут меня постигла неудача, git никак не хотел завершить клонирование репозитория, по-этому пришлось руками скачать архив с сайта http://cgit.openembedded.org/cgit.cgi/openembedded/snapshot/openembedded-c8e377aebf7ab50d7af9cb7cbd4f17e4dda58d86.tar.gz (94.8 Мб)

Далее распаковываем архив в каталог ~/my-distr/openembedded.

Создание локальной конфигурации

Теперь нам надо создать файл локальной конфигурации

$ cd ~/my-distr/
$ cp openembedded/conf/local.conf.sample build/conf/local.conf

Открываем build/conf/local.conf в редакторе и правим некоторые строки

DL_DIR = "${HOME}/my-distr/downloads"
BBFILES := "${HOME}/my-distr/openembedded/recipes/*/*.bb ${HOME}/my-distr/build/recipes/*/*.bb"
MACHINE = "x86"
DISTRO = "angstrom-2010.x"
IMAGE_FSTYPES = "jffs2 tar.gz"

DL_DIR - указывает путь к каталогу в котором будут храниться скачанные исходники из которых в последствии будут собираться пакеты.
Как видите, я указал 2 каталога для поиска .bb файлов в переменной BBFILES, это сделано потому что в дальнейшем, я планирую делать собственные рецепты для приложений и сами приложения которые будут включаться в мой дистрибутив. Если Вы не планируете включать в дистрибутив собственные приложения, то можно прописать только один путь к стандартным рецептам openembedded.

Переменная MACHINE пока что использована x86, потому что предполагается что нас пока нет SDK для кросс-компиляции. Она описывает нашу аппаратную платформу и, соответственно кросс- или нативный компилятор который должен быть использован при сборке. Описания некоторых платформ вы можете найти в каталоге 'openembedded/conf/machine'.

Переменная DISTRO обозначает некий дистрибутив, в дальнейшем мне нужно будет создать свой собственный дистрибутив и как-то его назвать.Описания некоторых дистрибутивов вы можете найти в каталоге 'openembedded/conf/distro'.

IMAGE_FSTYPES - здесь можно перечислить форматы файлов в которые будет упакован образ файловой системы rootfs. В примере указан тип jffs2 - это файловая система для записи на NAND Flash. Полезный формат tar.gz может использоваться для контроля содержимого rootfs до записи. В файле будет содержаться дерево файловой системы и его можно просмотреть обычным архиватором, чего не скажешь о jffs2.

Еще в конце файла нужно удалить или закомментировать последнюю строку.

REMOVE_THIS_LINE

Настройка окружения

$ export BBPATH=~/my-distr/build:~/my-distr/openembedded
$ export PATH=~/my-distr/bitbake/bin:$PATH

Эти комманды необходимо запускать всякий раз когда вы открываете терминал для работы с bitbake, т.е. для сборки дистрибутива, по-этому их можно прописать в ~/.bashrc, тогда всё будет происходить автоматически при открытии окна терминала или написать небольшой скрипт и запускать его перед началом работы. Скрипт, если Вы пойдете по этому пути, надо запускать следующим образом:

source <путь к вашему скрипту>.sh

или

. <путь к вашему скрипту>.sh

Да да, там точка, пробел.

Пробный запуск

Теперь мы можем попробовать собрать какой-нибудь пакет:

~/my-distr$ bitbake nano
NOTE: Handling BitBake files: - (780/7318) [1 %]

Решение проблем

Когда я запустил сборку указанного выше пакета, то получил такое сообщение:

FATAL:  Openembedded's config sanity checker detected a potential misconfiguration.
	Either fix the cause of this error or at your own risk disable the checker (see sanity.conf).
	Following is the list of potential problems / advisories:

	Please install following missing utilities: texi2html,cvs,svn,gawk,chrpath

Ничего страшного, я просто не установил часть необходимых пакетов, эти пакеты были перечислены в последней строке (svn имеется в виду пакет subversion). После доустановки сборка началась.

~/my-distr$ bitbake nano
NOTE: Handling BitBake files: - (7318/7318) [100 %]
Parsing of 7318 .bb files complete (6892 cached, 426 parsed). 7612 targets, 341 skipped, 0 masked, 0 errors.

Build Configuration:
BB_VERSION        = "1.10.2"
METADATA_BRANCH   = "<unknown>"
METADATA_REVISION = "<unknown>"
TARGET_ARCH       = "i486"
TARGET_OS         = "linux"
MACHINE           = "x86"
DISTRO            = "angstrom"
DISTRO_VERSION    = "2010.7-test-20110221"

NOTE: Resolving any missing task queue dependencies
NOTE: Preparing runqueue
NOTE: Executing runqueue
NOTE: Running task 16 of 734 (ID: 305, virtual:native:/home/d400/my-distr/openembedded/recipes/linux-libc-headers/linux-libc-headers_2.6.31.bb, do_fetch)
FATAL: linux-libc-headers-native-2.6.31: http_://kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.tar.bz2 cannot check archive integrity
ERROR: Error in executing python function in: /home/d400/my-distr/openembedded/recipes/linux-libc-headers/linux-libc-headers_2.6.31.bb
ERROR: Exception:<type 'exceptions.SystemExit'> Message:1
ERROR: Printing the environment of the function
ERROR: Function base_do_fetch failed
ERROR: TaskFailed event exception, aborting
ERROR: Build of virtual:native:/home/d400/my-distr/openembedded/recipes/linux-libc-headers/linux-libc-headers_2.6.31.bb do_fetch failed
NOTE: package linux-libc-headers-native-2.6.31-r6: task do_fetch: Started
ERROR: Task 305 (virtual:native:/home/d400/my-distr/openembedded/recipes/linux-libc-headers/linux-libc-headers_2.6.31.bb, do_fetch) failed with 256
ERROR: 'virtual:native:/home/d400/my-distr/openembedded/recipes/linux-libc-headers/linux-libc-headers_2.6.31.bb' failed
NOTE: The checksums for '/home/d400/my-distr/downloads/linux-2.6.31.tar.bz2' did not match.
Expected MD5: '84c077a37684e4cbfa67b18154390d8a' and Got: '5f812cca015679c602155b64ae5f839b'
Expected SHA256: '0acd83f7b85db7ee18c2b0b7505e1ba6fd722c36f49a8870a831c851660e3512' and Got: '725b43d92c922f907040ffdbae04f08ac8df420e22779df85f9c228d250336f4'
NOTE: Your checksums:
SRC_URI[md5sum] = "5f812cca015679c602155b64ae5f839b"
SRC_URI[sha256sum] = "725b43d92c922f907040ffdbae04f08ac8df420e22779df85f9c228d250336f4"

FATAL: linux-libc-headers-native-2.6.31: http_://kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.tar.bz2 cannot check archive integrity
ERROR: 'virtual:native:/home/d400/my-distr/openembedded/recipes/linux-libc-headers/linux-libc-headers_2.6.31.bb' failed

Если возникают трудности со скачиванием пакетов как в примере выше, вы можете сами их скачать браузером и положить в каталог который мы указали в конфигурации, т.е. 'my-distr/downloads', ссылки на скачивание есть в описании ошибок FATAL, например:

FATAL: linux-libc-headers-native-2.6.31: http_://kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.tar.bz2 cannot check archive integrity

Если доступ в интернет у Вас организован через прокси, то нужно раскомментировать и отредактировать переменные 'http_proxy' и 'ftp_proxy' в файле '/etc/wgetrc' или '~/wgetrc'. Но лично у меня есть патологические проблемы работы ftp через наш корпоративный прокси, причем проблемы только с доступом к ftp.gnu.org, этот FTP я не могу даже через баузер открыть. По-этому для решения этих проблем я исправил переменную

GNU_MIRROR = "http://ftp.gnu.org/gnu"

в файле '/my-distr/openembedded/conf/bitbake.conf'. Правда в некоторых рецептах встречаются прямые ссылки на ftp://ftp.gnu.org, так что либо нужно везде исправить подстроку 'ftp://ftp.gnu.org/gnu' на '${GNU_MIRROR}', иногда встречаются пути 'ftp://ftp.gnu.org/pub' их я просто менял на 'http://ftp.gnu.org/pub', либо просто руками скачать нужные пакеты как я писал выше. Пакеты скачиваются только один раз, т.е. если необходимый пакет уже есть в downloads, то он не будет скачиваться повторно, так что сами выбирайте как поступить в этом случае.

Еще одна частая проблема, которая может возникнуть у пользователей Ubuntu, на этом дистрибутиве ссылка '/bin/sh' указывает на dash, а должна указывать на bash, так что сперва проверьте что всё настроено как надо и, при необходимости, исправьте.

~/my-distr$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep  9 14:23 /bin/sh -> bash

Заключение

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

Чтобы очистить файлы, которые использовались для сборки пакета надо выполнить команду:

~/my-distr$ bitbake -cclean nano

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

В следующей части я планирую осветить вопросы создания собственного Software Development Kit (SDK).

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Установка ОЕ

Добрый день.

А как вы обошли проблему с установкой

psyco, этот же пакет только под 32 разрядную архитектуру а у вас машина 64 и дистрибутив под 64 
Заранее спасибо
С уважением
Зайцев Иван

У меня не было этой проблемы,

У меня не было этой проблемы, потому что установлен 32 разрядный дистрибутив.

~/my-distr$ uname -a
Linux dmitry 2.6.32-5-686 #1 SMP Wed Aug 25 14:28:12 UTC 2010 i686 GNU/Linux

о возможности фреймворка

Пожалуйста объясните, при помощи openenbedded и bitbake возможна ли сборка десктопного  дистрибьютива Линукс. Или для этих целей есть иные средства?

Спасибо. 

Openembedded, конечно заточен

Openembedded, конечно заточен под сборку дистрибутивов встраиваемых систем, но, думаю, что и для десктопа можно собрать дистрибутив. В частности в этой статье тестовая сборка производится под архитектуру x86, т.е., как раз под десктоп. Но, повозиться придется, как впрочем и со специально созданным для этого фреймворкам и сам процесс сборки будет происходить медленнее, т.к. Openembedded сперва собирает toolchain, а уже потом этим toolchain-ом собирает дистрибутив. Это позволяет не зависеть от версии компилятора и библиотек, которые уже установлены на build-машине, но это уже другой вопрос :).

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <p> <span> <s> <strike> <div> <h1> <h2> <h3> <h4> <h5> <h6> <img> <map> <area> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <table> <caption> <tbody> <tr> <td> <em> <b> <u> <i> <strong> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite> <embed> <object> <param> <strike>
  • Использовать как разделитель страниц.

Подробнее о форматировании

CAPTCHA
Введите текст что Вы видите на картинке. Регистр букв не важен.