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).

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Установка ОЕ

Добрый день.

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

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-машине, но это уже другой вопрос :).

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <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>
  • Use to create page breaks.

More information about formatting options