Jan
08

Собираем собственный дистрибутив Embedded Linux на базе OpenEmbedded

Администратор сайта OpenEmbedded.ru любезно предоставил интереснейшую статью о том, как собрать свой собственный дистрибутив Embedded Linux на базе OpenEmbedded. Судя по качеству материала, проект OpenEmbedded.ru может быть очень интересен разработчикам, использующим Embedded Linux для построения решений. Статья под катом, читаем!

Практически у всех программистов первой программой была Hello, world! Она говорила – Здравствуй, мир! и завершалась. Первый дистрибутив на базе OpenEmbedded будет делать то же самое. Но для этого придется немного попотеть, потребуется следующее:

  • Компьютер с установленным дистрибутивом Linux Ubuntu.
  • Желание установить и умение читать.
  • Интернет канал, желательно безлимитный.

Если у вас есть все требуемое, запускайте терминал. Для начала запустим установку необходимых программного обеспечения:

sudo apt-get install make gcc g++ ccache sed wget cvs \
subversion git-core git coreutils unzip texi2html texinfo \
libsdl1.2-dev docbook-utils gawk python-pysqlite2 \
diffstat help2man libxml2-utils xmlto \
python-psyco

В случае если у вас достаточно быстрый интернет, то установка займет где-то полчаса. Если же нет, то это отнимет больше времеи.

Как только все программы установятся, cоздаем каталог для опытов и переходим в нее:

exit
mkdir -p ~/stuff/build/conf
cd ~/stuff

Далее установливаем bitbake. Для этого с сайта bitbake скачиваем и распаковываем последний релиз:

wget http://download.berlios.de/bitbake/bitbake-1.8.12.tar.gz
tar -xzvf bitbake-1.8.12.tar.gz
mv bitbake-1.8.12 bitbake

Следующим шагом идет получение репозитория OpenEmbedded. Для его получения запускаем:

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

Если вдруг доступен только http (злые админы закрыли интернеты) то пробуем получить его через http:

git clone http://repo.or.cz/r/openembedded.git

Note:

В дальнейшем для обновления репозитария будет достаточно перейти в каталог stuff/openembedded:

cd ~/stuff/openembedded
git pull

Учтите, репозиторий довольно большой, так что качается довольно долго. Когда он скачается, необходимо создать конфигурационный файл сборки. Воспользуемся примером из репозитория:

cd ~/stuff/
cp openembedded/conf/local.conf.sample build/conf/local.conf

Далее откройте файл в редакторе и измените значения следующих переменных:

BBFILES = "${HOME}/stuff/openembedded/packages/*/*.bb"
DL_DIR = "${HOME}/stuff/sources"
DISTRO = "angstrom-2008.1"
MACHINE = "x86"

А в конце файла удалите строку:

REMOVE_THIS_LINE

сохраните файл.
Теперь необходимо настроить окружение. Сначала указываем где у нас находится bitbake

export PATH=${PATH}:${HOME}/stuff/bitbake/bin

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

export BBPATH=${HOME}/stuff/build:${HOME}/stuff/openembedded

И наконец запускаем сборку hello world:

bitbake helloworld-image

Если в результате запуска появилось нечто такое:

NOTE: Handling BitBake files: / (6291/6291) [100 %]
NOTE: Parsing finished. 6027 cached, 0 parsed, 264 skipped, 0 masked.
NOTE: build 200812252310: started

OE Build Configuration:
BB_VERSION        = "1.8.10"
METADATA_BRANCH   = "org.openembedded.dev"
METADATA_REVISION = "5b1ed09b1ab1a60a28a76e4658bc9957cd361b5d"
TARGET_ARCH       = "i486"
TARGET_OS         = "linux"
MACHINE           = "x86"
DISTRO            = "angstrom"
DISTRO_VERSION    = "2008.1-test-20081225"
TARGET_FPU        = ""

NOTE: Resolving any missing task queue dependencies
NOTE: Preparing runqueue
NOTE: Executing runqueue

то можете себя поздравить, bitbake и openembedded установленны правильно. Вам осталось подождать пока bitbake соберет все что необходимо.

Итак, сборка helloworld-image завершена. В результате при помощи OpenEmbedded был собран helloworld и создан образ корневой файловой системы вместе с ним. Осталось только все это запустить, это довольно просто. Для начала устанавливаем Virtual Box:

sudo apt-get install virtualbox

Затем потребуется собрать модуль для virtualbox (возможно, вам не потребуется собирать модуль, так-как в исходных кодах он стал устанавливаться недавно)

sudo apt-get install module-assistant
sudo m-a prepare
sudo m-a a-i virtualbox-ose

и загрузить его

sudo modprobe vboxdrv

Note

Команда sudo m-a a-i virtualbox-ose может сообщить об неудачном завершении. Но на самом деле все что необходимо она выполнила. Если при этом у вас команда sudo modprobe vboxdrv не вывела никаких ошибок при выполнении, то значит все в порядке.

Затем добавляем его в автозагрузку. Для этого открываем /etc/modules и добавляем туда:

vboxdrv

после чего сохраняем. Теперь при каждой загрузке этот модуль будет подгружаться сам. Осталось добавить себя в группу пользователей vboxusers, чтобы можно было работать с Virtualbox:

sudo adduser [your username] vboxusers

Note

Для вступления в силу изменений потребуется завершить сеанс и войти заново.

Теперь пробуем запустить Virtualbox (у меня находится в разделе стандартные). Если вы увидите нечто такое:

OpenEmbedded в VirtualBox

то значит, что virtualbox работаем и можно приступать к созданию виртуальной машины, если нет то необходимо разобраться, что у вас не так.

Для создания новой виртуальной машины нажимаем создать, далее в качестве имени вводим openembedded (на самом деле имя может быть любым, главное чтобы оно не содержало пробелов), в тип ОС указываем Linux 2.6, жмем далее до запроса о виртуальном диске. Тут так же жмем далее, когда выскакивает предупреждение о том, что у нас нет дисков, нажимайте продолжить пока они не потребуются. После этого выведется итог, там жмем готово.
В списках виртуальных машин должна появиться машина openembedded. Выделяем ее и жмем свойства, там выбираем пункт Общие и переключаемся с закладки Основные на закладку Дополнительно. Там меняем порядок загрузки таким образом, чтобы Сеть была включена и была в списке первой. Если что-то не понятно сверьтесь:

openembedded-create-virtualbox-machine

Если вы выполнили все верно, то виртуальная машина настроена. Теперь необходимо добавить загрузчик, собрать ядро, установить и настроить NFS сервер. Начем с загрузчика.

В качестве загрузчика будет использоваться pxelinux из состава syslinux. Устанавливаем его:

sudo apt-get install syslinux

Нужный нам файл pxelinux.0 находится в каталоге /usr/lib/syslinux. Для его установки переходим в каталог ~/.VirtualBox, создаем нем каталог TFTP и копируем туда pxelinux.0:

cd ~/.VirtualBox
mkdir TFTP
cp /usr/lib/syslinux/pxelinux.0 TFTP/openembedded.pxe

Note

Такое странное имя выбрано не спроста. Если вы вспомните называлась виртуальная машина, то заметите что оно совпадает с ее именем. Это необходимо из-за того что VirtualBox обладает встроенными средствами автоконфигурации и загрузки по сети. Для того чтобы он нашел загрузчик, он должен называться имя машины.pxe.

Теперь можно попробовать включить виртуальную машину. Выберите ее в списке и нажмите старт. Если в результате вывелось что-то похожее

OpenEmbedded в VirtualBox

значит VirtualBox нашел загрузчик и передал ему управление. Выключаем вируальную машину и переходим к сборке ядра. Для этого потребуется изменить локальную конфигурацию и один из файлов репозитория. Начнем с файла локальной конфигурации local.conf. Добавляем в него строку следующего вида:

FILESPATH =. "${TOPDIR}/conf/packages/${PN}/${MACHINE}:"

Затем изменяем файл base.bbclass. Он находится в каталоге ~/stuff/openembedded/classes. Открывываем его, ищем строку начинающуюся с:

FILESPATH

удаляем.

Note

Эти действия необходимы для того чтобы конфигурация ядра бралась не из репозитория, а из определенного конфигурацией каталога.

Создаем каталог в котором будет находится файл конфигурации ядра:

mkdir -p ~/stuff/build/conf/packages/linux/x86

Выкачиваем его:

cd ~/stuff/build/conf/packages/linux/x86
wget http://openembedded.ru/wp-content/uploads/2009/01/defconfig

Далее собираем ядро. Для этого переходим в каталог ~/stuff/build и запускаем сборку ядра:

cd ~/stuff/build
export BBPATH="$HOME/stuff/build:$HOME/stuff/openembedded"
bitbake virtual/kernel

Сборка займет где-то полчаса-час в зависимости от мощности вашего компьютера. После ее завершения потребуется скопировать ядро в каталог ~/.VirtualBox/TFT, чтобы его смог найти загрузчик. Далее настроить загрузчик, так чтобы он грузил ядро и настроить NFS сервер, чтобы ядро смогло подключить корневую файловую систему. Начнем с ядра.

Ядро находится в каталоге ~/stuff/build/tmp/deploy/glibc/images/x86 и называется bzImage-x86.bin. Копируем его в ~/.VirtualBox/TFTP:

cd ~/.VirtualBox/TFTP
cp ~/stuff/build/tmp/deploy/glibc/images/x86/bzImage-x86.bin bzImage

Переходим к настройке загрузчика. Создаем каталог pxelinux.cfg (в нем загрузчик ищет файлы конфигурации):

mkdir ~/.VirtualBox/TFTP/pxelinux.cfg
cd ~/.VirtualBox/TFTP/pxelinux.cfg

Далее создаем файл конфигурации default следующего содержания:

prompt 0
default linux
timeout 5

label linux
kernel bzImage
append ip=dhcp root=/dev/nfs nfsroot=192.168.1.100:/var/lib/nfsroot

При этом:

  • 192.168.1.100 это ваш ip адрес (который настроен на вашем компьютере автоматически или в ручную)
  • /var/lib/nfsroot указывает где находится необходимая нам корневая файловая система.

Если вы сейчас попробуете загрузить виртуальную машину, то загрузчик найдет ядро и загрузит его. Ядро запустится, но не найдет корневую файловую систему и перейдет в kernel panic. Чтобы избежать этого необходимо установить и настроить nfs сервер.
Для установки запускаем команду:

sudo apt-get install nfs-kernel-server

затем настраиваем экспорт каталога, где будет находиться корневая файловая система, в /etc/exports. Для этого в файл exports требуется добавить строку следующего вида:

/var/lib/nfsroot        *(ro,insecure,all_squash,no_subtree_check)

В качестве каталога для корневой файловой системы я выбрал /var/lib/nfsroot. Его требуется создать и распаковать туда корневую файловую систему. Сделать это можно следующим образом:

sudo mkdir /var/lib/nfsroot
cd /var/lib/nfsroot
sudo tar -xvf ~/stuff/build/tmp/deploy/glibc/images/x86/helloworld-image-x86.tar

В результате каталог /var/lib/nfsroot будет содержать корневую файловую систему. Проверить все ли в порядке можно при помощи следующей команды:

$ ls -l
итого 4
drwxr-xr-x 2 root root   17 Дек 31 00:50 bin
drwxr-xr-x 2 root root 4096 Дек 31 00:50 dev
drwxr-xr-x 3 root root   42 Дек 31 00:50 etc
drwxr-xr-x 4 root root   26 Дек 31 00:50 usr

Если вы получили аналогичный вывод значит все в порядке.
Запускаем nfs сервер:

sudo /etc/init.d/nfs-kernel-server start

Теперь сновая запускаем виртуальную машину. После того как она включится, должен будет запустится загрузчик, затем он запустит ядро, а ядро подключит по nfs корневую файловую систему и запустит /bin/init который является символической ссылкой на программу helloworld. И в результате вы должны увидеть вот такую картину:

OpenEmbedded в VirtualBox - Hello World

Если вы ее видите, то поздравляю вас. Вы собрали первый дистрибутив на базе OpenEmbedded!
А в следующий раз я расскажу как собрать систему состояющую не только из helloworld.

PS: Оригинальные версии использованных материалов: Здравствуй, Мир! Сборка, Здравствуй, Мир! Запуск.

PPS: defconfig файл можно скачать еще здесь.

Еще интересные посты о программировании для мобильных устройств:

1 Comment

Make A Comment

Comments RSS Feed   TrackBack URL

Leave a comment

Please leave these two fields as-is:

top