вторник, 23 июня 2009 г.

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

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

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

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

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

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

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

1.exit
2.mkdir -p ~/stuff/build/conf
3.cd ~/stuff

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

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

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

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

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

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

Note:

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

1.cd ~/stuff/openembedded
2.git pull

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

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

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

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

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

1.REMOVE_THIS_LINE

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

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

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

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

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

1.bitbake helloworld-image

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

01.NOTE: Handling BitBake files: / (6291/6291) [100 %]
02.NOTE: Parsing finished. 6027 cached, 0 parsed, 264 skipped, 0 masked.
03.NOTE: build 200812252310: started
04.
05.OE Build Configuration:
06.BB_VERSION = "1.8.10"
07.METADATA_BRANCH = "org.openembedded.dev"
08.METADATA_REVISION = "5b1ed09b1ab1a60a28a76e4658bc9957cd361b5d"
09.TARGET_ARCH = "i486"
10.TARGET_OS = "linux"
11.MACHINE = "x86"
12.DISTRO = "angstrom"
13.DISTRO_VERSION = "2008.1-test-20081225"
14.TARGET_FPU = ""
15.
16.NOTE: Resolving any missing task queue dependencies
17.NOTE: Preparing runqueue
18.NOTE: Executing runqueue

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

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

1.sudo apt-get install virtualbox

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

1.sudo apt-get install module-assistant
2.sudo m-a prepare
3.sudo m-a a-i virtualbox-ose

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

1.sudo modprobe vboxdrv

Note

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

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

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

1.sudo adduser [your username] vboxusers

Note

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

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

OpenEmbedded в VirtualBox

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

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

openembedded-create-virtualbox-machine

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

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

1.sudo apt-get install syslinux

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

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

Note

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

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

OpenEmbedded в VirtualBox

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

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

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

удаляем.

Note

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

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

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

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

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

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

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

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

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

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

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

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

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

1.prompt 0
2.default linux
3.timeout 5
4.
5.label linux
6.kernel bzImage
7.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 сервер.
Для установки запускаем команду:

1.sudo apt-get install nfs-kernel-server

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

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

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

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

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

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

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

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

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

OpenEmbedded в VirtualBox - Hello World

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

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

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

Комментариев нет:

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