Администратор сайта 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 и добавляем туда:
1.
vboxdrv
после чего сохраняем. Теперь при каждой загрузке этот модуль будет подгружаться сам. Осталось добавить себя в группу пользователей vboxusers, чтобы можно было работать с Virtualbox:
1.
sudo adduser [your username] vboxusers
Note
Для вступления в силу изменений потребуется завершить сеанс и войти заново.
Теперь пробуем запустить Virtualbox (у меня находится в разделе стандартные). Если вы увидите нечто такое:
то значит, что virtualbox работаем и можно приступать к созданию виртуальной машины, если нет то необходимо разобраться, что у вас не так.
Для создания новой виртуальной машины нажимаем создать, далее в качестве имени вводим openembedded (на самом деле имя может быть любым, главное чтобы оно не содержало пробелов), в тип ОС указываем Linux 2.6, жмем далее до запроса о виртуальном диске. Тут так же жмем далее, когда выскакивает предупреждение о том, что у нас нет дисков, нажимайте продолжить пока они не потребуются. После этого выведется итог, там жмем готово.
В списках виртуальных машин должна появиться машина openembedded. Выделяем ее и жмем свойства, там выбираем пункт Общие и переключаемся с закладки Основные на закладку Дополнительно. Там меняем порядок загрузки таким образом, чтобы Сеть была включена и была в списке первой. Если что-то не понятно сверьтесь:
Если вы выполнили все верно, то виртуальная машина настроена. Теперь необходимо добавить загрузчик, собрать ядро, установить и настроить 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.
Теперь можно попробовать включить виртуальную машину. Выберите ее в списке и нажмите старт. Если в результате вывелось что-то похожее
значит VirtualBox нашел загрузчик и передал ему управление. Выключаем вируальную машину и переходим к сборке ядра. Для этого потребуется изменить локальную конфигурацию и один из файлов репозитория. Начнем с файла локальной конфигурации local.conf. Добавляем в него строку следующего вида:
1.
FILESPATH =.
"${TOPDIR}/conf/packages/${PN}/${MACHINE}:"
Затем изменяем файл base.bbclass. Он находится в каталоге ~/stuff/openembedded/classes. Открывываем его, ищем строку начинающуюся с:
1.
FILESPATH
удаляем.
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!
А в следующий раз я расскажу как собрать систему состояющую не только из helloworld.
PS: Оригинальные версии использованных материалов: Здравствуй, Мир! Сборка, Здравствуй, Мир! Запуск.
PPS: defconfig файл можно скачать еще здесь.
Комментариев нет:
Отправить комментарий