- Сборка Embedded Linux от Yocto для QEMU x86 и первое приложение к нему
- Сборка образа Linux
- Средства разработки
- Eclipse, Cross GCC
- Сборка в ADT
- Подготовка сборки
- Настройка Yocto ADT в Eclipse
- Проект Hello, World! в Eclipse c Yocto ADT
- Запуск и отладка из IDE Eclipse
- OpenEmbedded: Часть 1. Установка
- Установка bitbake
- Получение openembedded из репозитория
- Создание локальной конфигурации
- Настройка окружения
- Пробный запуск
- Решение проблем
- Заключение
- Комментарии
- Установка ОЕ
- У меня не было этой проблемы,
- о возможности фреймворка
- Openembedded, конечно заточен
Сборка Embedded Linux от Yocto для QEMU x86 и первое приложение к нему
Эта статья — быстрый старт с картинками для тех, кому нужно собрать Embedded Linux с помощью Yocto.
Если вы собрались собирать Embedded Linux для специфичных аппаратных средств, например, для SoC на FPGA, то, наверное, как и я столкнётесь с проектом Yocto.
Yocto — проект, объединяющий
- инструментарий разработчика;
- систему сборки;
- набор программных интерфейсов;
- коллекцию мета-пакетов, расширяющих возможности платформы;
- плагины для Eclipse и Anjuta.
Я постарался описать процесс так, чтобы вам можно было меньше тратить времени на проблемы с настройкой и подготовкой и поскорее приступить к творчеству.
Сборка образа Linux
Основа для сборки — статья
«Yocto Project Quick Start».
Собирать буду в папке
Небольшое отступление:
Запустив терминал, все команды выполняйте в нём, потому что в ходе работы создаются и используются переменные среды. Если закрыли терминал и открыли новый, то заходите в
и придётся повторять некоторые команды. Например,
создаю репозиторий git
теперь текущая директория
теперь, согласно терминам Yocto, получилось
Source Directory — «poky»
local working area (local branch) — dizzy
Первым делом выполняется
Этой командой настраивается окружение оболочки, создается начальный изменяемый набор файлов конфигурации и осуществляется взаимодействие с окружением выполнения системы BitBake путем использования файла сценария, позволяющего Poky установить, выполняются ли минимальные системные требования. Результат выполнения команды сообщит или о проблемах, например, недостающих пакетах, или о возможности продолжить редактированием файла conf/local.conf.
Здесь следует указать число нитей, которое будет запускать средство сборки bitbake. Чтобы максимально использовать вычислительные возможности, число нитей должно соответствовать числу ядер процессора. Я указал на 1 меньше, чтобы компьютером во время сборки удобнее было пользоваться.
Так же я добавил дополнительные возможности, полезные для разработки.
Так как собираем для стандартной QEMU x86, то остальное можно не изменять.
Далее можно выбрать “рецепт” — вариант сборки со своим набором библиотек, утилит, создаваемых файлов, образов и т.п.
Список рецептов с их краткими описаниями можно посмотреть здесь:
рецепты openembedded-core
пролистайте до рецептов, начинающихся с core-…
Не советую собирать core-image-minimal для ознакомления. Там нет ssh и других удобных для отладки инструментов.
Я выбрал core-image-sato. Это сборка с GUI SATO
Будьте готовы, что ждать завершения сборки придётся, возможно, от 3 часов до 3 и более дней. В счастью, процесс можно приостановить и возобновить.
Чтобы приостановить, нажмите + один (!) раз и подождите, когда завершатся все начатые операции. Иначе, возможно, появятся ошибочки и придётся переделывать. Чтобы возобновить, повторите
Если закрыли терминал, то в новом терминале перед сборкой придётся повторить установку переменных среды:
По завершении сборки можно проверить, что получилось, запустив эмулятор QEMU
Появится окно терминала xterm, там надо будет ввести пароль root хоста для создания интерфейса tap. Там же можно увидеть IP host-машины на tap интерфейсе и IP эмулируемой машины. У меня 192.168.7.1 и 192.168.7.2 соответственно.
Затем, если собран SATO должно появится окно графического интерфейса:
Если запущенный эмулятор мешает, пока его можно закрыть. Полистайте стрелочками в верхней части GUI до появления соответствующей иконки выключения или введите poweroff через терминал SATO или по ssh. Про ssh будет позже.
Не закрывайте QEMU крестиком на главном окошке эмулятора. Закрывайте штатными средствами эмулируемой машины. Иначе у вас в системе от QEMU останутся интерфейсы ethX, tapX, virbrX, которые придётся будет ifconfig… ifdown, или как это делается на вашей ОС. Или каждый раз при запуске QEMU будут новые IP хоста и QEMU, что неудобно.
Средства разработки
Используется Eclipse IDE for C/C++ Developers, версия Luna. В этой сборке имеются плагины CDT, GNU ARM и некоторые другие полезные для кросс-компиляции и разработки встроенного ПО плагины.
Можно скачать отсюда:
Eclipse Luna SR2.
Будем собирать приложения Hello, world!
Eclipse, Cross GCC
Сначала простой путь, соберём обычными средствами Eclipse: CDT + GNU ARM
Если этих плагинов в вашем Eclipse ещё нет, то добавьте плагин CDT из стандартного репозитория Eclipse и отсюда GNU ARM Plugin for Eclipse GNU ARM C/C++ Cross Compiler и что ещё захочется.
Создаём новый проект C++:
Меню Eclipse File->New->Project…->C/C++->C++ Project
Нужно выбрать
Project type: Executable->Hello World C++ Project
Toolchains: Cross GCC
заполните поле Author
Теперь самое важное, что касается системы сборки:
Cross compiller prefix: i586-poky-linux-
Cross compiler path: /home/. /My_Designs/Poky/poky/build/tmp/sysroots/x86_64-linux/usr/bin/i586-poky-linux
Компилируем проект
Project->Build Project
Должен появиться исполняемый файл
Так как компилировали для QEMU x86 Linux, то должен запуститься и на вашей host машине, если, конечно, вы работаете на x86 Linux или совместимой с ней. У меня запустилось на IA64 Ubuntu.
Теперь, если успели закрыть QEMU, то запустите опять
Появится окно терминала xterm, надо будет ввести пароль root для создания tap интерфейса.
Как видно, у меня IP host-машины 192.168.7.1, IP qemu 192.168.7.2
Затем появится окно QEMU с графическим интерфейсом
Можно подсоединиться к QEMU через ssh и sftp. Первый полезен для запуска программы, второй — для отправки этой программы на эмулируемую машину.
Файл я отправлял с помощью файлового менеджера Krusader. В Windows можно использовать FileZilla или другими.
В Krusader я выбрал Tools->New Net Connection…, в диалоговом окне нужно выбрать sftp://, ввести IP и Username: root
В домашнюю папку на QEMU я скопировал исполняемый файл hello_cross_gcc_02 из папки Debug проекта
Далее можно открыть терминал в графическом интерфейсе QEMU и запустить программу на выполнение оттуда. Мне более удобным показалось соединиться через ssh. В окне терминала host-машины запускаем ssh
и запускаем недавно скопированный исполняемый файл:
Должно получиться
Hello World!
Сборка в ADT
Подготовка Eclipse
Делалось на основе этого: Yocto — Настройка Eclipse
В Eclipse нужны плагины из стандартной комплектации:
Linux Tools
- LTTng — Linux Tracing Toolkit
Mobile and Device Development
- C/C++ Remote Launch
- Remote System Explorer End-user Runtime
- Remote System Explorer User Actions
- Target Management Terminal
- TCF Remote System Explorer add-in
- TCF Target Explorer
Programming Languages
- Autotools Support for CDT
- C/C++ Development Tools
И нужно добавить плагин от Yocto. Скачать можно отсюда: Yocto Plugin for Eclipse
Подготовка сборки
Для организации взаимодействия с IDE и средствами разработки, предусмотрены скрипты:
для запуска QEMU плагином Yocto нужен rpcbind
нужно отредактировать файл /etc/default/rpcbind
нужно распаковать root filesystem в ту папку в sysroots, где лежит файловая система эмулируемой машины. В нашем случае qemux86:
Настройка Yocto ADT в Eclipse
В Eclipse меню Windows->Preferences, Yocto Project ADT
Cross Compiler Options
Build system derived toolchain
Toolchain Root Location:
/home/. /Poky/poky/build/
Sysroot Location:
/home/. /Poky/poky/build/tmp/sysroots/qemux86
Target Architecture: i586-poky-linux
Target Options:
QEMU
Kernel: /home/. /Poky/poky/build/tmp/deploy/images/qemux86/bzImage-qemux86.bin
Проект Hello, World! в Eclipse c Yocto ADT
Создаём новый проект
New Project->C++ Project
Project name: hello_qemu_cmake_04
Project type: Yocto Project ADT CMake Project->Hello World C++ CMake Project
Next, Next, Finish
Build project
В папке проекта -> Debug должен получиться hello_qemu_cmake_04
Теперь можно запустить приложение так же как это было с проектом, созданным через Cross GCC за исключением того, что QEMU запускается теперь в Eclipse через меню
Run->External Tools->qemu_i586-poky-linux
Запуск и отладка из IDE Eclipse
Теперь настроим Eclipse так, чтобы можно было запускать и отлаживать приложение прямо из IDE.
Инструкция взята отсюда:
Загрузка и отладка приложения средствами ADT в Eclipse
Для удобства перед настройкой удалённая машина должна быть запущена (Run->External Tools->qemu_i586-poky-linux, как в предыдущем разделе).
Для настройки отладки выбираем в меню Eclipse
Run -> Debug Configurations…
В списке слева нужно отыскать “C/C++ Remote Application”, там должен быть пункт с названием нашего проекта и виртуальной машины. У меня это “hello_qemu_cmake_04_gdb_i586-poky-linux”. Надо его выбрать.
В руководстве от Yocto предлагается указать Remote Absolute File Path for C/C++Application. Но сейчас не самое лучшее время для этого. Удобнее будет сначала настроить связь с удалённой машиной.
А пока в правой области выбираем вкладку Debugger, здесь надо в выпадающем списке Debugger выбрать remote gdb/mi. У меня это единственный элемент списка, но его всё равно нужно выбрать. При этом заполняться некоторые другие поля формы. Debug Configurations — Debugger» data-src=»https://habrastorage.org/files/578/799/303/5787993038a54954bb16b360004daac3.png»/>
Возвращаемся на вкладку Main и создаём соединение.
В разделе Connection выбираем New…. В окне New Connection выбираем TCF. У меня их два. Я не знаю, зачем второй, но выбор первого точно приводит к положительному результату.
Debug Configurations — Main->New Connection» data-src=»https://habrastorage.org/files/28f/05c/dea/28f05cdeade343ae876ee4beaede83be.png»/>
В поле Host name вписываем IP машины в QEMU. Поле Connection name можно оставить заполненным IP. , … Чтобы меньше было возни позже, здесь же можно указать login при соединении. В разделе Connection нажмите Edit… и заполните Default User ID. Логин root.
Debug Configurations — Main->Edit — Properties» data-src=»https://habrastorage.org/files/334/24c/4e6/33424c4e612d48fc95439282cf009346.png»/>
На вкладке Main выбираем только что созданное соединение.
Теперь указываем путь к файлу и имя файла, с которым Eclipse будет загружать отлаживаемое приложение на удалённую машину.
Если QEMU запущен, то можно нажать Browse… и, если с соединением всё в порядке, можно будет посмотреть файловую систему удалённой машины и выбрать место, куда загружать приложение. У вас не обязательно будет такая же картинка, как на скриншоте снизу. Но вот что важно: нужно указать файл. Если вы собираетесь указать папку, в которой нет файла с тем именем, с которым хотите загружать исполняемый файл, то в этим окном вы не ограничитесь. Нажмите и допишите имя файла в окне Debug Configurations.
Debug Configurations — Main->Select remote application file» data-src=»https://habrastorage.org/files/ffc/9c1/3cd/ffc9c13cd54a4f2aaa4a64c05469848e.png»/>
Итог должен получиться примерно такой:
Debug Configurations — Main» data-src=»https://habrastorage.org/files/5bb/ee6/a91/5bbee6a91d3849d7b2e250735bcd4bec.png»/>
Теперь можно нажать .
У меня в окне консоли Eclipse “Remote Shell” было так:
Затем приглашение переключиться в перспективу Debug. Есть смысл согласиться.
Отладчик остановился на строке
Жмём Step Over (F6)
В терминале
Теперь можно писать программу. Пока для QEMU x86.
Источник
OpenEmbedded: Часть 1. Установка
Этим материалом я хочу начать цикл статей посвященный работе с 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 в каталог отличный от того что описан в руководстве, просто мне больше нравится другое название для этого каталога.
Установка bitbake
Далее нам необходимо установить главную утилиту bitbake, с помощью которой производится сборка дистрибутива или отдельных пакетов. Скачиваем с официального сайта последнюю версию и распаковываем ее в каталог который мы создали ранее и где будет производиться наша сборка. На момент написания я использовал bitbake-1.10.2.
После распаковки нужно переименовать каталог bitbake-1.10.2 в bitbake.
Получение openembedded из репозитория
Затем нам нужно скачать openembedded
Но тут меня постигла неудача, git никак не хотел завершить клонирование репозитория, по-этому пришлось руками скачать архив с сайта http://cgit.openembedded.org/cgit.cgi/openembedded/snapshot/openembedded-c8e377aebf7ab50d7af9cb7cbd4f17e4dda58d86.tar.gz (94.8 Мб)
Далее распаковываем архив в каталог
Создание локальной конфигурации
Теперь нам надо создать файл локальной конфигурации
Открываем build/conf/local.conf в редакторе и правим некоторые строки
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.
Еще в конце файла нужно удалить или закомментировать последнюю строку.
Настройка окружения
Эти комманды необходимо запускать всякий раз когда вы открываете терминал для работы с bitbake, т.е. для сборки дистрибутива, по-этому их можно прописать в
/.bashrc, тогда всё будет происходить автоматически при открытии окна терминала или написать небольшой скрипт и запускать его перед началом работы. Скрипт, если Вы пойдете по этому пути, надо запускать следующим образом:
Да да, там точка, пробел.
Пробный запуск
Теперь мы можем попробовать собрать какой-нибудь пакет:
Решение проблем
Когда я запустил сборку указанного выше пакета, то получил такое сообщение:
Ничего страшного, я просто не установил часть необходимых пакетов, эти пакеты были перечислены в последней строке (svn имеется в виду пакет subversion). После доустановки сборка началась.
Если возникают трудности со скачиванием пакетов как в примере выше, вы можете сами их скачать браузером и положить в каталог который мы указали в конфигурации, т.е. ‘my-distr/downloads’, ссылки на скачивание есть в описании ошибок FATAL, например:
Если доступ в интернет у Вас организован через прокси, то нужно раскомментировать и отредактировать переменные ‘http_proxy’ и ‘ftp_proxy’ в файле ‘/etc/wgetrc’ или ‘
/wgetrc’. Но лично у меня есть патологические проблемы работы ftp через наш корпоративный прокси, причем проблемы только с доступом к ftp.gnu.org, этот FTP я не могу даже через баузер открыть. По-этому для решения этих проблем я исправил переменную
в файле ‘/my-distr/openembedded/conf/bitbake.conf’. Правда в некоторых рецептах встречаются прямые ссылки на ftp://ftp.gnu.org, так что либо нужно везде исправить подстроку ‘ftp://ftp.gnu.org/gnu’ на ‘$
Еще одна частая проблема, которая может возникнуть у пользователей Ubuntu, на этом дистрибутиве ссылка ‘/bin/sh’ указывает на dash, а должна указывать на bash, так что сперва проверьте что всё настроено как надо и, при необходимости, исправьте.
Заключение
При первом запуске сборка идет довольно долгое время, счет идет на часы, потому я не стал на этом этапе дожидаться окончания процесса, потому что в дальнейшем я буду работать с архитектурой ARM.
Чтобы очистить файлы, которые использовались для сборки пакета надо выполнить команду:
Правда при сборке у нас создался каталог ‘tmp’ довольно приличного размера, это распакованные пакеты. На этом этапе их тоже можно удалить.
В следующей части я планирую осветить вопросы создания собственного Software Development Kit (SDK).
Комментарии
Установка ОЕ
А как вы обошли проблему с установкой
У меня не было этой проблемы,
У меня не было этой проблемы, потому что установлен 32 разрядный дистрибутив.
о возможности фреймворка
Пожалуйста объясните, при помощи openenbedded и bitbake возможна ли сборка десктопного дистрибьютива Линукс. Или для этих целей есть иные средства?
Openembedded, конечно заточен
Openembedded, конечно заточен под сборку дистрибутивов встраиваемых систем, но, думаю, что и для десктопа можно собрать дистрибутив. В частности в этой статье тестовая сборка производится под архитектуру x86, т.е., как раз под десктоп. Но, повозиться придется, как впрочем и со специально созданным для этого фреймворкам и сам процесс сборки будет происходить медленнее, т.к. Openembedded сперва собирает toolchain, а уже потом этим toolchain-ом собирает дистрибутив. Это позволяет не зависеть от версии компилятора и библиотек, которые уже установлены на build-машине, но это уже другой вопрос :).
Источник